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 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相关推荐
- 微信聊天记录删除怎么恢复?iOS安卓数据迁移
因为手机系统的不同,当我们更换手机的时候,怎么样在Android和iOS之间进行数据迁移,也是一个让众多用户头疼的事情.因为数据互传的一个繁琐情况,现在进行数据的迁移,大多都是借助云端备份.第三方软件 ...
- 从0开始弄一个面向OC数据库(三)--数据库升级,数据迁移,删除数据
前言 首先,在上一篇文章从0开始弄一个面向OC数据库(二),讲解了如何向数据库保存或更新一个模型.如何查询数据库里面的数据.其次,本篇要说的内容有: 数据库更新.数据迁移. 删除数据 使用场景: 随着 ...
- codis3数据迁移探索
背景 在测试codis的过程中,由于现网使用的codis的每个集群的量相对较大,为了确保在codis的升级过程中能够紧急处理突发的一些问题故熟悉一下codis有关的基本原理. codis的逻辑 cod ...
- 技术实操丨HBase 2.X版本的元数据修复及一种数据迁移方式
摘要:分享一个HBase集群恢复的方法. 背景 在HBase 1.x中,经常会遇到元数据不一致的情况,这个时候使用HBCK的命令,可以快速修复元数据,让集群恢复正常. 另外HBase数据迁移时,大家经 ...
- 数据迁移——技术选型
日常我们在开发中,随着业务需求的变更,重构系统是很常见的事情.重构系统常见的一个场景是变更底层数据模型与存储结构.这种情况下就要对数据进行迁移,从而使业务能正常运行. 背景如下:老系统中使用了mong ...
- Mycat生产实践---数据迁移与扩容实践
1 离线扩容缩容 工具目前从mycat1.6开始支持. 一.准备工作 1.mycat所在环境安装mysql客户端程序 2.mycat的lib目录下添加mysql的jdbc驱动包 3.对扩容缩容的表所有 ...
- 【ClickHouse系列】clickhouse-copier是如何进行数据迁移的
clickhouse-copier是官方的数据迁移工具,用于多个集群之间的数据迁移. 详细的配置可以参照官方文档:https://clickhouse.tech/docs/en/operations/ ...
- 【kafka运维】分区副本重分配、数据迁移、副本扩缩容 (附教学视频)
日常运维.问题排查=> 滴滴开源LogiKM一站式Kafka监控与管控平台 (后续的视频会在 公众号[首发].CSDN.B站等各平台同名号[石臻臻的杂货铺]上上传 ) 分区副本重分配+注意事项+ ...
- 我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...
作者 | 上海小胖 来源 | Python专栏(ID:xpchuiit) 故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回 ...
最新文章
- CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
- JAVA中indexOf函数用法
- 网上搜集第三方(一)
- C++重载运算符最好声明为友元
- 5、java中的数组
- mysql主库从库在同一台服务器_MySQL数据库的主从配置(多主对一从)
- 吴军:我们之所以高估一些事情,源于认知
- linux添加svn副本目录,关于linux svn添加忽略目录的梗
- arp协议的主要功能是_【思唯网络学院】ARP理论知识详解(一)
- mysql skip-opt_FAQ系列 | mysqldump选项之skip-opt-阿里云开发者社区
- pytest与unittest区别
- 使用Python的basemap模块绘制地图的局部放大图(主图及放大的子图)
- wpsmac和pc版的区别_WPS Mac版本与Microsoft有什么区别?
- Win10下安装Ubuntu双系统Ubuntu分区
- android使用高德地图SDK获取定位信息
- python3跑通smpl模型_Python smpl-pytorch包_程序模块 - PyPI - Python中文网
- SVG——入门,路径变形动画
- 啥叫一个好售前​顾问
- 英语练习90 What's your type
- 牛客网小白月赛12(华华听月月唱歌)