• k8s mysql主从


    CHANGE MASTER TO MASTER_HOST='172.16.68.77',MASTER_PORT=31308,MASTER_USER='slave_db',MASTER_PASSWORD='ujmyhn@Sdn1',MASTER_LOG_FILE='master.000006',MASTER_LOG_POS=224951275;start slave;
    View Code

     
    转至元数据结尾
     

    环境: 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工作正常的情况下进行切换)

    mysql-master-check-new.sh Expand source
     

    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"

    汇总的脚本如下:

    mastertoslave.sh Expand source
     

    二、恢复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的步骤

    mysql bak Collapse source
    #!/bin/bash
    #not for incremental
    set -e
    USERNAME="root"
    PASSWORD="MThjN2Y3Zj"
    if [ ! -f /usr/bin/xtrabackup ];then
            sudo  apt install -y percona-xtrabackup-24 --allow-unauthenticated
    fi
    #get path for mysql
    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"
    #KEEP=$(ls -l /data/bak|grep "^d"|sort -rk8|awk 'NR==1,NR==14{print $NF}'|sed "s?$?|?g")
    #KEEPNEW=$(echo ${KEEP%?}|sed 's? ??g')
    #DELD=$(ls /data/bak|grep -vE $KEEPNEW)
    #cd /data/bak && rm -rf $DELD
    echo 'finish'
    echo 'finish'>/tmp/mysql-bak-process.txt
    mysql slave restore Collapse source
    #!/bin/bash
    set -e
    BASEDIR="../yaml"
    ROOTPASSWORD="MThjN2Y3Zj"
    alias ssh="ssh -o ConnectTimeout=10"
    #if [ ! -f /tmp/mysql-restore.txt ];then
        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
    #fi
    ALLMYSQLNU=$(cat /tmp/mysql-restore.txt|wc -l)
    for ((m=1;m<=ALLMYSQLNU;m++));do
    #while read i;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}')
            #add slave label
            if "${OLDMASTERNODE}" != "" ];then
     
                #bakup old data
                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`/"
                #check docker and kubelet service
                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
            #bakup current mysql master
            CMASTERNODE=$(kubectl -n ${NS} get po -o wide|grep ${MYSQLNAME}-deploy|grep Run|awk '{print $(NF-1)}')
            if "${CMASTERNODE}" != "" ];then
                #kubectl label nodes ${CMASTERNODE} ToSlave-
                scp mysql-bak.sh  ${CMASTERNODE}:/tmp/mysql-bak.sh
                ssh ${CMASTERNODE} 'sudo bash -x /tmp/mysql-bak.sh'
            else
                echo "no ${MYSQLNAME} master"
            fi
            #cp bakfile to OLDMASTERNODE
            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
            #delete old master label
            kubectl label nodes ${OLDMASTERNODE} ToMysql-
            #add slave label
            kubectl label nodes ${OLDMASTERNODE} ToSlave=${MYSQLLABEL} --overwrite
             
            #restore Schedule
            kubectl uncordon ${OLDMASTERNODE}
     
            #delete taint
            #kubectl taint nodes ${OLDMASTERNODE} ToMysql:NoSchedule-
            #kubectl taint nodes ${OLDMASTERNODE} ToMysql:NoExecute-
     
            sleep 10
     
            #restore slave yaml
            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</tmp/mysql-restore.txt
    done
    #bash mysql-status.sh
    echo -e " "
    echo "all finished"
  • 相关阅读:
    javascript 基础知识-1
    AngularJs-指令和指令之间的交互(动感超人)
    AngularJs-指令和控制器交互
    奇点大学公开课之尼葛洛庞帝讲述物联网和智能设备
    AngularJs-数据绑定
    AngularJs-指令1
    AngularJs-MVC之路由、模块以及依赖注入
    AngularJS-MVC
    利用canvas制作图片(可缩放和平移)+相框+文字
    Django rest framework 认证组件源码分析
  • 原文地址:https://www.cnblogs.com/hanwei666/p/14372285.html
Copyright © 2020-2023  润新知