转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
http://blog.youkuaiyun.com/luyee2010/article/details/8206113
http://cailin.iteye.com/blog/2014486/
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
ZooKeeper的工作原理
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
伪集群的方式安装和配置详解
Zookeeper的配置文件在conf目录下,这个目录下有zoo_sample.cfg和 log4j.properties,需要做的就是将zoo_sample.cfg改名为zoo.cfg,因为Zookeeper在启动时会找这个文件作为默认配置文件。1. 将zoo_sample.cfg 拷贝3分 zoo1.cfg,zoo2.cfg,zoo3.cfg (windows中直接用zkServer.cmd start xx.cfg貌似不成功,需要用zkServer.cmd,因此我是用了三份zookeeper-3.4.6)
# Basic Configuration
tickTime=2000
clientPort=2282
dataDir=/data1/zero/workspace/zookeeper/2282/data
dataLogDir=/data1/zero/workspace/zookeeper/2282/data-logs
# Cluster Options
initLimit=5
syncLimit=2
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
配置文件中各个配置项的意义:tickTime:这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,zookeeper中使用的基本时间单位,单位毫秒。
clientPort:客户端连接Zookeeper服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
dataDir:保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataLogDir: 保存日志文件的目录, 如果没有设置该参数, 将使用dataDir。
initLimit:集群中的follower与leader之间初始连接时能容忍的最多心跳数(tickTime的数量)。该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s。当超过5个tickTime时间后,表明连接失败。
syncLimit:标识Leader与Follower之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
server.A=B:C:D: (server.服务器编号=服务器地址:LF通信端口:选举端口),A是一个数字,表示这个是第几号服务器;B是这个服务器的ip地址;C表示的是这个服务器与集群中的Leader服务器交换信息的端口;D表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
2. 除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir目录下,这个文件里面就有一个数据就是A的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个server。
ZooKeeper命令
在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作启动ZK服务: sh bin/zkServer.sh start (也可以zkServer.sh start myzoo.cfg 指定配置文件)
查看ZK服务状态: sh bin/zkServer.sh status
停止ZK服务: sh bin/zkServer.sh stop
重启ZK服务: sh bin/zkServer.sh restart
日志清理: sh bin/zkCleanup.sh -n 20 #只保留最新的20个日志文件
使用 zkCli.sh -server 127.0.0.1:2181 连接到ZooKeeper服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。
1. 显示根目录、文件: ls / 或 ls2 /
2. 创建文件,并设置初始内容: create /zk "test" 创建一个新的znode节点“ zk ”以及与它关联的字符串
3. 获取文件内容: get /zk
4. 修改文件内容: set /zk "zkbak"
5. 删除文件: delete /zk
6. 退出客户端: quit
7. 帮助命令: help
自动清理日志
从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置autopurge.snapRetainCount和autopurge.purgeInterval这两个参数能够实现定时清理了。
autopurge.purgeInterval:指定清理频率,单位是小时,默认是0,表示不开启自动清理功能。
autopurge.snapRetainCount:和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。