zookeeper动态扩缩容(无需重启)

目录

一、启动一个zk

二、扩容一个zk

三、缩容一个zk

四、重新配置集群的节点


前言:

zookeeper动态扩/缩容的reconfig命令旨在不需要重启zookeeper中任何一个节点的情况下,对整个zookeeper集群进行动态扩/缩容。

zookeeper客户端支持的命令:

[zk: localhost:2181(CONNECTED) 5] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
	addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
	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 [-b batch size]
	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 
	whoami 

在实际验证中发现一些细节问题,先记录如下:

1、如果整个zk集群只有一个zk节点(即serverId只有它本身),这时默认运行的是单机模式,如果需要运行在集群模式下,需要加入standaloneEnabled=false的配置。

2、使用zkCli客户端提供的reconfig命令,需要修改/zookeper/config节点,普通账号对该节点上的数据只有ACL中的查看权限,有如下两种方法可以解决:

①关闭ACL,配置文件加入 skipACL=yes

②生成超级管理员账号:

Linux可直接执行如下命名:

echo -n cjian:111111 | openssl dgst -binary -sha1 | openssl base64

cjian:111111 为用户名和密码 ,启动脚本增加如下配置

-Dzookeeper.DigestAuthenticationProvider.superDigest=cjian:ST25maIOy8WImjpR7Nf2/D2wFXQ=

使用zkCli连接上后,执行addauth digest cjian:111111

之后就可以修改/zookeper/config节点的数据了,即可执行reconfig命令

3、要使用reconfig命令需要配置reconfigEnabled=true

实操一下:

下载zookeeper不做赘述~

一、启动一个zk

配置第一个zk(myid为0),配置如下:

initLimit=10
syncLimit=5
skipACL=yes
# 加上这个配置 可通过 echo stat|nc ip:port 命令查看实例角色
4lw.commands.whitelist=*
clientPort=2181
tickTime=2000
dataDir=/home/zookeeper/zookeeper1/data
dataLogDir=/home/zookeeper/zookeeper1/log
# 关闭 单机模式
standaloneEnabled=false
# 支持reconfig
reconfigEnabled=true
admin.enableServer=false
server.0=127.0.0.1:2888:3888

启动后,执行

