Kubernetes下的mysql高可用方案,也有好几个,不过用的最多的还是Oracle Mysql Operator,毕竟是mysql开发团队自己搞的,比较放心。

安装步骤如下,操作系统为Debian 12:

  1. 安装软件,运行
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 获取。

参考:

https://github.com/mysql/mysql-operator

https://www.modb.pro/db/561666

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注