【TiDB 4.0 PCTA 学习笔记】- 3.9.4 TiDB 跨数据中心部署方案@2班+欧阳

课程名称: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
    • 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)}"
    • 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
    • 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、对于记录,重新导入这部分数据
    • 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
  • 数据恢复期望结果
    • 全部TiKV正常启动,没有Region Unavailble error

同学你好,感谢参与 TiDB 4.0 课程的学习!

本篇笔记逻辑清晰、内容丰富,被评选为优质笔记,将额外获得 20 积分,并在 「TiDB 培训」分类下获得“置顶”权益,积分兑换规则将于近期开放,敬请关注!

期待您继续产出优质内容!