Zookeeper是一个开源的分布式协同服务系统;
安装
建议通过docker安装; 拉取镜像
docker pull zookeeper
运行
docker run --name zkdemo -d zookeeper:latest
可以开启多个CLI窗口,来操作zk;
API
[zkshell: 1] help
# a sample one
[zkshell: 2] h
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b|-N|-B] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b|-N|-B val path
stat [-w] path
sync path
version
Create
- 创建一个持久化节点
create /persistent_node
- 创建一个瞬时的节点
create -e /ephemeral_node mydata
- 创建一个持久-有序的节点
create -s /persistent_sequential_node mydata
- 创建一个持久-临时节点
create -s -e /ephemeral_sequential_node mydata
get
- 获取节点的值
get /persistent_node
- 获取节点状态
get -s /persistent_node
- watch节点节点的数据变化触发
get -w /persistent_node
- 仅触发一次
set
- 修改值
set /brokers myNewData
- CAS 比较version后修改值
set -v 0 /brokers myNewData
ls
- 查看下级节点
ls /root
- watch下级节点
ls -w /root
watch机制:如果没有watch机制,客户端需要不断轮询Zookeeper,这在分布式环境非常耗时和性能的损耗;
开发实践:
-
分布式队列 zookeeper-recipes-queue
-
- 使用临时顺序EPHEMERAL_SEQUENTIAL来表示获取锁的请求,创建最小后缀数字znode的用户成功拿到锁;
- 相较于Redis做分布式锁,zk的EPHEMERAL机制天然解决了锁的释放问题;
- watch上一个node,能避免羊群效应,其次能让所的分配具有公平性,遵循先到先得的原则;
-
选举 election
举例
Kafka Broker
例如在Kafka中,需要首先启动Zookeeper,然后再启动Kafka Broker。Kafka Broker会自动向Zookeeper注册自己,并定期向Zookeeper发送心跳以表明自己的健康状况。同时,Kafka客户端也会使用Zookeeper来获取Kafka集群的元数据,并将自己的消费状态注册到Zookeeper中。这些信息可以帮助Kafka集群动态地调整分区的分配情况,以保证各个节点的负载均衡和高可用性。
Kafka Consumer
在Consumer端,消费实例也可以通过zookeeper实现服务协同,当有新的消费者实例加入时,则触发rebalance;需要注意的是,从Kafka 0.9版本开始,Consumer端可以使用新的Consumer API,这个API不再需要使用Zookeeper来管理消费组和消费状态。取而代之的是,Consumer可以直接向Broker发送心跳来表明自己的健康状况和消费进度,而不需要依赖Zookeeper。这样可以简化Kafka集群的架构和部署,提高可用性和可维护性。