作者: Ju4t
本实验对PolarDB-X中如何对无法继续提供服务的存储节点发起重搭,即备库重搭。
本步骤将指导您如何安装Docker、kubectl、minikube和Helm3。
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
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
执行如下命令,下载并安装minikube。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
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
执行如下命令,安装MySQL。
yum install mysql -y
本步骤将指导您如何创建一个简单的Kubernetes集群并部署PolarDB-X Operator ,使用Operator部署一个完整的PolarDB-X集群,详细文档请参考通过Kubernetes安装PolarDB-X。
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'.
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
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 执行如下命令,设置端口转发并保持进程存活。
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
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
说明:您需要将命令中的{上文获得的密码}替换为上一步骤获取的密码。
mysql -h127.1 -upolardbx_root -p{上文获得的密码} -Ac -e "create database sysbench_test"
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节点无法提供服务的场景。备库重搭的目标节点,不允许是leader节点。
说明:本实验中只有一个follower dn pod,因此可使用如下命令。
kubectl exec -it `kubectl get pods -l xstore/name,xstore/role=follower,polardbx/role=dn -o name` bash
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)
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
本步骤将指导您如何发起备库重搭。
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
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
退出Pod后,清理重搭任务。
kubectl delete xf rebuildjob