zk数据迁移&删除过多zk node

一.前提知识概要

生产环境最近遇到zookeeper 巡检发现znode很多的问题,撸代码发现写zk的逻辑几乎不怎么会进去,而且代码删除znode的逻辑有bug。巡检正好发现,于是研究了下zk。
zk,即zookeeper,ZooKeeper是一个集中的服务,主要用于配置信息的维护、命名、分布式同步和组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。其中分布式同步、分布式锁控制等用的比较多。本文背景就是在分布式锁应用场景下。作为redis 分布式锁获取失败时的兜底方案。
由于涉及大量的znode数据手工删除,出于职业敏感,生产对于删除操作再怎么谨慎都不为过。要不然一个回车下去,抽自己的心都有。
zk数据分为内存数据和持久化数据。内存数据缓存了整个zk的完整树形数据在内存中。而磁盘持久化数据,则以定时执行snapshot形式存在。

1.配置如下

[appdeploy@cnsz****:/home/appdeploy/zookeeper/zookeeper-3.5.4-beta/conf]$cat zoo.cfg | grep data
dataDir=/home/appdeploy/zookeeper/data  #数据文件保存目录
dataLogDir=/home/appdeploy/zookeeper/logs  #日志文件保存目录

2.data file相关:
The suffix of the snapshot file names is the zxid, the ZooKeeper transaction id, of the last committed transaction at the start of the snapshot.(快照文件名的后缀为快照开始时最后一个提交的事务的zxid,即zkeeper事务id。)

[appdeploy@cnsz****:/home/appdeploy/zookeeper/data/version-2]$ls -l
total 278260
-rw-r--r-- 1 appdeploy mwopr        3 Jul  9 11:10 acceptedEpoch
-rw-r--r-- 1 appdeploy mwopr        3 Oct  1 07:16 currentEpoch
……
-rw-r--r-- 1 appdeploy mwopr 19002426 Dec 28 15:18 snapshot.24ba9724e65
-rw-r--r-- 1 appdeploy mwopr 19003555 Dec 28 15:22 snapshot.24ba9733257
-rw-r--r-- 1 appdeploy mwopr 19003195 Dec 28 15:28 snapshot.24ba9747f7d

3.log file相关:
The log file’s suffix is the first zxid written to that log.(日志文件的后缀是写入该日志的第一个zxid<zookeeper事务ID>。)

[appdeploy@cnsz****:/home/appdeploy/zookeeper/zookeeper-3.5.4-beta/bin]$./zkTxnLogToolkit.sh /home/appdeploy/zookeeper/logs/version-2/log.24ba96c1139  | head -100
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
12/28/20 2:48:35 PM CST session 0x105936b44c719f8 cxid 0x19b329 zxid 0x24ba96c1139 delete '/MCS-CAS-CORE-MOP/$Jobs/SaturnExceptionJob/execution/1/completed
……

4.事务ID
在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。
对于每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用ZXID来表示,通常是一个64位的数字。每一一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。

二.zk数据迁移

需求:生产集群clus_prd的zk数据迁移到测试环境的zk集群clus_test
stp1:停止clus_prd集群(若不要全量数据,则不用停clus_prd集群);
stp2:从clus_prd各个节点找出最新的snapshot,(zookeeper事务ID是递增的),以及包含该snapshot的log文件。

#日志文件的事务ID小于snapshot的事务ID(用zkTxnLogToolkit.sh命令),则说明日志文件包含了改snapshot的全部事务。

如:

