课程名称:3.9.4 TiDB 跨数据中心部署方案
学习时长:10min
课程收获:在多副本出现异常时,恢复集群的使用
课程内容:
- 数据丢失的几种情况
- region的所有副本在灾难中丢失
- region的一多半副本副本在灾难中丢失,剩余副本未收到最近写入
- 触发上述场景发生的情况描述
- sync-log参数未开启
- label没有正确设置
- 故障中需要记录的重要信息
- 集群版本,sync-log配置,故障的TiKV数量
- 超过一半副本发生故障的region
- pd-ctl -u -d region --jq=".regions[] | {id:.id, peer_stores: [.peers[].store_id] | select(length as $total | map(if .==(1,4,5) then . else empty end) | length>=$total-length)}"
- 需要与用户交流的内容
- 是否能接收数据丢失
- 丢失部分最近写入
- 一些region丢失所有数据
- 丢失数据能否重定向
- 是否能接收数据丢失
- 数据恢复步骤(对于大部分副本丢失的场景)
- 1、为减少恢复间的出现异常的概率,推荐调整PD配置并临时关闭相关调度
- 运行pd-ctl,执行
- config set region-schedule-limit 0
- config set replica-schedule-limit 0
- config set leader-schedule-limit 0
- config set merge-schedule-limit 0
- 运行pd-ctl,执行
- 2、使用pd-ctl故障数超过一半的regions,记录其ID
- 方法1:在TiKV故障节点执行,且TiKV已关闭
- tikv-ctl --db /path/to/tikv-data/db bad-regions
- 方法2:PD在running状态(假设故障节点是1,4,5)
- pd-ctl -u -d region --jq=".regions[] | {id:.id, peer_stores: [.peers[].store_id] | select(length as $total | map(if .==(1,4,5) then . else empty end) | length>=$total-length)}"
- 方法1:在TiKV故障节点执行,且TiKV已关闭
- 3、将上述查询到的region设置为墓碑状态(tombstone state)
- 在TiKV故障节点执行,且TiKV已关闭
- tikv-ctl --db /path/to/tikv-data/db tombstone -r --force
- 4、在剩余正常节点上,移除故障节点的peers
- 根据故障region的数量,可采用不同的解决方案:
- A、删除指定region
- tikv-ctl --db /path/to/tikv-data/db unsafe-recover remove-dail-stores -s <s1,s2> -r <r1,r2,r3>
- B、删除所有region
- tikv-ctl --db /path/to/tikv-data/db unsafe-recover remove-dail-stores -s <s1,s2> --all-regions
- A、删除指定region
- 根据故障region的数量,可采用不同的解决方案:
- 5、至此,理论上仍然有副本的region都能选举出leader,可以重启PD,重启TiKV集群,继续处理全部副本丢失的region
- 使用pd-ctl检查没有leader的region,且pd在运行状态
- pd-ctl -u -d region --jq ‘.regions[] | select (has(“leader”)|not)|{id:._id, peer_stores:[.peers[].store_id]}’
- 6、根据上一步找到的region的ID,创建空region解决Unavailable error
- tikv-ctl --db /path/to/tikv-data/db recreate-region --pd -r <region_id>’
- 7、根据region的ID确认region属于那些表或索引
- PD, TiKV,TiDB 是运行状态
- curl http://{TiDBIP}:10080/regions/{regionID}
- 8、实践中,更有效的方法是问用户在故障前写入了哪些表,是否是DDL,是否能重新消费上游数据来重写
- A、对于索引,检查一致性
- select count(*) from table
- select count(*) from table force index
idx_name
- B、对于记录,重新导入这部分数据
- A、对于索引,检查一致性
- 9、恢复PD调度参数
- config set region-schedule-limit xx
- config set replica-schedule-limit xx
- config set leader-schedule-limit xx
- config set merge-schedule-limit xx
- 1、为减少恢复间的出现异常的概率,推荐调整PD配置并临时关闭相关调度
- 数据恢复期望结果
- 全部TiKV正常启动,没有Region Unavailble error