Zookeeper
概述
-
是什么
- 节点数据管理软件, 可以创建, 修改, 删除节点或者节点数据. 客户端连接zookeeper, 就可以实现对节点的一致性共享
-
干什么
- 实现数据一致性共享, 用于服务注册与发现(Dubbo就是用Zookeeper实现服务注册与发现), 实现分布式锁, 消息中间件入Kafka的底层实现
-
怎么用
- 安装zookeeper软件 , 启动zookeeper服务, 或者zookeeper服务集群搭建与开启
- 对各个需要使用zookeeper功能的微服务添加依赖(一般使用zookeeperClient), 配置文件添加zookeeper 单个服务(或者集群)的ip和端口.
- 使用ZkClient对节点的创建, 修改, 删除, 监听. 完成特定功能
内部结构
- 每一个节点可以抽象的理解为一个目录,
- 节点的类型
- 临时节点
- 持久节点
- 序列化节点
- 序列化临时节点
- 序列化持久节点
- 注意细节
- 节点可以只有一个节点名称(相等于空目录), 也可以有节点内容.
- 节点里面可以继续包含节点(临时节点只能是叶子节点)
- 可以对节点做一些监听, 来实现各种功能, 比如对节点的监听(监听创建, 修改(节点本身修改/节点的子节点的创建或修改)), 节点数据的监听(节点数据的修改), 节点属性的监听(很少用)
- 节点的类型
常见操作
- 创建节点
- 删除节点
- 设置节点内容
- 监听节点
集群
- 说是集群, 其实我个人觉得说是主从复制比较贴切
- 原理
- 启动多个zookeeper服务, 让他们相互关联(配置文件中每一个zookeeper服务都配有集群中每个其他zookeeper服务的ip和端口)
- 把一些zookeeper服务设置成Leader, 一些设置成follower, 一些设置成observe(可有可无)
- leader: 主节点相当于mysql中的master, 用于写操作
- follower: 从节点相当于mysql中的slave, 用于读操作
- observer: 旁观者节点(与follower节点不同, 他不用于选举, 所以叫他旁观者). 用于读操作
- 通信机制: 现在就有了leader(一个)节点, 和若干个follower和observer节点, 他们直接的通信如图
- 如果客户端连接的是集群中的从节点
- 客户端写入流程说明:
- client向zk中的server发送写请求,如果该server不是leader,则会将该写请求转发给leader server,leader将请求事务以proposal形式分发给follower;
- 当follower收到收到leader的proposal时,根据接收的先后顺序处理proposal;
- 当Leader收到follower针对某个proposal过半的ack后,则发起事务提交,重新发起一个commit的proposal
- Follower收到commit的proposal后,记录事务提交,并把数据更新到内存数据库;
- 当写成功后,反馈给client。
- 如果客户端连接的是集群中的从节点
- 选举机制:
- 触发条件
- 服务节点初始化启动
- 半数一上的从节点无法感知主节点
- 选举说明
- 第一轮投票全部投给自己
- 第二轮投票给myid比自己大的相邻节点
- 如果得票超过半数,选举结束。
- 触发条件