k8s部署mysql主从(GTID异步模式)

1、基础环境

(1)系统版本

[root@master231]:~/dxl/lb-wp-mysql# cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

(2)k8s版本

[root@master231]:~/dxl/lb-wp-mysql# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:33:14Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}

[root@master231]:~/dxl/lb-wp-mysql# kubelet --version
Kubernetes v1.23.17

[root@master231]:~/dxl/lb-wp-mysql# kubectl get nodes
NAME        STATUS   ROLES                  AGE     VERSION
master231   Ready    control-plane,master   4d21h   v1.23.17
worker232   Ready    <none>                 4d21h   v1.23.17
worker233   Ready    <none>                 4d21h   v1.23.17

2、目录结构

[root@master231]:~/mysql# ll -A
total 20
-rw-r--r-- 1 root root  680 Mar 14 15:25 cm-init-mysql.yaml
-rw-r--r-- 1 root root 1341 Mar 14 14:01 cm-mycnf-mysql.yaml
-rw-r--r-- 1 root root 1172 Mar 14 15:03 deploy-master-mysql.yaml
-rw-r--r-- 1 root root 1189 Mar 14 15:12 deploy-slave-mysql.yaml
-rw-r--r-- 1 root root  152 Mar 14 08:12 mysql-svc.yaml

3、cm-init-mysql.yaml

apiVersion: v1

kind: ConfigMap

metadata:
  name: initsh-cm

data:
  init-master-gtid-sh: |
    #!/bin/bash
    sleep 10
    mysql -u root -e "GRANT REPLICATION SLAVE ON *.* TO '${MYSQL_USER}'@'%';"

  init-slave-gtid-semisync-sh: |
    #!/bin/bash
    sleep 10
    mysql -u root -e "CHANGE MASTER TO 
      MASTER_HOST='mysql-svc', 
      MASTER_USER='${MY_MYSQL_USER}', 
      MASTER_PASSWORD='${MY_MYSQL_PASSWORD}', 
      MASTER_AUTO_POSITION = 1;
    START SLAVE;"

<1>主库给同步专用用户授权读取主库的二进制日志,从库设置主库信息用于同步

<2>从库不用官方变量,避免自动创建用户,用户应来自主库的同步

4、cm-mycnf-mysql.yaml

apiVersion: v1

kind: ConfigMap

metadata:
  name: mycnf-cm

data:
  master-gtid: |
    [mysqld]
    user=mysql
    port=3306
    datadir=/var/lib/mysql
    socket=/var/run/mysqld/mysqld.sock
    skip-name-resolve
    server_id=100
    log-bin=mysql-bin
    binlog_format=ROW
    binlog_expire_logs_seconds=1209600
    sync_binlog=1
    innodb_log_file_size=1G
    innodb_flush_method=O_DIRECT
    max_connections=2000
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    default-authentication-plugin=mysql_native_password
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    plugin-load-add=semisync_master.so
    
    [client]
    socket=/var/run/mysqld/mysqld.sock

  slave-gtid-semisync: |
    [mysqld]
    user=mysql
    port=3306
    datadir=/var/lib/mysql
    socket=/var/run/mysqld/mysqld.sock
    skip-name-resolve
    server_id=200
    log-bin=mysql-bin
    binlog_format=ROW
    binlog_expire_logs_seconds=604800
    relay-log=mysql-relay-bin
    log-slave-updates=ON
    read_only=ON
    relay_log_info_repository=TABLE
    relay_log_recovery=ON
    innodb_buffer_pool_size=4G
    character-set-server=utf8mb4
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    plugin-load-add=semisync_slave.so
    
    [client]
    socket=/var/run/mysqld/mysqld.sock

5、deploy-master-mysql.yaml

apiVersion: apps/v1

kind: Deployment

metadata:
  name: dpy-mysql-master
  labels:
    app: mysql
    role: master

spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: master
  template:
    metadata:
      labels:
        app: mysql
        role: master
    spec:
      volumes:
      - name: mycnf
        configMap:
          name: mycnf-cm
          items:
          - key: master-gtid
            path: my.cnf
      - name: initsh
        configMap:
          name: initsh-cm
          items:
          - key: init-master-gtid-sh
            path: init-gtid.sh
      containers:
      - name: mysql-master
        image: 10.0.0.250/wp_mysql/mysql:v1
        volumeMounts:
        - name: mycnf
          mountPath: /etc/my.cnf
          subPath: my.cnf
        - name: initsh
          mountPath: /docker-entrypoint-initdb.d/init-gtid.sh
          subPath: init-gtid.sh
        env:
        - name: MYSQL_USER
          value: "dxl"
        - name: MYSQL_PASSWORD
          value: "dxl123!@#"
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        args:
        - --default-authentication-plugin=mysql_native_password

6、deploy-slave-mysql.yaml

apiVersion: apps/v1

kind: Deployment

