目录
zookeeper简介
- 概念:理解为分布式文件系统。
- 功能:为程序提供协调服务。
工作机制
基于观察者模式设计的分布式服务管理框架。
负责存储喝管理数据。接受观察者的注册。zk负责通知
优势-应用场景
- 统一命名服务
- 分布式环境下,需要对应用服务器进行统一命名,便于识别.
- 统一配置管理
- 配置文件同步
- 统一集群管理
- 根据节点实时状态做出调整
- 实时监控节点变化
- 服务器动态上下线
- 软负载均衡
- 如:简单实现,记录访问数量,每次路由至最少访问的
数据结构
zk的数据结构类似unix文件系统.每个节点为znode.
每个node默认存储1m的数据
zk分布式的特点
- 1个leader,多follower
- 半数以上存活,zk正常服务
- 全局数据一直,每个server都保存一份相同的数据。
- 更新请求顺序志新,来自同一个client更新请求按照顺序执行.
- 数据更新原子性
- 实时性,同步速度快
配置参数
1 | # 心跳 |
zk内部原理
选举机制
- 半数机制: 半数以上机器存货,zk集群可用,集群最好为奇数
- 配置文件中没有leader,follower,但是会内部选举出一个.
最大ZXID也就是节点本地的最新事务编号,包含epoch和计数两部分。epoch是纪元的意思,相当于Raft算法选主时候的term,标识当前leader周期,每次选举一个新的Leader服务器后,会生成一个新的epoch
选举阶段
ZXID-本地最新事物编号,epoch和计数两部分,epoch为选举周期,每次选举出master后会生成新的epoch.
所有节点处于Looking状态,各自依次发起投票,投票包含自己的服务器ID和最新事务ID(ZXID)。
如果发现别人的ZXID比自己大,也就是数据比自己新,那么就重新发起投票,投票给目前已知最大的ZXID所属节点。
每次投票后,服务器都会统计投票数量,判断是否有某个节点得到半数以上的投票。如果存在这样的节点,该节点将会成为准Leader,状态变为Leading。其他节点的状态变为Following。
发现阶段
- 为了防止某些意外情况,比如因网络原因在上一阶段产生多个Leader的情况。
- Leader接收所有Follower发来各自的最新epoch值。Leader从中选出最大的epoch,基于此值加1,生成新的epoch分发给各个Follower。
- 各个Follower收到全新的epoch后,返回ACK给Leader,带上各自最大的ZXID和历史事务日志。Leader选出最大的ZXID,并更新自身历史日志。
同步阶段
Leader刚才收集得到的最新历史事务日志,同步给集群中所有的Follower。只有当半数Follower同步成功,这个准Leader才能成为正式的Leader。
节点类型
持久
client和server断开,不删除数据
- 持久化目录节点
- 持久化顺序编号目录节点
- zk给该节点进行顺序编号(记录事件顺序)
临时
client和server断开,删除数据
- 临时目录节点
- 临时顺序编号目录节点
- 产生节点编号递增
场景如服务器上下线
znode结构
- data 存储数据,默认不超过1m
- acl 记录访问权限,哪些人或者ip可访问此节点
- child 子节点
- stat 元数据
- czxid- 引起这个 znode 创建的 zxid,创建节点的事务的 * zxid
- ctime - znode 被创建的毫秒数
- mzxid - znode 最后更新的 zxid
- mtime - znode 最后修改的毫秒数
- pZxid-znode 最后更新的子节点 zxid
- cversion - znode 子节点变化号,znode 子节点修改次数 * 7)dataversion - znode 数据变化号
- aclVersion - znode 访问控制列表的变化号
- ephemeralOwner- 如果是临时节点,这个是znode拥有者的 * session id。如果不是临时节点则是 0
- dataLength- znode 的数据长度
- numChildren - znode 子节点数量
监听器原理
步骤 | 客户端 | 服务端 |
---|---|---|
1 | main线程 | |
2 | 创建zk客户端,启动2个线程,进行网络链接,同时进行监听 | |
4 | zkserver将监听事件注册监听列表 | |
5 | 监听数据或路径(子节点)有变化,通知给listener | |
6 | listener线程内部调用onProcess |
写数据流程
- 客户端提交数据给任意follower
- follower把写入数据请求转发给leader
- leader采用二阶段提交方式,发送propose广播给follower
- follower接到propose消息,写入日志成功,返回ack给leader
- leader接到半数以上ack消息,返回成功给客户端,并且广播commit请求给follower
- 接收请求得follower将成功消息返回client
常用-简单命令
1 | # 链接 |