Kubernetes部署MySQL主从同步并读写分离

本篇内容是在Kubernetes部署MySQL主从同步并读写分离。

由于笔者在Kubernetes上是新手,刚刚入门,所以参考了网上其它人写的文章来完成这一过程。

参考教程链接

  1. https://cloud.tencent.com/developer/article/1794650
  2. https://www.cnblogs.com/zcl1116/p/15055839.html

主要参考的是第一个链接,Service部分参考第二个链接改了改。

教程中的配置文件都是很详实的,需要根据自己的实情情况做点改动就能跑起来。

配置修改

  1. 第一步中的配置
local:
    path: /data/svr/projects/mysql

要改为自己机器上的路径。

  1. 同样是第一步中的配置,三个文件都要改
    nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 172.31.170.51

最后的IP要改为自己的Node名称,我因为使用的是Docker Desktop for Mac,所以本地的节点是docker-desktop

  1. 第4步中的MySQL配置要改下,加上UTF8编码的配置,不然中文输出会乱码。
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    # Master配置
    [mysqld]
    log-bin=mysqllog
    skip-name-resolve
    character-set-server=utf8
    [client]
    default-character-set=utf8
  slave.cnf: |
    # Slave配置
    [mysqld]
    super-read-only
    skip-name-resolve
    log-bin=mysql-bin
    replicate-ignore-db=mysql
    character-set-server=utf8
    [client]
    default-character-set=utf8
  1. 第6步Service配置改写下,增加一个读写服务的Service,方便别的Namespace访问。
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
  selector:
    app: mysql

---

apiVersion: v1
kind: Service
metadata:
  name: mysql-read
  namespace: mysql
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
    targetPort: 3306
    nodePort: 30036
  type: NodePort
  selector:
    app: mysql

---

apiVersion: v1
kind: Service
metadata:
  name: mysql-readwrite
  namespace: mysql
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
    targetPort: 3306
    nodePort: 30006
  selector:
    statefulset.kubernetes.io/pod-name: mysql-0
  type: NodePort

另外,文章最后验证主从同步的几条命令,存在SQL语句及命令行上的错误,多半是输入法的锅,复制的时候要小做修改。

部署

自己整理了个启动脚本

kubectl apply -f 01-persistentVolume-1.yaml
kubectl apply -f 01-persistentVolume-2.yaml
kubectl apply -f 01-persistentVolume-3.yaml
kubectl apply -f 02-storageclass.yaml
kubectl apply -f 03-mysql-namespace.yaml
kubectl apply -f 04-mysql-configmap.yaml
kubectl apply -f 05-mysql-secret.yaml
kubectl apply -f 06-mysql-services.yaml
kubectl get svc -n mysql
kubectl apply -f 07-mysql-statefulset.yaml
kubectl get pod -n mysql

验证部署

几条验证命令

#验证主从

kubectl -n mysql exec mysql-1 -c mysql -- bash -c "mysql -uroot -p123456 -e 'show slave status \G'"

#主库写数据

kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'create database test'"
kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;create table counter(c int);'"
kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;insert into counter values(123)'"

#观察从库是否同步

kubectl -n mysql exec mysql-1 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;select * from counter'"

#节点扩容

kubectl -n mysql scale statefulset mysql --replicas=3

#观察第二从库是否同步

kubectl -n mysql exec mysql-2 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;select * from counter'"

由于只预配置了三个Persistent Volume,所以我们最多只能启动一主二从共计三个节点。

卸载

还有个卸载的脚本,按部署的顺序倒着来。

kubectl delete -f 07-mysql-statefulset.yaml
kubectl delete -f 06-mysql-services.yaml
kubectl delete -f 05-mysql-secret.yaml
kubectl delete -f 04-mysql-configmap.yaml
kubectl delete -f 03-mysql-namespace.yaml
kubectl delete -f 02-storageclass.yaml
kubectl delete -f 01-persistentVolume-3.yaml
kubectl delete -f 01-persistentVolume-2.yaml
kubectl delete -f 01-persistentVolume-1.yaml

连接MySQL

在Namaspace mysql内部,连接Cluster可通过地址

  1. mysql
  2. mysql.mysql

连接读写节点

  1. mysql-readwrite
  2. mysql-readwrite.mysql

连接可读节点

  1. mysql-read
  2. mysql-read.mysql

即带不带Namespace都行。

其它Namespace下的Pod如果要使用这个MySQL服务,只能通过带Namespace后缀的地址连接,如mysql.mysql,不然会报错找不到Name or service not known

Leave a Comment

豫ICP备19001387号-1