TiKV 多副本丢失以及修复实践
作者: Meditator 原文来源:https://tidb.net/blog/ad45bad9
是否首发:首发
正文
1 实验目的
随着 tidb 使用场景的越来越多,接入的业务越来越重要,不由得想试验下 tidb 组件的高可用性以及故障或者灾难如何恢复,恢复主要涉及的是 pd 组件和 tikv 组件,本文主要涉及 tikv 组件,
pd 组件请参考另外一篇文章《pd 集群多副本数据丢失以及修复实践》pd 集群多副本数据丢失以及修复实践
2 试验环境
2.1 版本以及部署拓扑:
tidb 版本:5.2.1
部署方式:tiup
部署拓扑
5*TIKV
replica=3
温馨提示:
防止 tiup 部署后,在破坏掉 tikv 实例后,tikv-server 被自动拉起来,影响试验效果,需要做如下修改
1、在 /etc/systemd/system/tikv-20160.service 中去掉 Restart=always 或者改 Restart=no,
2、执行 systemctl daemon-reload 重新加载
2.2 查看测试表数据
3 单副本损毁及修复
过程略
提示:
此种场景也是最常见的场景,replica>=3 的时候,不会影响业务读写,也不会丢失数据,只需要扩容新 TiKV 节点,缩容下线故障节点即可。
如果是 3*TiKV 集群,必须只能先扩容,否则此时即便强制缩容下线故障节点,数据也不会发生 replica 均衡调度,因为无法补齐三副本。
4 双副本同时损毁及修复
4.1 查看测试表 region 分布
4.2 模拟 2 个 tikv 同时损坏
同时损坏的 TiKV 节点是 10.12.16.227:20160 和 10.12.16.228:20160
在 10.12.16.227(store_id=3)和 10.12.16.228(store_id=1)上分别执行
查看集群状态:
查看 store_id=3 和 store_id=1 的状态:
可以发现 30 分钟过后(store 的状态从 disconnecting–》down),store 1 和 3 上的 region 的 leader 和 replica 还存在,并不是因为 store 是 down 状态,其上面的 regionleader 和 replica 进行切换和调度,那是因为部分 region 同时失去两个副本,导致无法发生 leader 选举。
tidb 查询发现 hang 住直到超时
4.3 修复 tidb 集群
4.3.1 关闭调度
关闭调度原因:防止恢复期间出现其他的异常情况
关闭调度方法:config set region-schedule-limit、replica-schedule-limit、leader-schedule-limit、merge-schedule-limit 这 4 个值
4.3.2 查询出大多数副本在故障 tikv 上的 region id
检查大于等于一半副本数在故障节点(store_id in(1,3))上的 region,并记录它们的 region id
4.3.3 关闭正常的 tikv 节点
4.3.4 清理故障 store 的 region
清理方法:
在正常的 tikv(已经关闭掉)上执行命令:
执行命令在输出的结尾有 success 字样,说明执行成功
清理原因:在正常 tikv 上清理掉 region peer 落在故障 tikv(1 和 3)peer
4.3.5 重启 pd 集群
查看 store 1 和 store 3
发现上面的 leader_count 和 region_count 都变成 0,如果 pd 集群不重启,则不会消失。
4.3.6 启动正常的 tikv 节点
查看副本数为 2 的 region:
查看只有单副本的 region:
4.3.7 打开调度
4.3.8 验证数据
输出为空
数据已经可以查询,并且数据没有丢失
查看只有单副本的 region:
查看副本数为 2 的 region:
4.3.9 清理收尾
发现 store 1 和 3 还是存在(状态为 Down),需要在集群中剔除掉
删除掉 store 1 和 3
发现 227 和 228 已经不在集群
至此,双副本同时丢失的情景已经修复完毕
5 三副本同时损毁及修复
5.1 查看测试表 region 分布
5.2 模拟 3 个(所有副本)tikv 同时损坏
模拟 10.12.16.226:20160 10.12.16.227:20160 10.12.16.228:20160 三个 tikv 节点同时挂掉
在 226、227、228 上执行:
查看集群状态:
5.3 修复 tidb 集群
5.3.1 关闭调度
5.3.2 查询出三个(所有)副本在故障 tikv 上的 region id
5.3.3 关闭正常的 tikv 节点
5.3.4 清理故障 store 的 region
清理方法:
在正常的 tikv(已经关闭掉)上执行命令:
执行命令在输出的结尾有 success 字样,说明执行成功
清理原因:在正常 tikv 上清理掉 region peer 落在故障 tikv(4,497041,497042)peer
5.3.5 重启 pd 集群
5.3.6 启动正常的 tikv 节点
5.3.7 打开调度
5.3.8 验证数据
5.3.9 补偿所有副本都丢失的 region
5.3.9.1 查询所有副本都丢失的 region,并记录 region id
5.3.9.2 停止实例
停止 10.12.16.225:20160 tikv 实例(可以是其他任意正常的 tikv 实例)
5.3.9.3 根据上面查询出丢失的 region id 创建空 region
命令输出结尾有 success 字样,说明创建成功
5.3.9.4 验证数据
原来总数为 1024288,发现数据有丢失
5.3.10 收尾
如果通过 tiup cluster display tidb-test 执行命令发现 226、227、228 上的 store 状态为 up,说明开启了自动拉起
6 总结
1、如果 region 的单个副本丢失(小于 replica 一半的情况下),集群是不会丢失数据,此场景是绝大多数用户 tikv 挂掉场景;
2、如果 region 多副本(副本数大于 replica/2)丢失,如果开启 sync-log=true 则不会丢失数据,否则可能会丢失数据;
3、如果 region 所有副本丢失,此时必定会丢失数据,需要进行破坏性修复;
4、如果单机多 tikv 实例部署,一定需要打 label,否则主机挂掉,region 的多副本或者全部副本可能会丢失,从而导致丢失数据;
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/657cd42001af4f173a1b69766】。文章转载请联系作者。
评论