一、简介
ZooKeeper是一个分布式的、开源的分布式应用程序的(Hadoop、Hive等服务)协调服务,提供配置管理、分布式锁、集群管理(发布/订阅)等功能。
配置管理:zk作为配置中心,存储了每个分布式应用公有的配置信息,每个分布式应用可以从配置中心拉取配置信息,即使配置数据发生变更,也不影响应用服务,只需要改配置中心即可,大大降低复杂度。
集群管理:zk作为注册中心,服务提供方provider把地址放到注册中心(Dubbo),consumer消费时便去注册中心获取,并通过RPC等方式进行远程调用provider服务。
二、数据结构
ZooKeeper数据模型和Unix文件系统很类似,以树形结构存储数据,每个节点称为一个ZNode。每个ZNode默认存储1MB的数据(不适用于存储海量数据),每个ZNode可以通过路径唯一标识。
创建ZNode节点,每个节点会保存数据和节点信息,每个ZNode节点都有两个属性:myid
、zxid
- myid:唯一
- zxid:当client有数据写入时,首先生成日志条目,用zxid打上标签,再把数据存储到内存中(结构时DataTree)
节点类型
- 持久化节点(persistent)
- 临时节点(ephemeral) :-e
- 持久化顺序节点(persistent_sequential) :-s
- 临时顺序节点(ephemeral_sequential) :-es
三、基本使用
2.1 服务端命令
/opt/homebrew/Cellar/zookeeper/3.8.1/bin
1 | ./zkServer.sh start|status|stop|restart |
2.2 客户端(shell命令、API)
1 | 连接zk服务端 |
create 命令
1 | 创建节点 |
get 命令
1 | 获取节点数据 |
ls 命令
1 | 查看根节点下的节点 |
set命令
1 | 修改数据 |
delete deleteall 命令
1 | 删除节点 |
四、一致性保证
- 线性一致性(Linearizability Writes):
- FIFO client order:zookepper的写操作顺序完全与client端发起的写请求顺序保持一致
- 保证数据强一致性:客户端在server1中进行写操作,server之间会立刻进行数据同步,尽量做到数据强一致性
五、Leader选举机制
1、数据最新的zxid最大的
2、若数据都一样,则选择myid最大的