metadata:
  name: dpy-mysql-slave
  labels:
    app: mysql
    role: slave
  
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: slave
  template:
    metadata:
      labels:
        app: mysql
        role: slave
    spec:
      volumes:
      - name: mycnf
        configMap:
          name: mycnf-cm
          items:
          - key: slave-gtid-semisync
            path: my.cnf
      - name: initsh
        configMap:
          name: initsh-cm
          items:
          - key: init-slave-gtid-semisync-sh
            path: init-gtid.sh
      containers:
      - name: mysql-slave
        image: 10.0.0.250/wp_mysql/mysql:v1
        volumeMounts:
        - name: mycnf
          mountPath: /etc/my.cnf
          subPath: my.cnf
        - name: initsh
          mountPath: /docker-entrypoint-initdb.d/init-gtid.sh
          subPath: init-gtid.sh
        env:
        - name: MY_MYSQL_USER
          value: "dxl"
        - name: MY_MYSQL_PASSWORD
          value: "dxl123!@#"
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        args:
        - --default-authentication-plugin=mysql_native_password

7、mysql-svc.yaml

apiVersion: v1

kind: Service

metadata:
  name: mysql-svc

spec:
  type: ClusterIP
  ports:
  - port: 3306
  selector:
    app: mysql
    role: master

8、部署

[root@master231]:~/mysql# kubectl delete -f .
configmap "initsh-cm" deleted
configmap "mycnf-cm" deleted
deployment.apps "dpy-mysql-master" deleted
deployment.apps "dpy-mysql-slave" deleted
service "mysql-svc" deleted
[root@master231]:~/mysql# kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
dpy-mysql-master-79cf5f9446-xrzhw   1/1     Running   0          54s
dpy-mysql-slave-8494d9dffd-ccwhw    1/1     Running   0          54s

9、测试

(1)主库创建数据库test01

[root@master231]:~/mysql# kubectl exec -it pod/dpy-mysql-master-79cf5f9446-xrzhw -- mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.08 sec)

mysql> create database test01;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test01             |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

(2)从库查看

[root@master231]:~/mysql# kubectl exec -it dpy-mysql-slave-8494d9dffd-ccwhw -- mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test01             |
+--------------------+
5 rows in set (0.01 sec)

mysql> 

10、开启半同步

将下列操作固化到代码中时未成功,故手动操作

上述操作为异步模式,该部分内容为开启半同步模式,实现性能和数据安全的平衡

(1)从库

1)原状态

mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)

2)从库开启半同步

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.01 sec)

3)再次检查

mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

(2)主库

1)原状态

mysql> SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
+-----------------------------+-------+
1 row in set (0.00 sec)

2)主库开启半同步

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)

3)再次检查

mysql> SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.02 sec)

11、root用户加密码

当在配置清单中设置密码时导致容器启动失败,故设为空并在数据库中手动操作

(1)查看

mysql> select user,host,authentication_string from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | authentication_string |
+------+-----------+-----------------------+
| root | %         |                       |
| root | localhost |                       |
+------+-----------+-----------------------+
2 rows in set (0.08 sec)

(2)设置密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'dxl456$%^';
Query OK, 0 rows affected (0.04 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'dxl456$%^';
Query OK, 0 rows affected (0.03 sec)

(3)再次检查

mysql> select user,host,authentication_string from mysql.user where user='root';
+------+-----------+-------------------------------------------+
| user | host      | authentication_string                     |
+------+-----------+-------------------------------------------+
| root | %         | *E33AB5FBA819403A3CC2F036379883844209FB4B |
| root | localhost | *E33AB5FBA819403A3CC2F036379883844209FB4B |
+------+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

12、查看状态

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: mysql-svc
                  Master_User: dxl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 388
               Relay_Log_File: mysql-relay-bin.000005
                Relay_Log_Pos: 460
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 388
              Relay_Log_Space: 1117
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 100
                  Master_UUID: 4ae06a9d-1fbf-11f1-a5ae-5e5c6d67c15a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 4ae06a9d-1fbf-11f1-a5ae-5e5c6d67c15a:1-8
            Executed_Gtid_Set: 4ae06a9d-1fbf-11f1-a5ae-5e5c6d67c15a:1-8,
4af4f039-1fbf-11f1-bc80-c2624419c803:1-5
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 

GTID:

Retrieved_Gtid_Set: 4ae06a9d-1fbf-11f1-a5ae-5e5c6d67c15a:1-8

Executed_Gtid_Set: 4ae06a9d-1fbf-11f1-a5ae-5e5c6d67c15a:1-8,4af4f039-1fbf-11f1-bc80-c2624419c803:1-5

Auto_Position: 1

同步状态:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

13、缺点

1、root密码和半同步的设置未能实现代码化,试了半天未能成功

2、还未进行/var/lib/mysql/和/var/log/mysql的持久化(主从双节点持久化)

posted @ 2026-03-15 00:46  dxl_xiaoyi  阅读(0)  评论(0)    收藏  举报