@@ -81,10 +81,10 @@ ZooKeeper是一个分布式的,开放源码的分布式协调服务,是Googl
8181
8282LOOKING:寻找Leader状态,处于该状态需要进入选举流程
8383LEADING:领导者状态,处于该状态的节点说明是角色已经是Leader
84- FOLLOWING:跟随者状态,表示Leader已经选举出来,当前节点角色是follower
85- OBSERVER:观察者状态,表明当前节点角色是observer
84+ FOLLOWING:跟随者状态,表示Leader已经选举出来,当前节点角色是Follower
85+ OBSERVER:观察者状态,表明当前节点角色是Observer,Observer节点不参与投票,只负责同步Leader状态
8686
87- # # 数据模型
87+ # # Zookeeper数据模型
8888
8989- Zookeeper的数据结构非常类似于文件系统。是由节点组成的树形结构。不同的是文件系统是由文件夹和文件来组成的树,而Zookeeper中是由Znode来组成的树。每一个Znode里都可以存放一段数据,Znode下还可以挂载零个或多个子Znode节点,从而组成一个树形结构。
9090- 节点类型
@@ -93,39 +93,44 @@ OBSERVER:观察者状态,表明当前节点角色是observer
9393 - 临时节点:一个客户端连接创建的临时节点,会在当客户端会话结束时立即自动删除。
9494 - 持久节点:创建出来后只要不删除就不会消失,无论客户端是否连接。
9595
96- # # 常见客户端Shell操作
96+ # # 常用Shell操作
9797
9898- 连接zookeeper客户端
99- ` bin/zkCli.sh [-server ip:port]` # 如不指定ip、port,则默认连接本机的ZkServer
100- - 列出:
101- ` ls path [watch]` # 列出所有数据节点
102- - 创建:
103- ` create [-s] [-e] path data acl` # 创建数据节点
104- -s表示顺序节点 -e表示临时节点
105- --acl 指定权限控制
106- - 获取:
99+ ` bin/zkCli.sh [-server ip:port]`
100+ - 列出节点:
101+ ` ls path [watch]`
102+ - 创建节点:
103+ ` create [-s] [-e] path data acl`
104+ - 获取节点:
107105 ` get path [watch]`
108- - 更新:
109- ` set path data [version]` # data 为要更新的内容 version指定要基于哪个版本的数据进行更新
110- - 删除:
111- ` delete path [version]` # path 为要删除的路径 version指定要基于哪个版本进行删除
112- --注意,要删除的节点下必须没有子节点
106+ - 更新操作:
107+ ` set path data [version]`
108+ - 删除操作:
109+ ` delete path [version]`
113110
114111# # Zookeeper原理
115112
116- - 为了保证Zookeeper集群数据一致性,由leader节点负责决策,其他follower节点负责投票 。
117- - 某一时刻集群里只能有且仅有一个leader 。
118- - leader可以执行增删改和查询操作,而follower只能进行查询操作 。
119- - 所有的更新操作都会被转交给leader来处理,leader批准的任务,再发送给follower去执行来保证和leader的一致性 。
120- - 由于网络是不稳定的,为了保证任务顺序的一致,所有的任务都被赋予一个事务id(zxid)它代表了提案的整体顺序。zxid由两部分组成:周期(epoch)和计数器(counter)。在当前的实现中zxid是一个64位整数,高32位为epoch,低32位为counter,因此zxid也可以记为一个整数对(epoch, count)。epoch的值代表leader的改变,每当选举产生一个新的leader就会生成一个它独有的epoch编号 。ZooKeeper使用了一种简单的算法将一个唯一的zxid赋给提案:leader对每个提案只是简单地递增zxid以得到一个唯一的zxid值。Leader激活算法会保证只有一个leader使用一个特定的epoch ,因此这个简单的算法可以保证每个提案都有一个唯一的id。
121- - 当集群内的节点过半通过,leader就可以认为一个客户端请求提案通过
113+ - 为了保证Zookeeper集群数据一致性,由Leader节点负责决策,其他Follower节点负责投票 。
114+ - 某一时刻集群里只能有且仅有一个Leader 。
115+ - Leader可以执行增删改和查询操作,而Follower只能进行查询操作 。
116+ - 所有的更新操作都会被转交给Leader来处理,Leader批准的任务,再发送给Follower去执行来保证和Leader的一致性 。
117+ - 由于网络是不稳定的,为了保证任务顺序的一致,所有的任务都被赋予一个事务id(zxid)它代表了提案的整体顺序。zxid由两部分组成:周期(epoch)和计数器(counter)。在当前的实现中zxid是一个64位整数,高32位为epoch,低32位为counter,因此zxid也可以记为一个整数对(epoch, count)。epoch的值代表Leader的改变,每当选举产生一个新的Leader就会生成一个它独有的epoch编号 。ZooKeeper使用了一种简单的算法将一个唯一的zxid赋给提案:Leader对每个提案只是简单地递增zxid以得到一个唯一的zxid值。Leader激活算法会保证只有一个Leader使用一个特定的epoch ,因此这个简单的算法可以保证每个提案都有一个唯一的id。
118+ - 当集群内的节点过半通过,Leader就可以认为一个客户端请求提案通过
122119
123- # # 选举机制和Zab原子广播
120+ # # 原子广播
124121
125- Zookeeper是通过选举产生Leader。。。
122+ Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有恢复模式和广播模式两种模式。当服务启动或者在Leader崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server的完成了和Leader的状态同步以后,恢复模式就结束了。
123+ 当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server的完成了和Leader的状态同步以后,恢复模式就结束了。状态同步保证了Leader和server具有相同的系统状态。
124+ 当Leader和多数的Follower进行了状态同步后,就进入了广播状态。此时当一个Server加入Zookeeper,它会在恢复模式下启动,发现Leader并和Leader进行状态同步。同步完成后,它也参与消息广播。Zookeeper服务一直维持在Broadcast状态,直到Leader崩溃或者Leader失去了大部分的Follower支持。
126125
126+ # # 选主流程
127127
128+ 上文已说当Leader崩溃或者Leader失去大多数的follower时,Zookeeper处于恢复模式,在恢复模式下需要重新选举出一个新的Leader,让所有的 Server都恢复到一个正确的状态。Zookeeper的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。
128129
129- # # 过半同意机制
130+ Basic paxos:当前Server发起选举的线程,向所有Server发起询问,选举线程收到所有回复,计算zxid最大Server,并推荐此为Leader,若此提议获得n/2+1票通过(过半同意),此为Leader,否则重复上述流程,直到Leader选出。
130131
131- 当只有leader或少数机器批准执行某个任务时,则极端情况下leader和这些少量机器挂掉,则无法保证新leader知道之前已经批准该任务,这样就违反了数据可靠性。所以leader在批准一个任务之前应该保证集群里大部分的机器知道这个提案,这样即使leader挂掉,选举出来的新leader也会从其他follower处获取这个提案。而如果leader要求所有follower都同意才执行提案也不行,此时若有一个机器挂掉,leader就无法继续工作,这样的话整个集群相当于单节点,无法保证可靠性
132+ Fast paxos:某Server首先向所有Server提议自己要成为Leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。(即提议方解决其他所有epoch和 zxid的冲突,即为Leader)。
133+
134+ # # 过半同意
135+
136+ 当只有Leader或少数机器批准执行某个任务时,则极端情况下Leader和这些少量机器挂掉,则无法保证新Leader知道之前已经批准该任务,这样就违反了数据可靠性。所以Leader在批准一个任务之前应该保证集群里大部分的机器知道这个提案,这样即使Leader挂掉,选举出来的新Leader也会从其他Follower处获取这个提案。而如果Leader要求所有Follower都同意才执行提案也不行,此时若有一个机器挂掉,Leader就无法继续工作,这样的话整个集群相当于单节点,无法保证可靠性
0 commit comments