从官网 https://apache.org/dist/zookeeper/zookeeper-3.5.5/ 上下载zk(注意windows也是下载 tar.gz后解压),./conf下有个zoo_sample.cfg
复制到同目录下改名为zoo.cfg
,在目录下新建data和log文件夹,修改zoo.cfg中的 dataDir 和 dataLogDir
为 data和log的路径。现在启动zk,在bin目录下有个zkServer.cmd
,运行启动。启动ZK客户端对ZK进行简单的读写操作,在bin目录下打开cmd,运行:
./zkCli.cmd 127.0.0.1:2181
zookeeper
是基于观察者模式设计的分布式服务管理框架,它负责存储和管理比较重要的分布式数据并通知观察者数据的变化状态,直白的说zookeeper是一个数据存储加消息通知系统。zookeeper的应用场景有:
zk的特性:
zookeeper的数据结构整体上一棵树,每个节点被称作ZNode
,每个ZNode默认存储1MB的数据,每个ZNode 都可以通过路径唯一标识。ZNode共有四种类型:
在ZK的安装包中有一个ZK客户端,启动ZK客户端可在其中输入相应的指令来操作ZK,下面对这些指令做简单介绍:
指令 | 描述 |
---|---|
help | 显示所有操作命令 |
ls path [watch] | 查看当前节点内容 |
ls2 path [watch] | 查看当前节点数据并能看到更新次数等数据 |
create | 不带参数创建普通持久节点,-s 创建持久顺序节点 -e 创建临时节点,-s -e 创建 临时顺序节点 |
get path [wathc] | 获取节点值 |
set path | 给节点赋值 |
stat path | 查看节点状态 |
delete path | 删除节点 |
rmr | 递归删除节点 (参考rm-rf) |
操作示例:
# 连接zk
./zkCli.sh -server master 2181
# 列出 / 下的节点
ls /
# 创建节点
create /zk-test "123"
create -s /zk-test “test123”
create -e /zk-test123 "test1234"
# 删除节点
delete /zk-test
# 获取节点
get /zk-123
#更新节点
set /zk-123 "d"
示例:
tickTime=2000
dataDir=E:/zookeeper/zookeeper-3.4.8 - colony/zookeeper-1/tmp/zookeeper/
clientPort=2181
initLimit=10
syncLimit=5
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
配置项说明: 简单列举,详细参考 http://www.aboutyun.com/forum.php?mod=viewthread&tid=13909
Zab协议 的全称是 Zookeeper Atomic Broadcast (Zookeeper原子广播)。ZAB协议定义了 选举(election)、发现(discovery)、同步(sync)、广播(Broadcast) 四个阶段; 选举阶段就是选举出leader。发现阶段follower节点向准leader推送自己的信息,接受准leader的newEpoch指令,检查newEpoch有效性,如果校验没有问题则正式进入一个新的leader统治时期(epoch)。同步阶段将Follower与Leader的数据进行同步,由Leader发起同步指令,最终保持集群数据的一致性;广播阶段,leader发起广播,Follower开始提交事务。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。zxid是一个64位的数字,它高32位用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的标识,代表当前leader,低32位用于递增计数。 在ZK集群中,Server有三种状态:
当ZK的server挂掉半数以上,leader就认为集群不能再正常工作了;所以ZK集群一般为奇数个。
ZK集群中每个Server启动,首先会投自己一票,然后向外对其他ZK发送报文,如果有响应则互相交换投票结果,如果结果无法确定leader是谁则继续投票。投票规则是优先投票给id最大的server,且不能重复投某个server。因此一个server若想做leader,它的id要足够大(通过配置文件配置),而且还有尽快和其他server建立通讯。
当客户端提交事务请求时Leader节点为每一个请求生成一个Proposal(提案),将其发送给集群中所有的Follower节点,收到过半Follower的反馈后开始对事务进行提交;只需要得到过半的Follower节点反馈Ack(同意)就可以对事务进行提交;过半的Follower节点反馈Ack 后,leader发送commit消息同时自身也会完成事务提交,Follower 接收到 commit 消息后,会将事务提交。
Follower必须保证事务的顺序一致性的,也就是说先被发送的Proposal必须先被;消息广播使用了TCP协议进行通讯所有保证了接受和发送事务的顺序性。广播消息时Leader节点为每个Proposal分配一个全局递增的ZXID(事务ID),每个Proposal都按照ZXID顺序来处理。
如果我们连接上某个zk发送一个写请求,如果这个zk不是Leader,那么它会把接受到的请求进一步转发给Leader,然后leader就会执行上面的广播过程。而其他的zk就能同步写数据,保证数据一致。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。