环境: ubuntu 16.04
k8s版本: 1.11.5
目标:mysql master挂机后切换到mysql slave上运行(以mysql-open为例)
需要root免密 sudo免密
devtest-node112 mysql-open-master
devtest-node121 mysql-open-slave
一、主从切换 (大约为1-2分钟左右切换完成)
1.检测mysql master 运行情况(每分钟执行一次,失败5次而且slave工作正常的情况下进行切换)
2.给老的标签打上SchedulingDisabled ,命令如下
kubectl cordon devtest-node112
3.去除mysql slave的slave设置,使用mysql客户端执行如下命令:
stop slave;reset master;reset slave all;
4.删除mysql slave的deploy
kubectl delete deploy mysql-open-deploy
kubectl delete po mysql-open-slave-deploy-xxxxx --grace-period=0 --force
5.删除slave标签
kubectl label nodes devtest-node121 ToSlave-
6.给slave节点打上master的label
kubectl label nodes devtest-node121 ToMysql=mysql-open
7.删除原有的myql-open-master 的pod
kubectl delete po mysql-open-deploy-xxxxx --grace-period=0 --force
完成主切换到slave节点上,如果密码和用户不一致请修正脚本内容
S_MYSQL_U="root"
S_MYSQL_P="123456"
汇总的脚本如下:
二、恢复slave节点 (恢复时间的长短,取决于数据库备份和scp的时间)
现在的情况是 devtest-node121 为主节点,devtest-node112 已经可以正常运行
1.备份devtest-node121 上的数据,为从节点完成初始化数据(使用percona-xtrabackup,由于使用的mysql 5.7的 ,xtrabackup请使用2.x的版本)
红色部分根据实际情况进行调整
innobackupex --user=USERNAME --password=PASSWORD --datadir=mysqldata_path -S mysqldata_path/mysql.sock /data/bak
2.复制备份的文件到需要创建slave的节点上这里是 devtest-node138
scp -r /data/bak/2020-xxxx-xxxx-xxxx devtest-node112:/data/mysql-open-slave
chown -R 999:999 /data/mysql-open-slave
3.打上slave的label,并去除原来的master的label
kubectl label nodes devtest-node112 ToSlave=mysql-open ToMysql-
4.恢复调度的机制
kubectl uncordon devtest-node112
5.重新创建slave
kubectl apply -f path/mysql-open-slave-deploy.yaml
6.等pod起来后,使用mysql客户端执行如下命令,红色部分为根据实际情况选填
CHANGE MASTER TO MASTER_HOST='mysql-open-master',MASTER_USER='slaveuser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master.000001',MASTER_LOG_POS=154;start slave;
mysql-open-master-----》mysql-master的主机名或svc地址
slaveuser -----》建立主从的用户名
123456 -----》建立主从的密码
master.000001 -----》二进制文件的名称 (cat /data/mysql-open-slave/xtrabackup_binlog_info,第一列)
154 -----》二进制文件的执行的字符数 (cat /data/mysql-open-slave/xtrabackup_binlog_info,第二列)

