07-zookeeper-内部原理

07-zookeeper-内部原理:
https://zookeeper.apache.org/

1、节点类型(4种)

public enum CreateMode {
    PERSISTENT(0, false, false, false, false),
    PERSISTENT_SEQUENTIAL(2, false, true, false, false),
    EPHEMERAL(1, true, false, false, false),
    EPHEMERAL_SEQUENTIAL(3, true, true, false, false),
    CONTAINER(4, false, false, true, false),
    PERSISTENT_WITH_TTL(5, false, false, false, true),
    PERSISTENT_SEQUENTIAL_WITH_TTL(6, false, true, false, true);
    ......
}

PERSISTENT 持久型
创建了就会一直存在,直到被手动调用删除节点方法。

PERSISTENT_SEQUENTIAL 持久顺序型
会自动在节点路径名称后面添加一个自增的序号,如apple/iphone/macbook00000001,这种带自增序号的节点能保证输入同一路径时都能创建一个唯一的节点,可用于实现分布式队列,分布式公平锁。

EPHEMERAL 临时型
在回话结束后,节点自动删除。

EPHEMERAL_SEQUENTIAL 临时顺序型
临时节点特性,路径自动添加自增序号。

CONTAINER 容器型
zookeeper会有线程扫描容器型节点,当发现节点没有子节点时,就会删除掉容器节点。在没有没删除前,特性和持久节点一样,官方对此类型的节点用处说明是:Container nodes are special purpose nodes useful for recipes such as leader, lock, etc。

PERSISTENT_WITH_TTL 持久TTLTTL的意思是time to live ,他是容器节点之上的,当此类型节点之下没有子节点且未被修改的时间超过TTL后,就会被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。

2、stat结构体
cZxid:导致创建znode更改的事务ID。
mZxid:最后修改znode更改的事务ID。
pZxid:用于添加或删除子节点的znode更改的事务ID。
ctime:从1970-01-01T00:00:00Z开始以毫秒为单位的znode创建时间。
mtime:从1970-01-01T00:00:00Z开始以毫秒为单位的znode最近修改时间。
dataVersion:对该znode的数据所做的更改次数。
cversion:对此znode的子节点进行的更改次数。
aclVersion:对此znode的ACL进行更改的次数。
ephemeralOwner:如果znode是ephemeral类型节点,则这是znode所有者的 session ID。 如果znode不是ephemeral节点,则该字段设置为零。
dataLength:这是znode数据字段的长度。
numChildren:这表示znode的子节点的数量。

3、监听器原理

​ 1)首先由一个main()线程

​ 2)在main()线程总创建ZK客户端,这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)

​ 3)通过connect线程将注册的监听事件发送给ZK

​ 4)在ZK的注册监听列表中将注册的监听事件添加到列表中

​ 5)ZK监听到有数据或者路径变化,将消息发送给listener线程。

​ 6)listener线程调用回调函数process()方法
在这里插入图片描述

zookeeper如何保证全局读写顺序一致且确定的。(ZAB协议)zookeeper atomic broadcast广播

ZAB主要由两部分,1.没有leader选leader(崩溃恢复),2.有leader干活(正常读写)。

选举机制

1)半数机制:集群中半数以上机器存活,集群可用。(适合奇数台服务器)

2)Zookeeper虽未在配置文件指定Master和Slave。单至少有个一leader,其他为Follower,Leader是通过内部的选举机制临时产生的。

3)下面举例说明选举过程。

假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图5-8所示。

在这里插入图片描述

(1)服务器1启动,发起一次选举。服务器1投自己一票。不够半数以上(3票),选举无法完成,服务器1状态保持LOOKING;

(2)服务器2启动,再次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的ID比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING

(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;

(5)服务器5启动,同4一样当小弟。

写数据流程

在这里插入图片描述
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值