
Kubernetes下的mysql高可用方案,也有好几个,不过用的最多的还是Oracle Mysql Operator,毕竟是mysql开发团队自己搞的,比较放心。
安装步骤如下,操作系统为Debian 12:
- 安装软件,运行
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml
然后运行
kubectl get deployment -n mysql-operator mysql-operator
观察安装进度,出现
NAME READY UP-TO-DATE AVAILABLE AGE
mysql-operator 1/1 1 1 1h
说明软件安装已经完成
2. 部署数据库存储
把下列内容保存到文件ms-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
pv: pv004
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath: # where pesistent volume is created on the kubernetes node (needs to be /data for minikube)
path: "/data2"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
pv: pv005
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath: # where pesistent volume is created on the kubernetes node (needs to be /data for minikube)
path: "/data2"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv006
labels:
pv: pv006
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath: # where pesistent volume is created on the kubernetes node (needs to be /data for minikube)
path: "/data2"
运行kubectl apply -f ms-pv.yaml生效,分配3个PV存储单元,容量为1GB,可根据实际需求调整。
把下列内容保存到ms-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: datadir-mycluster-0 #test-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: datadir-mycluster-1 #test-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: datadir-mycluster-2 #test-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
运行kubectl apply -f ms-pvc.yaml生效,分配3个PVC,容量为1GB,请按照实际情况调整。PVC的name分别为datadir-mycluster-n,必须和mysql集群的名字保存一致,请按照实际情况调整。
3. 设置mysql管理员密码,运行
kubectl create secret generic mypwds \
--from-literal=rootUser=root \
--from-literal=rootHost=% \
--from-literal=rootPassword="sakila"
mysql管理员账号是root,密码为sakila,根据实际情况修改。
4. 部署mysql集群,把下列内容保存到mycluster.yaml
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mycluster
spec:
secretName: mypwds
tlsUseSelfSigned: true
instances: 3
router:
instances: 1
datadirVolumeClaimTemplate:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
执行kubectl apply -f mycluster.yaml生效,集群名字为mycluster,部署3个数据库实例和1个数据库路由器实例,存储容量为1GB,根据实际情况调整。
运行
kubectl get innodbcluster --watch
进行观察,出现
NAME STATUS ONLINE INSTANCES ROUTERS AGE
mycluster PENDING 0 3 1 2m6s
...
mycluster ONLINE 3 3 1 10s
说明mysql集群已经上线运行
5. 连接数据库
首先,主机上应该提前安装好mysql,如果没有安装,运行下列命令进行安装
wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb
apt install ./mysql-apt-config_*_all.deb
apt update
apt install mysql-server
然后,运行
kubectl port-forward service/mycluster mysql
重新打开一个终端会话,运行
mysql -h127.0.0.1 -P3306 -uroot -p
输入mysql的管理员root密码,连接到数据库,运行mysql命令
use mysql;
show tables;
exit;
输出正常,说明数据库可以正常连接。
6. 简单测试高可用性
运行命令kubectl get pod | grep mycluster-router ,找到mycluster-router 的pod名
运行
kubectl logs mycluster-router-pod-name | grep mode=RW
kubectl get pod -o wide | grep mycluster
找到集群的primary主机节点,也就是读写节点,关闭该主机。
等待几分钟时间,运行 kubectl get pod -o wide | grep mycluster
,等pod重新调度完毕,所有mycluster-router pod恢复到running状态。
把步骤5重新运行一遍,输出正常,说明高可用性已经生效。
把关闭的主机再打开,过几分钟后,如果发现有个别mysql实例pod处于crashloopbackoff状态,可以先delete掉,kubernetes会自动调度到合适的主机上。
7. 编程连接
编程时,数据库主机名应该是mysql集群的service名字,在本例里面就是mycluster。
可以通过kubectl get service
获取。
参考: