构建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
从库复制工具
- 当 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