构建xtrabackup

docker build -t registry.cn-zhangjiakou.aliyuncs.com/qy566/xtrabackup:8.0.34 --rm .

部署进度

你可以通过运行以下命令查看启动进度:

kubectl get pods -l app=mysql -n mysql-db --watch 

测试mysql

  • 发送客户端请求写入数据
    kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never --\
      mysql -h mysql.mysql-db <<EOF
    CREATE DATABASE test;
    CREATE TABLE test.messages (message VARCHAR(250));
    INSERT INTO test.messages VALUES ('hello');
    EOF
    
  • 在从库中查看
    kubectl run mysql-client --image=mysql:5.7 -i -t --rm --restart=Never --\
      mysql -h mysql-read.mysql-db -e "SELECT * FROM test.messages"
    
  • mysql-read 服务在服务器之间分配连接
    kubectl run mysql-client-loop --image=mysql:5.7 -i -t --rm --restart=Never --  bash -ic "while sleep 1; do mysql -h mysql-read.mysql-db -e 'SELECT @@server_id,NOW()'; done"
    //执行完成后删除
    kubectl delete pods mysql-client-loop
    

模拟 Pod 和 Node 失效

  • 破坏就绪态探测
    将mysql-2的探针移除校验探测

    kubectl exec mysql-2 -c mysql.mysql-db -- mv /usr/bin/mysql /usr/bin/mysql.off
    
  • 删除 Pod
    如果删除了 Pod,则 StatefulSet 还会重新创建 Pod,类似于 ReplicaSet 对无状态 Pod 所做的操作
    StatefulSet 控制器注意到不再存在 mysql-2 Pod,于是创建一个具有相同名称并链接到相同 PersistentVolumeClaim 的新 Pod。 你应该看到服务器 ID 102 从循环输出中消失了一段时间,然后又自行出现

      kubectl delete pod mysql-2 -n mysql-db
    
  • 腾空节点

      kubectl get pod mysql-2 -o wide
      //腾空一个 Node 可能影响到在该节点上运行的其他负载和应用。 只应在测试集群上执行下列步骤。
     kubectl drain master --force --delete-local-data --ignore-daemonsets
    
  • 域名自动规则

    • [hostname] yaml中配置的hostname
    • [subdomain] yaml中配置的subdomain
    • [namespace] 为Pod所在的命名空间
    • [cluster-domain] 默认为 cluster.local
      [hostname].[subdomain].[namespace].svc.[cluster-domain]
      ## 此时pod域名为 mysql部署使用的subdomain是serviceName配置
      mysql-0.mysql.mysql-base-db.svc.cluster.local
    

部署问题处理

  • 使用自己定义的pv部署,部署如果有问题,删除pv时候只能通过kubectl delete进行删除
  • 镜像下载问题,XtraBackup 1.0镜像是不能在官方镜像进行下载,需要从已经做好的镜像仓库中下载.
  • 部署时候需要指定对应的namespace,默认的namespace是mysql-db

从库复制工具

千云GPS平台 -在k8s上部署Mysql-LMLPHP

  • 当 innobackupex 命令开始备份的时候,首先会启动 xtrabackup 进程,xtrabackup 又分为两个线程,一个用于拷贝 ibd 文件,一个用于拷贝 redo 文件,redo 的拷贝线程只有一个,在 ibd 的拷贝线程启动前启动,在 ibd 的拷贝线程结束后结束。
  • xtrabackup 拷贝完成 idb 后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝)
  • innobackupex 收到 xtrabackup 通知后,执行 FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位置点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par 等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,非 InnoDB 表(主要 是MyISAM)如果比较多的话整库只读时间就会比较长。
  • 当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);
  • xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex,redo log 拷贝完成(通过创建文件);
  • innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
  • 最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出

生产环境部署步骤&文件

创建存储

由于要统一计算资源,所以需要统一规划部署
存储规划中

创建命名空间

apiVersion
03-11 03:54