• TIDB-PD-RECOVER的恢复方式


    一、简介

    1.背景

    为了防止因pd出现问题导致pd不可用的情况,tidb官方给出了pd-recover的方法来处理这种情况,本着学习的精神,对几种预想到的想法进行了测试

    2.工具下载

     wget https://download.pingcap.org/tidb-version-linux-amd64.tar.gz
    
    • 1

    3.环境简介

    一共三台pd的机器,集群名字tidb-1

    二、模拟宕机

    1.删除三台(全部为三台)pd机器的data目录模拟宕机

    # 执行后会看到pd,tikv,tidb全部为down,很快pd变为了up
    rm -r pd-2379
    
    • 1
    • 2

    2.删除两台pd机器的data目录模拟宕机

    3.删除两台或者三台pd机器的deploy目录模拟宕机

    4.模拟之前的pd被错误释放,完全无法使用的情况

    # 我这里是ubuntu,这个在所有pd机器上执行
    
    # 查看防火墙状态
    ufw status
    # 开启防火墙
    ufw enable
    # 开启防火墙规则为默认放开原则
    ufw default allow
    # 禁止2379,2380的端口访问
    ufw deny 2379
    ufw deny 2380
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三、恢复集群

    1.针对宕机情况1的恢复

    1.1 查看pd的cluster-id

    # 方式一、通过pd日志获取,这时候会发现有两个cluster-id,这是因为所有pd-data删除之后新建了一个pd集群
    cat pd.log | grep "init cluster id"
    # 方式二、通过tidb日志获取
    cat tidb.log  | grep "init cluster id"
    # 方式三、通过tikv日志获取
    cat tikv.log | grep "connect to PD cluster"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 获取已分配的id

    # 方式一、通过tidb-cluster-pd面板下的cluster下的Current ID allocation 面板获取最大的已分配 ID,需要确保是pd leader(注:删除pd-data这种模拟方式会导致监控看不到数据)
    
    # 方式二、通过pd日志查看,在所有pd机器执行以下命令,找到最大的id,我这里是4000
     cat pd*.log | grep "idAllocator allocates a new id" |  awk -F'=' '{print $2}' | awk -F']' '{print $1}' | sort -r -n | head -n 1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 执行pd-recover

    # 任意一个pd节点执行即可
    # 注意这里的cluster-id是前一个cluster-id,因为后面的cluster-id是新建的pd集群的cluster-id
    ./pd-recover -endpoints http://192.168.1.1:2379 -cluster-id 6747551640615446306 -alloc-id 4000
    
    • 1
    • 2
    • 3

    1.4 重启pd集群

    tiup cluster restart tidb_clustere -R pd
    
    • 1

    2.针对宕机情况2的恢复方式

    2.1 重启pd集群

    # 这时候直接重启pd集群即可,你会发现cluster-id和之前的cluster-id一致
    tiup cluster restart tidb-cluster -R pd
    
    • 1
    • 2

    3.针对宕机情况3的处理方法

    3.1 新建一套只含有pd的集群

    3.1.1 配置文件

    # vim topology-pd.yaml
    global:
      user: "tidb"
      ssh_port: 22
      deploy_dir: "/data/tidb/tidb-deploy"
      data_dir: "/data/tidb/tidb-data"
    
    server_configs:
      pd:
        replication.enable-placement-rules: true
    pd_servers:
      - host: 192.168.1.4
      - host: 192.168.1.5
      - host: 192.168.1.6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.1.2 部署

     tiup cluster deploy tidb-2 v5.4.1 ./topology_pd.yaml --user tidb -p
    
    • 1

    3.2 迁移和更改文件

    将deploy目录复制到之前的集群中,然后将scripts下run_pd.sh的对应信息更改即可

    3.3 特殊情况处理

    如果特别不幸的情况,你在迁移deploy目录之前重启了pd,然后导致pd起不来,用上面的方法也启动不起来,那么可能在上面的步骤后再次进行pd-recover操作

    4.针对宕机情况4的处理方法

    4.1 新建一套集群,方法可以参考3.1

    4.2 对pd集群(tidb-2)进行pd-recover操作

    # 任意一个pd节点执行即可,获取cluster-id和alloc-iid的ne
    ./pd-recover -endpoints http://192.168.1.1:2379 -cluster-id 6747551640615446306 -alloc-id 4000
    
    • 1
    • 2

    4.3 修改tidb/tikv(tidb-1集群)的scripts目录下的run.sh脚本

    vim run_tikv.sh
    # 修改--pd的地址为test-2集群的pd地址
    vim run_tidb.sh
    # 修改--path的地址为test-2集群的pd地址
    
    • 1
    • 2
    • 3
    • 4

    4.4 修改原集群的(tidb-1)meta.yaml文件

    vim .tiup/storage/cluster/clusters/tidb-1/meta.yaml
    # 修改pd部分的信息为tidb-2部分的信息
    
    • 1
    • 2

    4.5 关闭tidb-2集群

    tiup cluster stop tidb-2
    
    • 1

    4.6 重启tidb-1集群

    tiup cluster restart tidb-1
    
    • 1

    4.7 后续处理

    后面可以扩容出三台新的pd,先后将test-2的pd缩容掉,避免两套pd集群产生不利的影响,但是这里扩容又会报pd端口冲突,因为pd在两套集群同时存在,所以端口冲突,所以比较好的解决方式还是拷贝tidb-2的pd集群文件到tidb-1,然后销毁tidb-2的集群,这种操作更好一些

  • 相关阅读:
    5分钟Python安装实战(MAC版本)
    如何转变固定资产管理方式,让企业降本增效?
    061:vue+openlayer画点、线、圆、多边形( 代码示例 )
    【实战】学习 Electron:构建跨平台桌面应用
    【网络】五种IO模型以及select编程详讲
    less学习笔记
    AI时代:探索个人潜能的新视角
    使用LoadRunner错误总结
    MySQL事务隔离级别
    Leetcode刷题Day3----------链表
  • 原文地址:https://blog.csdn.net/line_on_database/article/details/125938140