Zookeeper
阅读数:219 评论数: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内存溢出,这个请求堆积数还是需要限制下的。 |
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选举过程中投票通信。 |
group.x=nnnnn[:nnnnn]weight.x=nnnnn |
对机器分组和权重设置 |
cnxTimeout |
Leader选举过程中,打开一次连接的超时时间,默认是5s。(Java system property: zookeeper. cnxTimeout ) |
zookeeper.DigestAuthenticationProvider |
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
- 选举线程由当前Server发起选举的线程担任,其主要功能是对投票进行统计,并选出推荐的Server。
- 选举线程首先向所有Server发起一次询问(包括自己)。
- 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获得对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中。
- 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server。
- 线程将当前zxid最大的Server设置 为当前Server要推荐的Leader,如果Server获得n/2+1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置成自己的状态,否则,继续这个过程,直到leader被选举出来。
(2)fast paxos
- 首先所有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)的请求并判断请求类型,根据消息类型,进行不同的处理。
- PING,指Learner的心跳信息。
- REQUEST,Follower发送的提议消息,包括写请求及同步请求。
- ACK,Follower对提议的回复,超过半数的Follower通过,则commit该提议。
- 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:能设置权限