7.查看slave的状态,使用mysql客户端执行
show slave statusG;
汇总恢复部分脚本1-6的步骤
#!/bin/bash
set -e
USERNAME="root"
PASSWORD="MThjN2Y3Zj"
if [ ! -f /usr/bin/xtrabackup ];then
sudo apt install -y percona-xtrabackup-24 --allow-unauthenticated
fi
DOCKERID=$(sudo docker ps|grep mysql|grep -v pause|awk '{print $1}')
if [ "${DOCKERID}" == "" -o $(echo ${DOCKERID}|sed 's? ?
?g'|wc -l) -ne 1 ];then
echo "no mysql server or mysql server is not 1,please check"
exit 0
fi
sudo docker inspect -f {{.State.Pid}} ${DOCKERID}
MPATH=$(sudo docker inspect $DOCKERID |grep :/var/lib/mysql|sed 's?"??g'|awk -F ":" '{print $1}'|awk '{print $1}')
mkdir -p /data/bak
sudo chmod -R 777 /data/bak
innobackupex --user=${USERNAME} --password=${PASSWORD} --datadir=${MPATH} -S ${MPATH}/mysql.sock /data/bak
i=$(sudo ls /data/bak/ -l|grep ^d|awk '{print $NF}'|grep ^20|tail -1)
innobackupex --apply-log /data/bak/"$i"
echo 'finish'
echo 'finish'>/tmp/mysql-bak-process.txt
|
#!/bin/bash
set -e
BASEDIR="../yaml"
ROOTPASSWORD="MThjN2Y3Zj"
alias ssh="ssh -o ConnectTimeout=10"
kubectl get po -o wide --all-namespaces|grep -w mysql|grep Running|grep -v slave|awk '{print $1,$2,$(NF-1)}'>/tmp/mysql-restore.txt
ALLMYSQLNU=$(cat /tmp/mysql-restore.txt|wc -l)
for ((m=1;m<=ALLMYSQLNU;m++));do
i=$(cat /tmp/mysql-restore.txt|awk NR==$m'{print}')
NS=$(echo $i|awk '{print $1}')
MYSQLNAME=$(echo $i|awk '{print $2}'|awk -F "-deploy" '{print $1}')
STATUSSLAVE=$(kubectl -n ${NS} get po|grep ${MYSQLNAME}-slave|wc -l)
if [ ${STATUSSLAVE} -eq 0 ];then
if [ $(echo ${MYSQLNAME}|grep terminal|wc -l) -eq 1 ];then
MYSQLLABEL="mysql-terminal"
else
MYSQLLABEL="${MYSQLNAME}"
fi
OLDMASTERNODE=$(kubectl get nodes --show-labels|grep SchedulingDisabled|grep -w "${MYSQLLABEL}"|awk '{print $1}')
if [ "${OLDMASTERNODE}" != "" ];then
MYSQL_DATA_BAK="$(ssh ${OLDMASTERNODE} sudo ls -d /data/mysql*)"
ssh ${OLDMASTERNODE} "sudo mkdir -p /data/oldbak/`date +%F`"
ssh ${OLDMASTERNODE} "sudo mv /data/mysql* /data/oldbak/`date +%F`/"
if [ "$(ssh ${OLDMASTERNODE} sudo systemctl status docker|grep Active|awk '{print $2}')" != "active" ];then
ssh ${OLDMASTERNODE} sudo systemctl start docker
fi
if [ "$(ssh ${OLDMASTERNODE} sudo systemctl status kubelet|grep Active|awk '{print $2}')" != "active" ];then
ssh ${OLDMASTERNODE} sudo systemctl start kubelet
fi
else
echo "no node can use,please check"
exit 0
fi
CMASTERNODE=$(kubectl -n ${NS} get po -o wide|grep ${MYSQLNAME}-deploy|grep Run|awk '{print $(NF-1)}')
if [ "${CMASTERNODE}" != "" ];then
scp mysql-bak.sh ${CMASTERNODE}:/tmp/mysql-bak.sh
ssh ${CMASTERNODE} 'sudo bash -x /tmp/mysql-bak.sh'
else
echo "no ${MYSQLNAME} master"
fi
BAKPATH=$(ssh ${CMASTERNODE} "sudo ls /data/bak/ -l|grep ^d|awk '{print $NF}'|grep ^20|tail -1")
if [ "${BAKPATH}" != "" ];then
ssh ${CMASTERNODE} sudo chmod 755 -R /data/bak
ssh ${OLDMASTERNODE} sudo mkdir -p /data/${MYSQLNAME}-slave
ssh ${OLDMASTERNODE} sudo chmod -R 777 /data/${MYSQLNAME}-slave
ssh -t ${OLDMASTERNODE} scp -r ${CMASTERNODE}:/data/bak/${BAKPATH}/* /data/${MYSQLNAME}-slave
ssh ${OLDMASTERNODE} sudo chown -R 999:999 /data/${MYSQLNAME}-slave
fi
kubectl label nodes ${OLDMASTERNODE} ToMysql-
kubectl label nodes ${OLDMASTERNODE} ToSlave=${MYSQLLABEL} --overwrite
kubectl uncordon ${OLDMASTERNODE}
sleep 10
kubectl apply -f ${BASEDIR}/${MYSQLNAME}-slave-deploy.yaml
sleep 5
kubectl -n ${NS} get po|grep -w ${MYSQLNAME}
sleep 15
BINNAME=$(ssh ${OLDMASTERNODE} cat /data/${MYSQLNAME}-slave/xtrabackup_binlog_info|awk '{print $1}')
BINPOS=$(ssh ${OLDMASTERNODE} cat /data/${MYSQLNAME}-slave/xtrabackup_binlog_info|awk '{print $2}')
NSLAVENAME=$(kubectl -n ${NS} get po -o wide|grep ${MYSQLNAME}-slave|awk '{print $1}')
SLAVECMD="CHANGE MASTER TO MASTER_HOST='${MYSQLNAME}-master',MASTER_USER='slave_db',MASTER_PASSWORD='ujmyhn@Sdn1',MASTER_LOG_FILE='${BINNAME}',MASTER_LOG_POS=${BINPOS};start slave;"
kubectl -n ${NS} exec -it ${NSLAVENAME} -- mysql -u"root" -p"$ROOTPASSWORD" -e "${SLAVECMD}"
echo "${MYSQLNAME} restore finish"
fi
done
echo -e "
"
echo "all finished"
|