ZooKeeper

Posted by Liao on 2023-03-13

一、简介

ZooKeeper是一个分布式的、开源的分布式应用程序的(Hadoop、Hive等服务)协调服务,提供配置管理、分布式锁、集群管理(发布/订阅)等功能。

配置管理:zk作为配置中心,存储了每个分布式应用公有的配置信息,每个分布式应用可以从配置中心拉取配置信息,即使配置数据发生变更,也不影响应用服务,只需要改配置中心即可,大大降低复杂度。

集群管理:zk作为注册中心,服务提供方provider把地址放到注册中心(Dubbo)consumer消费时便去注册中心获取,并通过RPC等方式进行远程调用provider服务。

二、数据结构

ZooKeeper数据模型和Unix文件系统很类似,以树形结构存储数据,每个节点称为一个ZNode。每个ZNode默认存储1MB的数据(不适用于存储海量数据),每个ZNode可以通过路径唯一标识。

创建ZNode节点,每个节点会保存数据和节点信息,每个ZNode节点都有两个属性:myidzxid

  • 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
2
3
# 连接zk服务端
./zkCli.sh -server ip:port
./zkCli.sh #默认连接本机

create 命令

1
2
# 创建节点
create [-s][-e] /znode1 111

get 命令

1
2
#	获取节点数据
get /znode1

ls 命令

1
2
#	查看根节点下的节点
ls /

set命令

1
2
# 修改数据
set /znode1 222

delete deleteall 命令

1
2
3
# 删除节点
delete /znode1
deleteall /znode1

四、一致性保证

  • 线性一致性(Linearizability Writes):
  • FIFO client order:zookepper的写操作顺序完全与client端发起的写请求顺序保持一致
  • 保证数据强一致性:客户端在server1中进行写操作,server之间会立刻进行数据同步,尽量做到数据强一致性

五、Leader选举机制

1、数据最新的zxid最大的

2、若数据都一样,则选择myid最大的