对PolarDB-X的存储节点发起备库重搭

作者: Ju4t

本实验对PolarDB-X中如何对无法继续提供服务的存储节点发起重搭,即备库重搭。

安装环境

本步骤将指导您如何安装Docker、kubectl、minikube和Helm3。

  1. 安装Docker。

​ 1.1 执行如下命令,安装Docker。

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

​ 1.2 执行如下命令,启动Docker。

systemctl start docker
  1. 安装kubectl。

​ 2.1 执行如下命令,下载kubectl文件。

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

​ 2.2 执行如下命令,赋予可执行权限。

chmod +x ./kubectl

​ 2.3 执行如下命令,移动到系统目录。

mv ./kubectl /usr/local/bin/kubectl
  1. 安装minikube。

执行如下命令,下载并安装minikube。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  1. 安装Helm3。

​ 4.1 执行如下命令,下载Helm3。

wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/helm-v3.9.0-linux-amd64.tar.gz

4.2 执行如下命令,解压Helm3。

tar -zxvf helm-v3.9.0-linux-amd64.tar.gz

4.3 执行如下命令,移动到系统目录。

mv linux-amd64/helm /usr/local/bin/helm
  1. 安装MySQL。

执行如下命令,安装MySQL。

yum install mysql -y

使用PolarDB-X Operator安装PolarDB-X

本步骤将指导您如何创建一个简单的Kubernetes集群并部署PolarDB-X Operator ,使用Operator部署一个完整的PolarDB-X集群,详细文档请参考通过Kubernetes安装PolarDB-X

  1. 使用minikube创建Kubernetes集群。

minikube是由社区维护的用于快速创建Kubernetes测试集群的工具,适合测试和学习Kubernetes。使用minikube创建的Kubernetes集群可以运行在容器或是虚拟机中,本实验场景以CentOS 7.9上创建Kubernetes为例。

说明:如果您使用其他操作系统部署minikube,例如macOS或Windows,部分步骤可能略有不同。

1.1 执行如下命令,新建账号galaxykube,并将galaxykube加入docker组中。minikube要求使用非root账号进行部署,所以您需要新建一个账号。

useradd -ms /bin/bash galaxykube
usermod -aG docker galaxykube

1.2 执行如下命令,切换到账号galaxykube。

su galaxykube

1.3 执行如下命令,进入到home/galaxykube目录。

cd

1.4 执行如下命令,启动一个minikube。

说明:这里我们使用了阿里云的minikube镜像源以及上海交大提供的docker镜像源来加速镜像的拉取。

minikube start --cpus 4 --memory 12288 --nodes=2 --image-mirror-country cn --registry-mirror=https://docker.mirrors.sjtug.sjtu.edu.cn --kubernetes-version 1.23.3

返回结果如下,表示minikube已经正常运行,minikube将自动设置kubectl的配置文件。

😄  minikube v1.28.0 on Centos 7.9.2009 (amd64)
✨  Automatically selected the docker driver
✅  Using image repository registry.cn-hangzhou.aliyuncs.com/google_containers
📌  Using Docker driver with root privileges
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
    > registry.cn-hangzhou.aliyun...:  386.27 MiB / 386.27 MiB  100.00% 7.23 Mi
    > registry.cn-hangzhou.aliyun...:  0 B [_____________________] ?% ? p/s 34s
