Title

k8s部署 mysql:8.0.21 主从集群

创建mysql的namespace

kubectl create namespace mysql

创建mysql的密码

vim mysql-secret.yaml

apiVersion: v1

data:

  mysql_root_password: cm9vdA==    #root

kind: Secret

metadata: 

  creationTimestamp: null

  name: mysql-password

  namespace: mysql

 

创建mysql主节点

 

创建pv、pvc

vim mysql-pv.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata: 

  name: deploy-mysql-master-ceph-pv

  namespace: mysql

spec:

  accessModes:

    - ReadWriteOnce

  resources:  

    requests:  

      storage: 10Gi

  storageClassName: managed-nfs-storage

  volumeMode: Filesystem

--- 

kind: PersistentVolumeClaim

apiVersion: v1

metadata:   

  name: deploy-mysql-master-ceph-pvc

  namespace: mysql

spec: 

  accessModes: 

    - ReadWriteOnce   

  resources: 

    requests: 

      storage: 10Gi

  storageClassName: managed-nfs-storage

  volumeMode: Filesystem

创建cm、、statefulset

vim mysql-cm.yaml

apiVersion: v1

data: 

  my.cnf: |-

    [mysqld] 

    sql_mode               = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION                                     

    skip-host-cache

    skip-name-resolve

    datadir                = /var/lib/mysql

    socket                 = /var/run/mysqld/mysqld.sock

    secure-file-priv       = /var/lib/mysql-files

    pid-file               = /var/run/mysqld/mysqld.pid

    user                   = mysql

    secure-file-priv       = NULL

    server-id              =

    log-bin                = master-bin

log-bin-index          = master-bin.index 

    max_connections = 1000         #最大连接数

    [client]   

    socket                 = /var/run/mysqld/mysqld.sock

    !includedir  /etc/mysql/conf.d/

kind: ConfigMap

metadata:    

  creationTimestamp: null     

  name: mysql-master-cm

  namespace: mysql 

创建svc

vim mysql-svc.yaml

apiVersion: v1

kind: Service

metadata: 

  name: deploy-mysql-master-svc

  namespace: mysql

  labels:

    app: mysql-master

spec: 

  ports: 

  - port: 3306  

    name: mysql

    targetPort: 3306   

    nodePort: 30306  

  selector:

    app: mysql-master

  type: NodePort

  sessionAffinity: ClientIP

创建statefulset

vim mysql.yaml

apiVersion: apps/v1

kind: StatefulSet

metadata: 

  name: deploy-mysql-master

  namespace: mysql

spec: 

  selector: 

    matchLabels:   

      app: mysql-master

  serviceName: "deploy-mysql-master-svc"  

  replicas: 1  

  template:  

    metadata:

      labels: 

        app: mysql-master

    spec:  

      terminationGracePeriodSeconds: 10   

      containers:                                                                                                                                                  

      - args: 

        - --character-set-server=utf8mb4  

        - --collation-server=utf8mb4_unicode_ci   

        - --lower_case_table_names=1 

        - --default-time_zone=+8:00  

        name: mysql

        image: mysql:8.0.21

        ports:  

        - containerPort: 3306  

          name: mysql

        volumeMounts: 

        - name: mysql-data

          mountPath: /var/lib/mysql

        - name: mysql-conf

          mountPath: /etc/my.cnf

          readOnly: true   

          subPath: my.cnf

        env:  

        - name: MYSQL_ROOT_PASSWORD

          valueFrom:   

            secretKeyRef:  

              key: mysql_root_password

              name: mysql-password

      volumes: 

      - name: mysql-data

        persistentVolumeClaim:  

          claimName: deploy-mysql-master-ceph-pvc

      - name: mysql-conf

        configMap:   

          name: mysql-master-cm

          items:

          - key: my.cnf

            mode: 0644 

            path: my.cnf

运行yaml文件

kubectl apply -f mysql-secret.yaml 

 

kubectl apply -f mysql-pv.yaml

kubectl get pvc -n mysql        #查看pvc状态

 

kubectl apply -f mysql.yaml   

 

创建mysql从节点

创建pv、pvc

vim mysql-pv.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata:     

  name: deploy-mysql-slave-01-ceph-pv

  namespace: mysql

spec:    

  accessModes:  

    - ReadWriteOnce 

  resources:

    requests: 

      storage: 10Gi

  storageClassName: managed-nfs-storage

  volumeMode: Filesystem

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:  

  name: deploy-mysql-slave-01-ceph-pvc

  namespace: mysql

spec:   

  accessModes: 

    - ReadWriteOnce  

  resources:  

    requests:  

      storage: 10Gi

  storageClassName: managed-nfs-storage

  volumeMode: Filesystem 

创建cm

vim mysql-cm.yaml

apiVersion: v1