[root@localhost zookeeper1]# echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.8.1-74db005175a4ec545697012f9069cb9dcc8cdda7, built on 2023-01-25 16:31 UTC
Clients:
 /127.0.0.1:42266[1](queued=0,recved=224,sent=224)
 /127.0.0.1:42288[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/1.4933/42
Received: 226
Sent: 225
Connections: 2
Outstanding: 0
Zxid: 0x90000000a
Mode: leader
Node count: 6
Proposal sizes last/min/max: 239/36/239

发现zk 0 的角色为leader,符合预期

二、扩容一个zk

拷贝一份,myid修改为1,配置文件修改如下:

initLimit=10
syncLimit=5
skipACL=yes
# 加上这个配置 可通过 echo stat|nc ip:port 命令查看实例角色
4lw.commands.whitelist=*
clientPort=2182
tickTime=2000
dataDir=/home/zookeeper/zookeeper2/data
dataLogDir=/home/zookeeper/zookeeper2/log
# 关闭 单机模式
standaloneEnabled=false
# 支持reconfig
reconfigEnabled=true
admin.enableServer=false

server.0=127.0.0.1:2888:3888
server.1=127.0.0.1:2889:3889

注意: 这里扩容的实例的配置需要加上目标集群leader的server.id配置,如果只配置server.1=127.0.0.1:2889:3889,启动后,它是个leader,这时我们在2181的客户端连接上执行reconfig -add XXX命令时,会提示:

[zk: localhost:2181(CONNECTED) 0] reconfig -add server.1=127.0.0.1:2889:3889:participant;2182
No quorum of new config is connected and up-to-date with the leader of last commmitted config - try invoking reconfiguration after new servers are connected and synced

 正常配置并启动完成后,在2181的客户端连接上执行add命令:

(这里连上2182的客户端执行也是一样的,该请求zk内部会转发给leader)

[zk: localhost:2181(CONNECTED) 3] reconfig -add server.1=127.0.0.1:2889:3889:participant;2182
Committed new configuration:
server.0=127.0.0.1:2888:3888:participant
server.1=127.0.0.1:2889:3889:participant;0.0.0.0:2182
# 这是一个新的配置文件版本号标识,会生成zoo.cfg.dynamic.version=900000005文件
version=900000005
[root@localhost zookeeper1]# cat conf/zoo.cfg.dynamic.900000005
server.0=127.0.0.1:2888:3888:participant
server.1=127.0.0.1:2889:3889:participant;0.0.0.0:2182
[root@localhost zookeeper2]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper2/bin/../conf/zoo.cfg
Client port not found in static config file. Looking in dynamic config file.
Client port found: 2182. Client address: 0.0.0.0. Client SSL: false.
Mode: follower

发现扩容后的实例角色为follower,符合预期,连上客户端查看配置:

[root@localhost zookeeper2]# ./bin/zkCli.sh -server 127.0.0.1:2182
...

[zk: 127.0.0.1:2182(CONNECTED) 0] config
server.0=127.0.0.1:2888:3888:participant
server.1=127.0.0.1:2889:3889:participant;0.0.0.0:2182
version=900000005

三、缩容一个zk

现在我们将第二步扩容的zk,拿掉,连上2181的客户端,并执行命令

[zk: localhost:2181(CONNECTED) 7] reconfig -remove 1
Committed new configuration:
server.0=127.0.0.1:2888:3888:participant
version=90000000d
[root@localhost zookeeper1]# cat conf/zoo.cfg.dynamic.90000000d
server.0=127.0.0.1:2888:3888:participant

查看下2182的配置和角色

[root@localhost zookeeper2]# cat conf/zoo.cfg
initLimit=10
syncLimit=5
skipACL=yes
4lw.commands.whitelist=*
tickTime=2000
dataDir=/home/zookeeper/zookeeper2/data
dataLogDir=/home/zookeeper/zookeeper2/log
reconfigEnabled=true
admin.enableServer=false
standaloneEnabled=false
dynamicConfigFile=/home/zookeeper/zookeeper2/conf/zoo.cfg.dynamic.90000000d
[root@localhost zookeeper2]# cat conf/zoo.cfg.dynamic.90000000d
server.0=127.0.0.1:2888:3888:participant
[root@localhost zookeeper2]# echo stat|nc 127.0.0.1 2182
Zookeeper version: 3.8.1-74db005175a4ec545697012f9069cb9dcc8cdda7, built on 2023-01-25 16:31 UTC
Clients:
 /127.0.0.1:37140[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0.7989/30
Received: 176
Sent: 175
Connections: 1
Outstanding: 0
Zxid: 0x90000000d
Mode: follower
Node count: 6

发现还是follower,只不过已经脱离了集群;

四、重新配置集群的节点

可通过如下命令进行整个zk集群的配置更新

reconfig -members serverID=host:port1:port2;port3[,...]

其它的一些注意事项和命令说明可以翻阅官网的reconfig章节~

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 问题,例如协调、通信、同步和配置管理等。它提供了一套简单易用的API,使开发人员能够轻松构建和管理分布式系统。 首先,zookeeper可用作分布式系统中的协调器。它提供了一致性的命名空间,可以用于注册服务和探测服务的可用性。通过zookeeper分布式应用可以自动发现和管理服务的动态变化,例如服务的上下线和实例的变更。 其次,zookeeper可以用于分布式应用的通信。它提供了支持分布式锁和同步机制的原语,使得分布式应用可以进行安全的数据共享和协作。通过zookeeper分布式锁和同步机制,应用程序可以实现多个节点之间的互斥访问,从而解决竞态条件和数据一致性的问题。 此外,zookeeper还提供了配置管理的功能。它允许分布式应用将配置信息集中保存在zookeeper的目录结构中,从而实现配置的集中化管理。应用程序可以监听zookeeper上配置节点的变化,并在配置发生更改时进行相应的更新。 总之,zookeeper分布式鑧服务框架的主要目的是为了帮助开发人员解决分布式应用中的一些常见问题,如协调、通信、同步和配置管理等。它提供了一套简单易用的API,使得开发人员能够轻松构建和管理分布式系统。通过使用zookeeper,开发人员可以更好地处理分布式环境下的挑战,确保分布式应用的稳定和可靠性。 ### 回答2: zookeeper分布式服务框架主要是用来解决分布式应用中经常遇到的一些协调与同步问题。 在分布式系统中,通常存在多个独立的节点,它们需要共同协作完成一项任务。但是由于网络延迟、节点故障、并发冲突等因素,节点之间的通信和同步变得复杂。Zookeeper提供了一种可靠的协调机制,使得分布式节点能够在同一个逻辑时空中排序和同步操作。 首先,Zookeeper通过在集群中的每个节点上保存数据结构(称为“znode”)来记录和存储分布式应用的状态信息。这些znode可以被应用程序监视和访问,并通过事件通知机制实时获得状态变更的通知。这样,应用程序能够根据需要动态地加入或退出集群,实现弹性扩缩容。 其次,Zookeeper提供了一套基于临时顺序节点(EPHEMERAL_SEQUENTIAL)的锁机制,用于解决分布式环境下的并发冲突。应用程序可以请求一个锁,当它获得锁时,其他节点将等待,直到该节点释放锁。这种锁机制保证了分布式系统中的资源竞争问题得到了正确处理。 此外,Zookeeper还提供了分布式队列和分布式选举等功能。分布式队列可用于任务调度,各个节点可以向队列中添加任务并按照一定规则依次执行。分布式选举用于选出系统中具备特定角色的主节点,以保证系统正常运行。 总之,Zookeeper分布式服务框架通过提供一套可靠且高效的协调机制,解决了分布式应用中协调与同步问题。它广泛应用于分布式数据库、分布式缓存、分布式应用的全局配置管理等场景中,提供了一种简单可依赖的工具,使得开发人员能够更加方便地构建可扩展的分布式应用。 ### 回答3: Zookeeper分布式协调服务框架主要用于解决分布式应用中的一些共享和协调问题。在分布式系统中,由于各个节点之间的独立性和并行执行,可能会导致一些数据共享和任务协调的困难,而Zookeeper便提供了易于使用和高效的解决方案。 首先,Zookeeper提供了类似于文件系统的层次化结构,可以用于分布式环境中的配置管理。分布式应用可以将配置信息存储在Zookeeper的节点中,并在需要时动态地获取配置。这样,即使配置发生变化,也可以实时更新,而无需重启应用。 其次,Zookeeper还提供了分布式锁和同步原语,用于解决分布式环境中的并发控制问题。应用可以通过Zookeeper实现互斥访问共享资源,避免多个节点同时访问导致的数据不一致。同时,Zookeeper还提供了临时节点和监听机制,可以实现分布式任务的协调和通知,例如选举主节点、分布式队列等。 另外,Zookeeper还具备高可用性和容错性。它采用了基于ZAB协议的一致性算法,可以保证数据的强一致性,并在节点故障时自动进行主备切换。因此,即使部分节点失效,Zookeeper仍然可以继续提供服务,保证分布式系统的正常运行。 总之,Zookeeper分布式协调服务框架是解决分布式应用中共享和协调问题的一个重要工具。它的层次化结构、配置管理、分布式锁、同步原语以及高可用性和容错性的特性,都为分布式应用的开发和部署提供了便利和保障。通过使用Zookeeper,我们可以更好地设计和实现分布式系统,提高系统的可伸缩性、可靠性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值