[appdeploy@CNSZ****:/app/zookeeper-3.4.9/data/version-2]$ls -ltr | tail -5
-rw-r--r-- 1 appdeploy mwopr 43100725 Dec 28 17:44 snapshot.5b2340e1c
-rw-r--r-- 1 appdeploy mwopr 43100931 Dec 28 17:46 snapshot.5b2353ced
-rw-r--r-- 1 appdeploy mwopr 43097942 Dec 28 17:50 snapshot.5b236c19d
-rw-r--r-- 1 appdeploy mwopr 43100945 Dec 28 17:53 snapshot.5b238306a
-rw-r--r-- 1 appdeploy mwopr 43100995 Dec 28 17:54 snapshot.5b23905ec  #最新的
[appdeploy@CNSZ****:/app/zookeeper-3.4.9/log/version-2]$ls -ltr | tail -5
-rw-r--r-- 1 appdeploy mwopr 67108880 Dec 28 17:46 log.5b2340e12
-rw-r--r-- 1 appdeploy mwopr 67108880 Dec 28 17:50 log.5b2353d1b
-rw-r--r-- 1 appdeploy mwopr 67108880 Dec 28 17:53 log.5b236c1cc
-rw-r--r-- 1 appdeploy mwopr 67108880 Dec 28 17:54 log.5b238306c
-rw-r--r-- 1 appdeploy mwopr 67108880 Dec 28 17:56 log.5b23905ee #最新的

stp3:停止clus_test集群(所有节点,这样就snapshot和log文件都停止刷新了),并备份最新的snapshot和包含该snapshot的log文件(检查方法同stp2)
stp4:将stp2中clus_prd的文件复制到clus_test集群dataDir 和 dataLogDir 对应的路径下。
stp5:逐个启动clus_test集群下所有节点。等待一段时间(几分钟),集群状态

#启动zk
[appdeploy@CNSZ****:/home/appdeploy/zookeeper/zookeeper-3.5.4-beta/bin]$./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/appdeploy/zookeeper/zookeeper-3.5.4-beta/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#查看zk状态
[appdeploy@CNSZ****:/home/appdeploy/zookeeper/zookeeper-3.5.4-beta/bin]$./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/appdeploy/zookeeper/zookeeper-3.5.4-beta/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

三.删除过多zk node

生产环境出现过多的znode,担心会影响zk性能,以及一些不可预期的其他问题。决定删除一些无用的znode。

#可见/PortalLock下已经有157182个节点
[zk: localhost:2181(CONNECTED) 0] stat /PortalLock
cZxid = 0x11b11e4c4
ctime = Fri Jan 31 17:44:39 CST 2020
mZxid = 0x11b11e4c4
mtime = Fri Jan 31 17:44:39 CST 2020
pZxid = 0x510a8164d
cversion = 157102
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 157102

删除过程中遇到一个问题,如下,原因是/PortalLock下节点数过多

[zk: localhost:2181(CONNECTED) 0] deleteall /PortalLock
2020-12-28 18:36:11,184 [myid:localhost:2181] - WARN  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1237] - Session 0x3075ad884840044 for server localhost/127.0.0.1:2181, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Packet len7709610 is out of range!
        at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:121)
        at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:86)
        at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:363)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1214)

WATCHER::

WatchedEvent state:Disconnected type:None path:null
KeeperErrorCode = ConnectionLoss for /PortalLock

解决方案如下:

#zkCli.sh增加"-Djute.maxbuffer=2048" 这个参数,默认是4096*1024
"$JAVA" "-Djute.maxbuffer=2048" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \
	 -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \
 org.apache.zookeeper.ZooKeeperMain "$@"