data:  

  my.cnf: |

    [mysqld] 

    sql_mode               = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 

    skip-host-cache

    skip-name-resolve

    datadir                = /var/lib/mysql

    socket                 = /var/run/mysqld/mysqld.sock

    secure-file-priv       = /var/lib/mysql-files

    pid-file               = /var/run/mysqld/mysqld.pid

    user                   = mysql

    secure-file-priv       = NULL    

    server-id              = 2   

    log-bin                = slave-bin

    relay-log              = slave-relay-bin

    log-bin-index          = slave-relay-bin.index

    max_connections = 1000         #最大连接数

    [client]    

    socket                 = /var/run/mysqld/mysqld.sock

 

    !includedir  /etc/mysql/conf.d/

kind: ConfigMap

metadata:     

  creationTimestamp: null  

  name: mysql-slave-01-cm

  namespace: mysql 

创建svc

vim mysql-svc.yaml

apiVersion: v1

kind: Service

metadata:

  name: deploy-mysql-slave-svc

  namespace: mysql

  labels: 

    app: mysql-slave

spec:   

  ports: 

  - port: 3306  

    name: mysql

    targetPort: 3306 

    nodePort: 30308 

  selector:

    app: mysql-slave

  type: NodePort

  sessionAffinity: ClientIP

创建statefulset

vim mysql.yaml

apiVersion: apps/v1

kind: StatefulSet

metadata: 

  name: deploy-mysql-slave-01

  namespace: mysql

spec:

  selector:

    matchLabels:     

      app: mysql-slave

  serviceName: "deploy-mysql-slave-svc"  

  replicas: 1   

  template:    

    metadata:    

      labels: 

        app: mysql-slave

    spec: 

      terminationGracePeriodSeconds: 10 

      containers:  

      - args: 

        - --character-set-server=utf8mb4   

        - --collation-server=utf8mb4_unicode_ci    

        - --lower_case_table_names=1     

        - --default-time_zone=+8:00  

        name: mysql

        image: mysql:8.0.21

        ports: 

        - containerPort: 3306 

          name: mysql

        volumeMounts: 

        - name: mysql-data

          mountPath: /var/lib/mysql

        - name: mysql-conf

          mountPath: /etc/my.cnf

          readOnly: true 

          subPath: my.cnf

        env: 

        - name: MYSQL_ROOT_PASSWORD

          valueFrom:

            secretKeyRef:  

              key: mysql_root_password

              name: mysql-password

      volumes: 

      - name: mysql-data

        persistentVolumeClaim:   

          claimName: deploy-mysql-slave-01-ceph-pvc

      - name: mysql-conf

        configMap: 

          name: mysql-slave-01-cm

          items:   

          - key: my.cnf                                                                                                                                             

            mode: 0644   

            path: my.cnf 

运行以上yaml文件

kubectl apply -f mysql-pv.yaml

kubectl get pvc -n mysql        #查看pvc状态

 

kubectl apply -f mysql.yaml

 

进入mysql pod建立主从连接

进入主数据库查询信息

kubectl exec -it -n mysql deploy-mysql-master-0 /bin/bash

mysql -u root -proot    #进入数据库

 

查询master节点相关信息

 

show master status;

 

 

slave节点执行以下命令(参数提取上面查询到的)

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1    #跳过错误事件

 

master上执行以下命令更改认证插件,mysql8默认使用caching_sha2_password ,改为以下的插件即可

ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'zwzk@2024!qwe';

主备搭建

备服务器执行下面命令,连接master

change master to master_host='deploy-mysql-master-0.deploy-mysql-master-svc.mysql.svc.cluster.local',master_user='root',master_password='zwzk@2024!',master_log_file='master-bin.000018',master_log_pos=180713783,master_port=3306;

参数详解:

master_host:这个参数是master的地址,kubernetes 提供的解析规则是 pod 名称.service名称.命名空间.svc.cluster.local,所以 master 的 mysql 地址是 deploy-mysql-master-0.deploy-mysql-master-svc.mysql.svc.cluster.local

master_port:主节点的 MySQL 端口,没改默认 3306

master_user:登录到主节点的 mysql 用户

master_password:登录到主节点的用户密码

master_log_file:之前查看 mysql 主节点状态时的 file 字段

master_log_pos:之前查看 mysql 主节点状态时的 Position 字段

 

启动slave同步

start slave;

扩展:

stop slave;      #停止slave同步

reset slave;     #停止并清除所有从服务器线程的相关信息

 

查询slave同步状态

show slave status\G;

(这两个参数为yes即可)

 

 

数据同步需要主从mysql的数据一致才可以同步,建立主从连接之前需要保证数据一致,建立连接之后在创建的库才会同步

 

结果验证

master节点创建了deploy_test库,slave成功同步了此库

 

如果mysql主从同步有问题,从库总是出现和主库表结构不同的情况,使用以下命令手动同步数据,同步完之后在执行change,开启start slave即可。

mysqldump -u 主库用户名 -p --master-data=1 数据库名 > 导出文件名.sql

 

posted @ 2024-06-18 18:34  Esurts~  阅读(113)  评论(0)    收藏  举报