Zookeeper

阅读数:175 评论数:0

跳转到新版页面

分类

应用软件

正文

一、Zookeeper介绍

它是一个分布式的、开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源实现。

二、配置zookeeper的日志

zookeeper日志默认生成的zookeeper.log文件会在$ZOOCFGDIR/bin下,并且文件会无限增大,时间久了会严重占用磁盘空间,并且一直处于增长,并没有控制机制,所以要合理的配合zookeeper.out日志输出。

主要修改$ZOOCFGDIR/bin/zkEnv.sh文件。

if ["x${ZOO_LOG_DIR}"="x"]
then
ZOO_LOG_DIR="."
fi
if ["x${ZOO_LOG_DIR}"="x"]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
fi
修改为
if ["x${ZOO_LOG_DIR}"="x"]
then
ZOO_LOG_DIR="$ZOOBINDIR/../logs"
fi
if ["x${ZOO_LOG_DIR}"="x"]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

三、zoo.cfg参数说明

参数名

说明

clientPort

客户端连接server的端口,即对外服务端口,一般设置为2181吧。

dataDir

存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。

tickTime

ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。

dataLogDir

事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能。 

globalOutstandingLimit

最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。  
(Java system property:zookeeper.globalOutstandingLimit. )

preAllocSize

预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。(Java system property:zookeeper.preAllocSize )

snapCount

每进行snapCount次事务日志输出后,触发一次快照(snapshot), 此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)(Java system property:zookeeper.snapCount )

traceFile

用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能。(Java system property:? requestTraceFile )

maxClientCnxns

单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。

clientPortAddress

对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听 clientPort 指定的端口。  New in 3.3.0

minSessionTimeoutmaxSessionTimeout

Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 *  tickTime ~ 20 * tickTime 这个范围 New in 3.3.0

fsync.warningthresholdms

事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。(Java system property:  fsync.warningthresholdms )New in 3.3.4

autopurge.purgeInterval

在上文中已经提到,3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。(No Java system property)  New in 3.4.0

autopurge.snapRetainCount

这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。(No Java system property)  New in 3.4.0

electionAlg

在之前的版本中, 这个参数配置是允许我们选择leader选举算法,但是由于在以后的版本中,只会留下一种“TCP-based version of fast leader election”算法,所以这个参数目前看来没有用了,这里也不详细展开说了。(No Java system property)

initLimit

Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。(No Java system property)

syncLimit

在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。(No Java system property)

leaderServes

默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的性能。(Java system property: zookeeper. leaderServes )。

server.x=[hostname]:nnnnn[:nnnnn]

这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。  
(No Java system property)

group.x=nnnnn[:nnnnn]weight.x=nnnnn

对机器分组和权重设置

cnxTimeout

Leader选举过程中,打开一次连接的超时时间,默认是5s。(Java system property: zookeeper.  cnxTimeout )

zookeeper.DigestAuthenticationProvider
.superDigest

ZK权限设置相关,

skipACL

对所有客户端请求都不作ACL检查。如果之前节点上设置有权限限制,一旦服务器上打开这个开头,那么也将失效。(Java system property:  zookeeper.skipACL )

forceSync

这个参数确定了是否需要在事务日志提交的时候调用 FileChannel .force来保证数据完全同步到磁盘。(Java system property: zookeeper.forceSync )

jute.maxbuffer

每个节点最大数据量,是默认是1M。这个限制必须在server和client端都进行设置才会生效。(Java system property: jute.maxbuffer )

四、Zookeeper文件系统

每个子目录项如NameService都被称为znode,和文件系统一样,我们能自由的增加、删除znode,在一个znode下增加、删除子znode,znode是可以存储数据的。

1、有四种类型的znode:

(1)persistent-持久化目录节点

客户端与zookeeper断开连接后,该节点依旧存在。

(2)persistent_sequential-持久化顺序编号目录节点

客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给节点名称进行顺序编号。

(3)ephemeral-临时目录节点

客户端与zookeeper断开连接后,该节点被删除。

(4)ephemeral_sequential-临时顺序编号目录节点

客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

五、Zookeeper集群管理

所谓集群管理无在乎两点:是否有机器退出和加入、选举master。

(1)对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与zookeeper的连接断开,其所创建的目录节点被删除,所有其他机器都收到通知。新机器加入也是类似的。

(2)对于第二点,只要所有机器所创建的节点是有顺序的,每次选取编号最小的机器作为master就好。

5、Zookeeper分布锁

锁服务可以分为两类:一个是保持独占,另一个是控制时序。

(1)保持独占

我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建/distribute_lock节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock节点就释放。

(2)控制时序

/distribute_lock已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。

6、Zookeeper队列管理

(1)同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。

在约定目录下创建临时目录节点,监听节数目是否是我们要求的数目。

(2)FIFO队列

入列有编号,出列按编号 。

7、分布式与数据复制

(1)写主

对数据的修改提交给指定的节点,读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离。

(2)写任意

对数据的修改可提交给任意的节点。

对于Zookeeper,它采用的方式是写任意。对于写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因)。

8、Zookeeper角色描述

Leader:负责进行投票的发起和决议,更新系统状态。

Follower:用于接收客户端请求并向客户端返回结果,在选主过程中参与投票。

ObServer:可以接收客户端连接,将写请求转发给Leader节点。但不参加投票过程.

