0
1
0
0
专栏/.../

7.1 版本 DRAutoSync 非计划内切换小记

 WalterWj  发表于  2024-03-04

操作背景

image.png

如图,当前机房 1 为 DRAutoSync 的主机房。

非计划内切换下,会模拟没有任何操作的情况下,机房 1 直接掉电。然后将机房 2 剩余的节点升级为完整集群,提供服务。

注意由于 primary 集群挂掉,tidb 多副本丢失,机房 2 的节点在恢复前是不提供服务的。

前置条件

  1. 机房二有 tiup 备机,且有完整的镜像源和 ctl 工具
  2. 推荐服务器安装 jq 命令

操作流程

关闭机房 1 所有节点

指定 -N 关闭

tiup cluster stop <cluster-name> -N 172.16.201.18:20160 -y
  • -N 接需要关闭的节点的 ID,ID 可以使用 display 发现

关闭节点后,手动登录数据库会发现无法登录

备份 tiup 的 meta.yaml 文件,且删除主机房信息

进入集群元数据存储目录,tidb-wj 改为集群名

cd ~/.tiup/storage/cluster/clusters/tidb-wj/

备份 meta 文件

cp meta.yaml meta.yaml.bak

手动删除机房 1 的相关节点信息

vi meta.yaml.bak

脚本化

这个步骤可以使用脚本

#!/bin/bash
function parse_args() {
    local tiup_base_dir=""
    local cluster_name=""
    local del_node_ip_list=""    
    # 解析参数
    for arg in "$@"
    do
        case $arg in
            tiup_base_dir=*)
                tiup_base_dir="${arg#*=}"
                shift
                ;;
            cluster_name=*)
                cluster_name="${arg#*=}"
                shift
                ;;
                        del_node_ip_list=*)
                            del_node_ip_list="${arg#*=}"
                                ;;
            *)
                echo "Unknown argument: $arg"
                exit 1
                ;;
        esac
    done

    # 检查必要参数是否存在
    if [ -z "$tiup_base_dir" ]; then
        echo "Missing required argument: tiup_base_dir"
    fi


    if [ -z "$cluster_name" ]; then
        echo "Missing required argument: cluster_name"
    fi
        
        if [ -z "$del_node_ip_list" ]; then
        echo "Missing required argument: del_node_ip_list"
    fi

    # 返回参数
    echo "$tiup_base_dir" "$cluster_name" "$del_node_ip_list"
}

function createnewmatefile() {
    local tiup_base_dir="$1"
    local cluster_name="$2"
    local del_node_ip_list="$3"
    rm -f /tmp/DR-Auto-Sync_Failover-tmp1.log
    rm -f /tmp/DR-Auto-Sync_Failover-tmp2.log
        if [ $context_status -eq "0" ];then
                echo "上下文状态异常!"
                exit 1
        fi
      
    echo " 创建集群新的mate文件"

    cd $tiup_base_dir/storage/cluster/clusters/$cluster_name/
    
    cp meta.yaml meta.yaml.bak_`date +%Y%m%d%H%M%S`
    if [ "$?" -eq "0" ];then
        echo -e "mate.yaml 备份成功!"
    else
        echo -e "mate。yaml 备份失败!"
                context_status=0
        exit 1
    fi
    
    
    cp meta.yaml meta_tmp.yaml
    sed -i '/^ \{2\}[a-z-].*$/icutline' meta_tmp.yaml
    if [ "$?" -eq "0" ];then
        echo -e "mate.yaml标记成功!"
    else
        echo -e "mate.yaml标记失败!"
                context_status=0
        exit 1
    fi
    
    
    echo $del_node_ip_list > /tmp/del_node_list.txt
    sed -i 's/,/ /g' /tmp/del_node_list.txt
    del_node_ip_list=`cat /tmp/del_node_list.txt`
    for i in $del_node_ip_list
    do
      echo $i
      sed -n  "/  - host: ${i}/,/cutline/=" meta_tmp.yaml >> /tmp/DR-Auto-Sync_Failover-tmp1.log
    done
    
    
    echo -n "sed -i " >> /tmp/DR-Auto-Sync_Failover-tmp2.log
    
    
    for j in `cat /tmp/DR-Auto-Sync_Failover-tmp1.log`
    do
      echo -n "-e \"${j}d\" " >> /tmp/DR-Auto-Sync_Failover-tmp2.log
    done
    
    echo -n "meta_tmp.yaml" >> /tmp/DR-Auto-Sync_Failover-tmp2.log
    
    
    sh /tmp/DR-Auto-Sync_Failover-tmp2.log 
    grep -v cutline meta_tmp.yaml > meta.yaml
    

    
}
context_status=1
# 解析参数
args=$(parse_args "$@")

