一.前提知识概要

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

zk数据迁移删除过多zk node相关推荐

  1. 微信聊天记录删除怎么恢复?iOS安卓数据迁移

    因为手机系统的不同,当我们更换手机的时候,怎么样在Android和iOS之间进行数据迁移,也是一个让众多用户头疼的事情.因为数据互传的一个繁琐情况,现在进行数据的迁移,大多都是借助云端备份.第三方软件 ...

  2. 从0开始弄一个面向OC数据库(三)--数据库升级,数据迁移,删除数据

    前言 首先,在上一篇文章从0开始弄一个面向OC数据库(二),讲解了如何向数据库保存或更新一个模型.如何查询数据库里面的数据.其次,本篇要说的内容有: 数据库更新.数据迁移. 删除数据 使用场景: 随着 ...

  3. codis3数据迁移探索

    背景 在测试codis的过程中,由于现网使用的codis的每个集群的量相对较大,为了确保在codis的升级过程中能够紧急处理突发的一些问题故熟悉一下codis有关的基本原理. codis的逻辑 cod ...

  4. 技术实操丨HBase 2.X版本的元数据修复及一种数据迁移方式

    摘要:分享一个HBase集群恢复的方法. 背景 在HBase 1.x中,经常会遇到元数据不一致的情况,这个时候使用HBCK的命令,可以快速修复元数据,让集群恢复正常. 另外HBase数据迁移时,大家经 ...

  5. 数据迁移——技术选型

    日常我们在开发中,随着业务需求的变更,重构系统是很常见的事情.重构系统常见的一个场景是变更底层数据模型与存储结构.这种情况下就要对数据进行迁移,从而使业务能正常运行. 背景如下:老系统中使用了mong ...

  6. Mycat生产实践---数据迁移与扩容实践

    1 离线扩容缩容 工具目前从mycat1.6开始支持. 一.准备工作 1.mycat所在环境安装mysql客户端程序 2.mycat的lib目录下添加mysql的jdbc驱动包 3.对扩容缩容的表所有 ...

  7. 【ClickHouse系列】clickhouse-copier是如何进行数据迁移的

    clickhouse-copier是官方的数据迁移工具,用于多个集群之间的数据迁移. 详细的配置可以参照官方文档:https://clickhouse.tech/docs/en/operations/ ...

  8. 【kafka运维】分区副本重分配、数据迁移、副本扩缩容 (附教学视频)

    日常运维.问题排查=> 滴滴开源LogiKM一站式Kafka监控与管控平台 (后续的视频会在 公众号[首发].CSDN.B站等各平台同名号[石臻臻的杂货铺]上上传 ) 分区副本重分配+注意事项+ ...

  9. 我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...

    作者 | 上海小胖 来源 | Python专栏(ID:xpchuiit) 故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回 ...

最新文章

  1. CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
  2. JAVA中indexOf函数用法
  3. 网上搜集第三方(一)
  4. C++重载运算符最好声明为友元
  5. 5、java中的数组
  6. mysql主库从库在同一台服务器_MySQL数据库的主从配置(多主对一从)
  7. 吴军:我们之所以高估一些事情,源于认知
  8. linux添加svn副本目录,关于linux svn添加忽略目录的梗
  9. arp协议的主要功能是_【思唯网络学院】ARP理论知识详解(一)
  10. mysql skip-opt_FAQ系列 | mysqldump选项之skip-opt-阿里云开发者社区
  11. pytest与unittest区别
  12. 使用Python的basemap模块绘制地图的局部放大图(主图及放大的子图)
  13. wpsmac和pc版的区别_WPS Mac版本与Microsoft有什么区别?
  14. Win10下安装Ubuntu双系统Ubuntu分区
  15. android使用高德地图SDK获取定位信息
  16. python3跑通smpl模型_Python smpl-pytorch包_程序模块 - PyPI - Python中文网
  17. SVG——入门,路径变形动画
  18. 啥叫一个好售前​顾问
  19. 英语练习90 What's your type
  20. 牛客网小白月赛12(华华听月月唱歌)

热门文章

  1. 双十一爆款真无线蓝牙耳机推荐,降噪音质一个不少,不得不爱的精品
  2. 乐观锁与悲观琐的区别
  3. 互联网面试知识点总结(算法,后端)
  4. 在c语言中用来创建主菜单的对象是,c基础选择题(最新整理)
  5. 写论文时,如何写好引言
  6. HTML title 属性
  7. 锤子便签APP 产品使用分析报告
  8. HTML5垃圾桶效果,Html轻松使用拖拽实现垃圾桶,代码带注释,包你能看懂
  9. 一致性成本 非一致性成本
  10. 自定义百度地图style样式