本文ZooKeeper版本3.7.0
使用树形存储节点信息,类似Linux文件系统。
每一个存储节点对应一个Znode节点,每个Znode节点默认存储1MB数据。
Znode包含ACL权限控制,修改/访问时间,最后一次操作的事物ID等等。
对Znode节点修改保证顺序和原子性。
节点分类
持久节点 : create /xxx
持久顺序节点 : create -s /xxx
临时节点 : create -e /xxx
临时顺序节点 : create -e -s /xxx
超时节点 : create -t /xxx
超时顺序节点 : create -t -s /xxx
容器节点 : create -c /xxx
可以对节点的变更进行监听
监听节点事件:添加,删除,修改,子节点变化
一次监听事件,只会触发一次,如果想要监听到znode的第二次变更,需要重新注册监听。
zk节点角色:Leader节点与Learner节点(Folloer节点,Observer节点)
集群中只有一个Leader节点,进行写请求
每次写都会生成全局唯一ID(64位整数)
Learner节点单独处理读请求,转发写请求
Leader节点挂掉,冲Follower节点中通过选举出一个Leader.
Follwer节点与Observer节点区别是不参与选举和提议事物过半处理
集群通常奇数个节点部署
数据一致性(zab协议-原子广播协议)
类似2PC提交。
Leader包装写请求,生成zxid,广播给所有Follower。
Follower节点收到提议,写入本地事务日志,回应是否同意事务提交
Leader收到过半的Follow同意,自己先添加事务,然后对所有的Learner节点发送提交事务请求。
1.Follower节点第一次投票先投自己,然后将自己的选票广播给剩余的Follower节点。
2.Follower节点接收到其他的选票。
3.选票比较:比较自己的与接收的选票的投票更有。
4.如果自己的选票不是最优选票,变更自己的选票,投最优选票的节点。
5.统计自己收到的选票,如果某个节点获得了过半的节点的投票。确认该节点为新的Leader节点。
6.确认Leader节点后,每个节点变更自己的角色。完成投票选举。
选举原则:谁的数据最新,谁就有优先被选为Leader的资格。
使用临时顺序节点
client判断当前节点顺序号,是否最小,最小获取锁
其他client注册监听,比它小一个的节点, 保证获取锁的顺序
锁释放,删除节点
其他client监听到,重新获取锁
使用临时节点
zk保证数据节点唯一性,创建成功的client为master
非master,在已创建的节点上注册节点删除事件监听
当master宕机后,其他节点收到节点删除事件,重新选举
其他
(1)集群统一配置管理
(2)集群统一命名服务
(3)集群统一管理
(4)服务器的动态上下线感知
(5)负载均衡
./zkCli.sh -server host:port
create
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
-s : sequential node
-e : ephemeral node
-c : container node, singe V3.5.3, 子节点清空,容器节点也会被zookeeper删除。定时任务默认60s 检查一次
-t : ttl node, set zookeeper.extendedTypesEnabled=true
https://zookeeper.apache.org/doc/current/zookeeperCLI.html
ACL控制参考:zookeeper的ACL权限控制
https://zookeeper.apache.org/doc/r3.7.0/zookeeperAdmin.html#sc_zkMulitServerSetup
https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_adminserver_config
来源:https://www.jianshu.com/p/67feadaa74ae