部署需求
在k8s上部署mysql主从集群可以提高数据的可用性和容错能力。下面是一个简单的步骤:
搭建一个一主2 从的 MySQL 集群;
从节点可以水平扩展;
保证数据库的读写分离.
环境准备
使用的部署环境
- kubenates: v1.22.12
- dockers:20.10.8
需要镜像
- xtrabackup:8.0.34 可以自己制作 xtrabackup 镜像(可选,自己制作下边有步骤)
- MySQL:8.0.18
MySQL集群搭建(一主二从)
使用xtrabackup来同步主数据库的数据,xtrabackup版本需要和数据库对应
从库复制工具
- 当 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 子进程结束后退出
在k8s上创建命名空间
kubectl create namespace mysql
创建 StorageClass 动态存储(动态生成pv)
- 文件系统
这里使用的NFS,这个在之前的文章提到过.
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-mysql-0
namespace: mysql-db
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: nfs-persist
nfs:
path: /nfs/data/mysql-db-0
server: 10.0.0.27
claimRef:
name: nfs地址
namespace: mysql-db
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-mysql-1
namespace: mysql-db
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: nfs-persist
nfs:
path: /nfs/data/mysql-db-1
server: nfs地址
claimRef:
name: data-mysql-1
namespace: mysql-db
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-mysql-2
namespace: mysql-db
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: nfs-persist
nfs:
path: /nfs/data/mysql-db-2
server: nfs地址
claimRef:
name: data-mysql-2
namespace: mysql-db
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: data-mysql-1
namespace: mysql-db
annotations:
kubesphere.io/alias-name: mysql
kubesphere.io/creator: admin
volume.beta