9、Zookeeper工作原理

核心是原子广播,这个机制保证了种个Server之间的同步。实现这个机制的协议叫到Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者领导者崩溃后,Zab就进入恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。

为了保证事务的顺序一致性,Zookeeper采用递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现zxid是一个64位的数字,字高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个Leader的统治时期,低32位用于递增计数。

10、选主流程

ZK的选举算法有两种:一种基于basic paxos实现的,别外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos

(1)basic paxos

  1. 选举线程由当前Server发起选举的线程担任,其主要功能是对投票进行统计,并选出推荐的Server。
  2. 选举线程首先向所有Server发起一次询问(包括自己)。
  3. 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获得对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中。
  4. 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server。
  5. 线程将当前zxid最大的Server设置 为当前Server要推荐的Leader,如果Server获得n/2+1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置成自己的状态,否则,继续这个过程,直到leader被选举出来。

(2)fast paxos

  1. 首先所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid冲突,并接受对方的提议,然后向对方发送提议完成的消息,重复这个流程,最后一定能选举出Leader。

11、同步流程

选完Leader以后,zk就进入状态同步过程。

(1)Leader等待server连接。

(2)Follower连接leader,将最大的zxid发送给leader。

(3)Leader根据follower的zxid确定同步点。

(4)完成同步后通知follower已经成为uptodate状态。

(5)Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。

12、Leader的工作流程

(1)恢复数据。

(2)维持与Learner的心跳,接收learner(follower,observer)的请求并判断请求类型,根据消息类型,进行不同的处理。

  1. PING,指Learner的心跳信息。
  2. REQUEST,Follower发送的提议消息,包括写请求及同步请求。
  3. ACK,Follower对提议的回复,超过半数的Follower通过,则commit该提议。
  4. REVALIDATE,用来延长session有效时间。

13、Follower的工作流程

ollower的消息循环处理如下几种来自Leader的消息:

(1)PING消息:心跳消息。

(2)PROPOSAL消息:Leader发起的提案,要求Follower投票。

(3)COMMIT消息:服务器端最新一次提案,要求Follower投票。

(4)UPTODATE消息:表示同步完成。

(5)REVALIDATE消息:根据Leader的REVALIDATE结果,关闭revalidate的session还是允许其接受消息。

(6)SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

14、常用命令

(1)启动ZK服务:bin/zkServer.sh start

(2)查看ZK服务状态: bin/zkServer.sh status

(3)停止ZK服务: bin/zkServer.sh stop

(4)重启ZK服务:bin/zkServer.sh restart

(5)连接服务器:zkCli.sh -server 127.0.0.1:2181

(6)查看根目录: ls /

(7)创建testnode节点,关联字符串“zz” create /zk/testnode "zz"

(8)查看节点内容 get /zk/testnode

(9)设置节点内容 set /zk/testnode abc

(10)删除节点 delete /zk/testnode

使用zkCli.sh连接成功后,输入help之后,屏幕会输出可用的Zookeeper命令。输入quit退出客户端。

15、acl超级用户

总体来说,ZK的节点有5种操作权限:

CREATE、READ、WRITE、DELETE、ADMIN也就是增、删、改、查、管理权限,这5种权限简写为crwda。

delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。

使用超级用户模式,可以通过zookeeper的zookeeper.DigestAuthenticationProvider.superDigest参数开启。

在zkServer.sh配置启动参数:

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:g9oN2HttPfn8MMWJZ2r45Np/LIA=" \

重新启动zookeeper服务

zkServer.sh restart

使用刚才设置的用户名就可以访问任意节点了及操作。

 

提醒,操作完成后,最好把zkServer.sh文件还原了,以免出安全问题。

16、根据用户名密码生成digest

java -cp zookeeper-3.4.6.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.16.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider user:password

17、acl控制

ACL仅针对一个特定的节点,不适用于子节点,例如:如果/app只对ip:172.16.16.1可读,而/app/status是对任何人可读,acl不是递归的。

ACL是由scheme:expression,perms构成,例如:

ip:19.2.0.0./16, READ

(1)zookeeper内置schemas:

  • world:有个唯一的id,anyone,代表所有人。
  • auth:不使用任何id,代表任何已认证的用户
  • digest:用username:password字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password来进行的,当用在ACL时,表达式为username:base64,base64是password的SHA1接要的编码。
  • ip:使用客户羰的主机IP作为ACL ID,这个ACL表达式的格式为addr/bits,此时addr中的有效们与客户端addr中的有效位进行对比。

(2)权限

  • CREATE:能创建子节点
  • READ:能获取节点数据和列出其子节点
  • WRITE:能设置节点数据
  • DELETE:能删除子节点
  • ADMIN:能设置权限

 

 




相关推荐

一、简介 zookeeper支持某些特定的四字命令与其交互,它们大多数是查询命令,客户端可以通过telnet或nc向zookeeper提交相应的命令。 二、配置

一、简介 在zoo.cfg中可以通过dataDir和dataLogDir配置快照和事务日志存放的路径,但是这些文件都是二进制的文件,无法直接查看。 二、查看快照

一、准备工作 1、安装jdk 参考:http://1024s.top/blog/detail?blogId=42577 二、安装单机zookeeper 1、下载 https://mirrors.tun