🔥  Creating docker container (CPUs=4, Memory=12288MB) ...
🐳  Preparing Kubernetes v1.23.3 on Docker 20.10.20 ...
    ▪ kubelet.cni-conf-dir=/etc/cni/net.mk
    > kubectl.sha256:  64 B / 64 B [-------------------------] 100.00% ? p/s 0s
    > kubelet.sha256:  64 B / 64 B [-------------------------] 100.00% ? p/s 0s
    > kubeadm.sha256:  64 B / 64 B [-------------------------] 100.00% ? p/s 0s
    > kubectl:  44.43 MiB / 44.43 MiB [-------------] 100.00% 4.57 MiB p/s 9.9s
    > kubeadm:  43.12 MiB / 43.12 MiB [--------------] 100.00% 4.07 MiB p/s 11s
    > kubelet:  118.75 MiB / 118.75 MiB [------------] 100.00% 7.09 MiB p/s 17s
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔗  Configuring CNI (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass

👍  Starting worker node minikube-m02 in cluster minikube
🚜  Pulling base image ...
🔥  Creating docker container (CPUs=4, Memory=12288MB) ...
🌐  Found network options:
    ▪ NO_PROXY=192.168.49.2
🐳  Preparing Kubernetes v1.23.3 on Docker 20.10.20 ...
    ▪ env NO_PROXY=192.168.49.2
🔎  Verifying Kubernetes components...

❗  /usr/local/bin/kubectl is version 1.25.4, which may have incompatibilities with Kubernetes 1.23.3.
    ▪ Want kubectl v1.23.3? Try 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

1.5 执行如下命令,使用kubectl查看集群信息。

kubectl cluster-info

返回如下结果,您可以查看到集群相关信息。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  1. 部署 PolarDB-X Operator。

2.1 执行如下命令,创建一个名为polardbx-operator-system的命名空间。

kubectl create namespace polardbx-operator-system

2.2 执行如下命令,安装PolarDB-X Operator。

helm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com
helm install --namespace polardbx-operator-system polardbx-operator polardbx/polardbx-operator --version 1.3.0

2.3 执行如下命令,查看PolarDB-X Operator组件的运行情况。

kubectl get pods --namespace polardbx-operator-system

返回结果如下,请您耐心等待2分钟,等待所有组件都进入Running状态,表示PolarDB-X Operator已经安装完成。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get pods --namespace polardbx-operator-system -w
NAME                                           READY   STATUS    RESTARTS   AGE
polardbx-controller-manager-78bc94667c-jrbtt   1/1     Running   0          93s
polardbx-hpfs-9gzh9                            1/1     Running   0          93s
polardbx-hpfs-lvdtj                            1/1     Running   0          93s
polardbx-tools-updater-7pxjj                   1/1     Running   0          93s
polardbx-tools-updater-z6ttz                   1/1     Running   0          93s
  1. 部署 PolarDB-X 集群。

3.1 执行如下命令,创建polardb-x.yaml。

vim polardb-x.yaml

3.2 按i键进入编辑模式,将如下代码复制到文件中,然后按ECS退出编辑模式,输入:wq后按下Enter键保存并退出。

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: polardb-x
spec:
  topology:
    nodes:
      cdc:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 500Mi
      cn:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 500m
              memory: 1Gi
      dn:
        replicas: 1
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 500m
              memory: 500Mi
      gms:
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 500Mi

3.3 执行如下命令,创建PolarDB-X集群。

kubectl apply -f polardb-x.yaml

3.4 执行如下命令,查看PolarDB-X集群创建状态。

kubectl get polardbxCluster polardb-x -o wide -w

返回结果如下,请您耐心等待七分钟左右,当PHASE显示为Running时,表示PolarDB-X集群已经部署完成。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get polardbxCluster polardb-x -o wide -w
NAME        PROTOCOL   GMS   CN    DN    CDC   PHASE      DISK   STAGE   REBALANCE   VERSION   AGE
polardb-x   8.0        0/1   0/1   0/1   0/1   Creating                                        4s
polardb-x   8.0        0/1   0/1   1/1   0/1   Creating                                        3m53s
polardb-x   8.0        1/1   0/1   1/1   0/1   Creating                                        3m58s
polardb-x   8.0        1/1   0/1   1/1   1/1   Creating                                        6m9s
polardb-x   8.0        1/1   1/1   1/1   1/1   Running    7.2 GiB                       8.0.3-PXC-5.4.15-20221116/8.0.18   6m39s

3.6 按Ctrl+C键,退出查看PolarDB-X集群创建状态。

准备业务数据

本步骤将指导您如何准备业务数据。

  1. 设置本地转发。

1.1 执行如下命令,设置端口转发并保持进程存活。

nohup kubectl port-forward svc/polardb-x 3306 > forward.log 2>&1 &

1.2 执行如下命令,查看输出日志,确认是否转发成功。

cat forward.log

返回结果如下,表示转发成功。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ cat forward.log
nohup: ignoring input
Forwarding from 127.0.0.1:3306 -> 3306
Forwarding from [::1]:3306 -> 3306
  1. 执行如下命令,获取登录密码。
kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "

返回结果如下,你可查看到密码。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "
Password:  2w5pdls5
  1. 执行如下命令,建库。

说明:您需要将命令中的{上文获得的密码}替换为上一步骤获取的密码。

mysql -h127.1 -upolardbx_root -p{上文获得的密码} -Ac -e "create database sysbench_test"
  1. 导入数据。

4.1 依次执行如下命令,安装sysbench。

#回到root用户
exit

#安装sysbench
sudo yum -y install sysbench

#登录到galaxykube
su galaxykube

cd

说明:您可通过sysbench --help查看是否安装成功。

4.2 执行如下命令,导入数据。

说明:您需要将命令中的{数据库密码}替换为上文中获取的密码。

sysbench oltp_insert --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=polardbx_root --mysql-password={数据库密码} --mysql-db=sysbench_test --db-driver=mysql --tables=1 --table-size=10000 --report-interval=1 prepare

模拟DN节点无法提供服务的场景

本步骤将指导您如何模拟DN节点无法提供服务的场景。备库重搭的目标节点,不允许是leader节点。

  1. 执行如下命令,登录角色为follower的DN Pod。

说明:本实验中只有一个follower dn pod,因此可使用如下命令。

kubectl exec -it `kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn -o name` bash
  1. 查看某个表的checksum。

2.1 执行如下命令,登录mysql控制台。

myc

2.2 执行如下命令,选择一个分库。

show databases;

use sysbench_test_single

2.3 执行如下命令,查看这个库下的表,通过checksum table {表名}来查看这个表的checksum值。

show tables; #查看表

checksum table {表名};  #查看该表的checksum

exit

返回结果如下,您需要记录库表名及其checksum。

mysql> checksum table sbtest1_cnze;
+-----------------------------------+------------+
| Table                             | Checksum   |
+-----------------------------------+------------+
| sysbench_test_single.sbtest1_cnze | 1843956500 |
+-----------------------------------+------------+
1 row in set (0.02 sec)
  1. 破坏数据文件。

3.1 执行如下命令,删除数据文件。

rm -fR /data/mysql/data

3.2 执行如下命令,登录mysql控制台,执行shutdown。

myc

shutdown;

3.3 查看该Pod的状态。
在新的终端中,执行如下命令,切换到galaxykube用户。

su galaxykube
cd

在新的终端中,执行如下命令,查看Pod状态。

kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn -w

返回结果如下,您可看见该Pod的状态会变为NotReady。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn -w
NAME                         READY   STATUS    RESTARTS   AGE
polardb-x-wp7d-dn-0-cand-1   3/3     Running   0          13m
polardb-x-wp7d-dn-0-cand-1   2/3     Running   0          13m
polardb-x-wp7d-dn-0-cand-1   2/3     Running   1 (3s ago)   13m
polardb-x-wp7d-dn-0-cand-1   2/3     NotReady   1 (21s ago)   14m
polardb-x-wp7d-dn-0-cand-1   2/3     Running    2 (2s ago)    14m
polardb-x-wp7d-dn-0-cand-1   2/3     NotReady   2 (21s ago)   14m

发起备库重搭

本步骤将指导您如何发起备库重搭。

  1. 执行如下命令,获取输入参数。
  • 需要重搭的POD的名称
  • 需要重搭的POD所在的xstore名称(可查看POD的label xstore/name的值)
kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn --show-labels

返回结果如下,您可查看到重搭的POD的名称和重搭的POD所在的xstore名称。

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn --show-labels
NAME                         READY   STATUS             RESTARTS      AGE   LABELS
polardb-x-wp7d-dn-0-cand-1   2/3     CrashLoopBackOff   3 (22s ago)   15m   polardbx/dn-index=0,polardbx/name=polardb-x,polardbx/rand=wp7d,polardbx/role=dn,xstore/config-hash=ad24c8c853b4d49b36aca6ac2c6848a89dbb1d63,xstore/generation=2,xstore/name=polardb-x-wp7d-dn-0,xstore/node-role=candidate,xstore/node-set=cand,xstore/pod=polardb-x-wp7d-dn-0-cand-1,xstore/port-lock=17254,xstore/role=follower

polardb-x-wp7d-dn-0-cand-1
xstore/name=polardb-x-wp7d-dn-0
  1. 发起备库重搭任务。

2.1 执行如下命令,通过vi创建rebuildjob.yaml文件.

vi rebuildjob.yaml

2.2按i键进入编辑模式,将如下代码复制到文件中,填入“需要重搭(无法提供服务)的POD名称”“被重搭(无法提供服务)的POD所在xstore的名称”,然后按ECS退出编辑模式,输入:wq后按下Enter键保存并退出。

apiVersion: polardbx.aliyun.com/v1
kind: XStoreFollower
metadata:
  name: rebuildjob
spec:
  local: false
  targetPodName: {{需要重搭的POD名称}}
  xStoreName: {{被重搭的POD所在xstore的名称}}

2.3 执行如下命令,创建重搭任务。

kubectl apply -f rebuildjob.yaml

3.观察重搭任务状态

3.1 执行如下命令,观察重搭任务状态。

最后返回结果为FollowerPhaseSuccess则表示重搭成功。

kubectl get xf -w

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get xf -w
NAME         PHASE                        MESSAGE
rebuildjob   FollowerPhaseMonitorBackup   
rebuildjob   FollowerPhaseBeforeRestore   
rebuildjob   FollowerPhaseBeforeRestore   
rebuildjob   FollowerPhaseBeforeRestore   
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseRestore         
rebuildjob   FollowerPhaseSuccess  

3.2 执行如下命令,查看POD状态。如果READY为3/3,且STATUS为Running表示重搭成功。

kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn

[galaxykube@iZuf65oiq2xndi8sgamy58Z ~]$ kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn
NAME                         READY   STATUS    RESTARTS   AGE
polardb-x-wp7d-dn-0-cand-1   3/3     Running   0          3m19s

4.校验数据。

4.1 执行如下命令,登录POD。

kubectl exec -it `kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn -o name` bash

4.2 执行如下命令,登录mysql控制台。

myc

4.3 执行校验语句,检查checksum是否和破坏数据前一致。

show databases;

use sysbench_test_single

show tables;

checksum table {记录的表名};  #查看该表的checksum

mysql> checksum table sbtest1_cnze;
+-----------------------------------+------------+
| Table                             | Checksum   |
+-----------------------------------+------------+
| sysbench_test_single.sbtest1_cnze | 1843956500 |
+-----------------------------------+------------+
1 row in set (0.04 sec)

exit
  1. 清除重搭任务。

退出Pod后,清理重搭任务。

kubectl delete xf rebuildjob