# 调用元数据备份函数
createnewmatefile $args

调用脚本需要传入:

  • tiup_base_dir : tiup 基础目录(~/.tiup)
  • cluster_name : 集群名
  • del_node_ip_list : 需要删除的节点信息。

这个脚本会匹配 nod ip list,将需要删除的行记录,然后进行过滤写入 meta.yaml 文件中。

这步之后,在机房 2 查看集群信息,就只会查看到机房 2 的节点信息了。

使用命令:

sh test.sh tiup_base_dir=~/.tiup cluster_name=tidb-wj del_node_ip_list=172.16.201.18

可以查看 meta.yaml 文件中相关 IP 新全部被删除成功

PD 恢复

恢复前关闭集群 & 刷新加脚本和配置

tiup cluster stop <cluster-name> -y
tiup cluster reload <cluster-name> --skip-restart --force -y 

登录 PD 节点,修改脚本内容

sed -i '/pd-server/ s#pd-server#pd-server --force-new-cluster#' run_pd.sh

# 启动 pd 组件
tiup cluster start <cluster-name> -R pd -y

使用 pd-recover 命令恢复 pd 组件

./bin/pd-recover --from-old-member --endpoints=http://127.0.0.1:2379 # 指定对应的 PD 地址

出现 recovery is successful 的提示信息即可。

过 10s 后,重启下 pd 节点

10s 无特殊意义,只是最好等一会操作

tiup cluster reload <cluster-name> -N ip:2379 -y 

调度规则恢复

中控机操作即可,这里规则可以按照实际需要进行调整

cat > /tmp/dr-auto-sync_rules_dr.json <<EOF
[
  {
    "group_id": "pd",
    "group_index": 0,
    "group_override": false,
    "rules": [
      {
        "group_id": "pd",
        "id": "voters",
        "start_key": "",
        "end_key": "",
        "role": "voter",
        "count": 3,
        "location_labels": ["dc","logic","rack", "host"]
       
      }
    ]
  }
]
EOF

应用规则

tiup ctl:${cluster_version} pd -u http://${pd_conn} config placement-rules rule-bundle save --in="/tmp/dr-auto-sync_rules_dr.json"

关闭 DRAutoSync

tiup ctl:${cluster_version} pd -u http://${pd_conn} config set replication-mode majority

以上成功后,PD 基本就 OK 了

TIKV 恢复

启动 TIKV 节点

tiup cluster start <cluster-name> -R tikv

获取异常 tikv 的 store id

tiup ctl:${cluster_version} pd -u http://${pd_conn} store

在线删除异常 tikv 节点

tiup ctl:${cluster_version} pd -u http://${pd_conn} unsafe remove-failed-stores <store_id1,store_id2,...>

# 如果 store id 找不到,可以使用 auto detect
tiup ctl:${cluster_version} pd -u http://${pd_conn} unsafe remove-failed-stores --auto-detect

查看进度

tiup ctl:${cluster_version} pd -u http://${pd_conn} unsafe remove-failed-stores show

当 remove 完成后

启动整个集群

tiup cluster start <cluster-name> -y

留存信息清理

tiup cluster prune <cluster-name>

以上操作完成后,集群可以正常登录使用。

如果需要做高可用扩容等,按需操作即可。

0
1
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论