Zookeeper

2,387 阅读2分钟

Zookeeper是一个开源的分布式协同服务系统;

安装

建议通过docker安装; 拉取镜像

docker pull zookeeper

运行

docker run --name zkdemo -d zookeeper:latest

image.png 可以开启多个CLI窗口,来操作zk;

API

zookeeper/zookeeperCLI.md

[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

  • 分布式锁 zookeeper-recipes-lock

    • 使用临时顺序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集群的架构和部署,提高可用性和可维护性。