最终结果:
测试环境1核4G的服务器,删除157812个节点,耗时15分56秒。
部分vmstat数据如下:

 1  0      0 128844 193852 730056    0    0     0  1983 3512 19476 34 36 16  5  8       2020-12-28 18:54:46 CST
 3  0      0 128736 193860 730368    0    0     0  1609 3025 17460 33 32 17  6 11       2020-12-28 18:54:51 CST
 5  0      0 128380 193876 730752    0    0     0  2118 3786 21891 35 34 16  6  8       2020-12-28 18:54:56 CST
 3  1      0 127644 193876 731208    0    0     0  1905 3544 20937 38 39 12  5  6       2020-12-28 18:55:01 CST
 4  1      0 127148 193884 731812    0    0     0  2040 3649 24907 40 40  7  5  8       2020-12-28 18:55:06 CST
 2  0      0 126900 193896 732108    0    0     0  1702 3169 17721 32 34 18  6 10       2020-12-28 18:55:11 CST
 0  0      0 126240 193904 732512    0    0     0  1926 3541 19306 36 32 18  5  9       2020-12-28 18:55:16 CST
 6  1      0 126124 193916 732816    0    0     0  1676 3100 17821 32 30 20  7 11       2020-12-28 18:55:21 CST
 5  0      0 125884 193920 733160    0    0     0  1530 2953 15805 31 28 19  8 13       2020-12-28 18:55:26 CST
 6  1      0 124208 193924 733440    0    0     0  1715 3615 18527 34 34 18  6  9       2020-12-28 18:55:31 CST
 3  0      0 125148 193932 733828    0    0     0  2164 4382 21477 33 35 20  6  7       2020-12-28 18:55:36 CST
 2  0      0 124784 193944 734264    0    0     0  2490 4222 24435 24 25 41  7  3       2020-12-28 18:55:41 CST
 1  0      0 123852 193968 734856    0    0     0  3681 5821 33243 29 29 33  7  2       2020-12-28 18:55:46 CST
 2  0      0 123628 193980 735248    0    0     0  2550 4221 24947 23 22 45  6  4       2020-12-28 18:55:51 CST
 3  0      0 117924 194056 740844    0    0     0  2095 3609 21252 33 31 23  6  7       2020-12-28 18:56:01 CST
 8  0      0 111312 194068 757900    0    0     0  1477 2733 14496 44 28  4  3 20       2020-12-28 18:56:06 CST
 5  0      0 113564 194084 758252    0    0     0  1715 3192 17023 31 35 15  7 12       2020-12-28 18:56:11 CST
 5  1      0 105632 194088 758596    0    0     0  1533 2926 14641 37 35 12  6 10       2020-12-28 18:56:16 CST
 1  0      0 105632 194096 758968    0    0     0  1572 2923 16278 32 32 16  7 13       2020-12-28 18:56:21 CST
 3  0      0 105416 194100 759332    0    0     0  1742 3333 16759 34 34 16  6 11       2020-12-28 18:56:26 CST
 4  0      0 103780 194100 759644    0    0     0  1986 3730 18611 32 36 21  6  5       2020-12-28 18:56:31 CST
 2  0      0 102164 194108 760100    0    0     0  6373 4251 19242 37 41 14  4  4       2020-12-28 18:56:36 CST
 2  0      0 101792 194128 760436    0    0     0  2083 3547 18462 32 36 20  6  6       2020-12-28 18:56:41 CST
 3  0      0 101256 194132 760876    0    0     0  1846 3274 16591 35 37 14  5  9       2020-12-28 18:56:46 CST
 2  0      0 101388 194136 761184    0    0     0  1657 2944 16703 28 30 21  7 14       2020-12-28 18:56:51 CST
 6  1      0 101140 194136 761580    0    0     0  1850 3356 19517 34 35 17  5  9       2020-12-28 18:56:56 CST
 3  0      0 100660 194140 762060    0    0     0  1870 3418 20380 36 34 16  6  8       2020-12-28 18:57:01 CST
 4  1      0  99916 194152 762696    0    0     0  2327 3680 23115 40 38 10  4  8       2020-12-28 18:57:06 CST
 3  0      0  99544 194168 763040    0    0     0  2064 3601 19275 34 34 20  7  5       2020-12-28 18:57:11 CST
 3  0      0  96912 194176 763472    0    0     0  1694 3109 16735 35 36 14  6  8       2020-12-28 18:57:16 CST
 2  1      0  98660 194180 763808    0    0     0  1836 3283 16739 34 34 17  6  9       2020-12-28 18:57:21 CST
 2  0      0  98164 194180 764112    0    0     0  1374 3012 14647 27 27 30  7  9       2020-12-28 18:57:26 CST
 4  0      0  97280 194188 764300    0    0     0  1007 2861 12634 28 24 34  4  9       2020-12-28 18:57:31 CST
 1  0      0  97420 194200 764600    0    0     0  1555 3456 17877 31 31 27  5  6       2020-12-28 18:57:36 CST
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值