Zookeeper实战记录(3)-原理解析

目录

Zookeeper实战记录-目录:https://blog.csdn.net/weixin_39565597/article/details/104401912

1、角色

LEADER:所有节点只有一个LEADER节点,由LEADER节点协调各FOLLOWER节点,发起投票和决议
FOLLOWER:接受请求,响应结果,参与投票
OBSERVER:接受请求转发Leader,不参与投票,同步Leader状态
CLIENT:客户端

2、选举机制

Leader和Follower节点是如何来的?

以node1、node2、node3三台服务器zk集群为例,myid分别为1,2,3。

当node1启动时,由配置文件得出有3台做集群,但只有node1在线,故给自己投票,选举状态一直是LOOKING。

当node2也启动时,发现node1在线,此时node2启动成功,且myid为2,比node1的myid要大,故node2投自己1票,而node1检测到node2启动,且myid比自己大,故把自己的票投给node2。此时已经集群里存活的节点大于半数,集群启动成功。node2为Leader、node1为Follower

当node3也启动时,虽然myid比node1和node2的大,但是此时已经有Leader节点,故node3为Follower节点

3、节点类型

持久化类型:

1、PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

临时类型:

3、EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

4、Stat结构

# zookeeper节点stat信息
[zk: localhost(CONNECTED) 0] stat /zookeeper
cZxid = 0x0         # 创建节点的事务zxid
ctime = Thu Jan 01 05:30:00 IST 1970 # 被创建的毫秒数(从1970年开始) 
mZxid = 0x0         # 最后更新的事务zxid
mtime = Thu Jan 01 05:30:00 IST 1970  # 最后修改的毫秒数(从1970年开始)
pZxid = 0x0          # 最后更新的子节点zxid
cversion = -1        # 子节点变化号,znode子节点修改次数
dataVersion = 0         # 数据变化号
aclVersion = 0          # 访问控制列表的变化号
ephemeralOwner = 0x0    # 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
dataLength = 0      # znode的数据长度
numChildren = 1     # znode子节点数量

5、监听器

此处以get方法监听为例,其它监听同理。
客户端1

# 创建节点hello,值为hello1
[zk: localhost(CONNECTED) 0] create /hello 'hello1'
# 获取节点hello信息,且监听该节点
[zk: localhost(CONNECTED) 1] get /hello watch
hello1
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x4
mtime = Tue Feb 18 20:55:36 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

客户端2

# 查看节点hello信息,与客户端1显示一致
[zk: localhost(CONNECTED) 0] get /hello
hello1
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x4
mtime = Tue Feb 18 20:55:36 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
# 设置节点hello新值为hello2后
[zk: localhost(CONNECTED) 1] set /hello 'hello2'
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x6
mtime = Tue Feb 18 20:59:52 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

客户端1

# 客户端1自动打印监听信息(注意该监听器是一次性的,触发一次后不再触发)
[zk: localhost(CONNECTED) 2]
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/hello

6、工作流程

集群节点:node1、node2、node3依次为:从、主、从集群模式。
1、客户端 连接 node1节点,发送请求至node1.
2、由于node2才是主节点,故node1将请求转发给node2.
3、node2节点会广播给各个节点node1、node3.
4、当大于半数的从节点收到leader的广播,并且写入数据后,则通知leader。
5、leader判断确实大于半数的节点数据写入成功,则给客户端响应.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值