Docker容器化高可用架构部署方案(十一)

10-MySQL配置详解

本文档详细介绍MySQL MGR(Group Replication)的配置,包括三个节点的配置差异。

MySQL MGR架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                  MySQL MGR (单主模式)                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│         33061端口 (Group Replication通信)                    │
│              │              │              │                │
│    ┌─────────┴────┐ ┌───────┴─────┐ ┌───────┴──────┐       │
│    │   MySQL-01   │ │  MySQL-02   │ │  MySQL-03    │       │
│    │ 172.20.4.11  │ │ 172.20.4.12 │ │ 172.20.4.13  │       │
│    │   (PRIMARY)  │ │   (SECONDARY)│ │  (SECONDARY) │       │
│    │   member_    │ │   member_    │ │   member_    │       │
│    │   weight=70  │ │   weight=60  │ │   weight=50  │       │
│    └──────────────┘ └──────────────┘ └──────────────┘       │
│              │              │              │                │
│              └──────────────┼──────────────┘                │
│                             │                               │
│                       3306端口 (客户端连接)                    │
│                             │                               │
│                             ▼                               │
│                       PHP服务                               │
│                       (172.20.2.11/12/13)                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

MGR特性说明

单主模式

  • 只有一个节点可写(Primary)

  • 其他节点自动变为只读(Secondary)

  • 故障转移时自动切换

GTID复制

  • 使用全局事务ID追踪复制状态

  • 支持自动跳过错误事务

  • 更可靠的故障恢复

Group Replication

  • 基于Paxos协议的一致性保证

  • 多节点同时写入冲突检测

  • 自动故障转移

Node1配置文件 (my-node1.cnf)

复制代码
cat > /opt/cluster-deploy/config/mysql/my-node1.cnf << 'EOF'
[mysqld]
server-id=1
bind-address=0.0.0.0
port=3306
basedir=/usr
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysql/error.log
​
report_host=172.20.4.11
​
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
binlog_checksum=NONE
skip-name-resolve
​
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="172.20.4.11:33061"
loose-group_replication_group_seeds="172.20.4.11:33061,172.20.4.12:33061,172.20.4.13:33061"
loose-group_replication_ip_allowlist="172.20.4.0/24"
loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
loose-group_replication_poll_spin_loops=100
loose-group_replication_recovery_reconnect_interval=10
loose-group_replication_member_weight=70
​
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_format=ROW
​
[client]
socket=/var/run/mysqld/mysqld.sock
​
[mysql]
socket=/var/run/mysqld/mysqld.sock
EOF

Node2配置文件 (my-node2.cnf)

复制代码
cat > /opt/cluster-deploy/config/mysql/my-node2.cnf << 'EOF'
[mysqld]
server-id=2
bind-address=0.0.0.0
port=3306
basedir=/usr
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysql/error.log
​
report_host=172.20.4.12
​
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
binlog_checksum=NONE
skip-name-resolve
​
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="172.20.4.12:33061"
loose-group_replication_group_seeds="172.20.4.11:33061,172.20.4.12:33061,172.20.4.13:33061"
loose-group_replication_ip_allowlist="172.20.4.0/24"
loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
loose-group_replication_poll_spin_loops=100
loose-group_replication_recovery_reconnect_interval=10
loose-group_replication_member_weight=60
​
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_format=ROW
​
[client]
socket=/var/run/mysqld/mysqld.sock
​
[mysql]
socket=/var/run/mysqld/mysqld.sock
EOF

Node3配置文件 (my-node3.cnf)

复制代码
cat > /opt/cluster-deploy/config/mysql/my-node3.cnf << 'EOF'
[mysqld]
server-id=3
bind-address=0.0.0.0
port=3306
basedir=/usr
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysql/error.log
​
report_host=172.20.4.13
​
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
binlog_checksum=NONE
skip-name-resolve
​
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="172.20.4.13:33061"
loose-group_replication_group_seeds="172.20.4.11:33061,172.20.4.12:33061,172.20.4.13:33061"
loose-group_replication_ip_allowlist="172.20.4.0/24"
loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
loose-group_replication_poll_spin_loops=100
loose-group_replication_recovery_reconnect_interval=10
loose-group_replication_member_weight=50
​
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_format=ROW
​
[client]
socket=/var/run/mysqld/mysqld.sock
​
[mysql]
socket=/var/run/mysqld/mysqld.sock
EOF

配置项详解

1. 基础配置

复制代码
server-id=1                    # 节点唯一ID(每个节点不同)
bind-address=0.0.0.0          # 监听所有接口
port=3306                      # MySQL端口
socket=/var/run/mysqld/mysqld.sock  # Socket文件

2. report_host

复制代码
report_host=172.20.4.11

重要排错经验:Macvlan网络无DNS解析,必须使用IP地址。

3. GTID配置

复制代码
gtid_mode=ON                   # 启用GTID模式(MGR必须)
enforce_gtid_consistency=ON    # 强制GTID一致性(MGR必须)
log_slave_updates=ON           # 从节点记录主从日志
binlog_checksum=NONE           # 禁用binlog校验
skip-name-resolve             # 跳过域名解析

重要排错经验 :MGR要求gtid_mode=ON,不开启会导致无法加入集群。

4. MGR配置(loose-前缀)

复制代码
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"

说明

  • loose-前缀表示插件未加载时忽略此配置

  • UUID可使用uuidgen命令生成

重要排错经验 :MGR参数必须写在[mysqld]段,不是[mysql]段。

参数 说明 Node1 Node2 Node3
server-id 唯一ID 1 2 3
report_host 报告IP 172.20.4.11 172.20.4.12 172.20.4.13
local_address 通信地址 172.20.4.11:33061 172.20.4.12:33061 172.20.4.13:33061
member_weight 优先级 70 60 50

5. 复制配置

复制代码
master_info_repository=TABLE           # 主信息存储表
relay_log_info_repository=TABLE        # 中继日志存储表
transaction_write_set_extraction=XXHASH64  # 事务集合提取算法
binlog_format=ROW                      # 行格式(支持MGR)

Docker Compose配置

Node1

复制代码
mysql-01:
  image: mysql:8.0
  container_name: mysql-01
  hostname: mysql-node1
  networks:
    database-net:
      ipv4_address: 172.20.4.11
  volumes:
    - mysql-01-data:/var/lib/mysql
    - ./config/mysql/my-node1.cnf:/etc/mysql/conf.d/my.cnf:ro
    - ./config/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
  environment:
    - MYSQL_ROOT_PASSWORD=YourStr0ng!Pass
    - MYSQL_DATABASE=app_db
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "mysqladmin", "-uroot", "-pYourStr0ng!Pass", "ping", "-h", "127.0.0.1"]
    interval: 15s
    timeout: 10s
    retries: 5

Node2/Node3

复制代码
mysql-02:
  image: mysql:8.0
  container_name: mysql-02
  hostname: mysql-node2
  networks:
    database-net:
      ipv4_address: 172.20.4.12
  volumes:
    - mysql-02-data:/var/lib/mysql
    - ./config/mysql/my-node2.cnf:/etc/mysql/conf.d/my.cnf:ro
  environment:
    - MYSQL_ROOT_PASSWORD=YourStr0ng!Pass
    - MYSQL_DATABASE=app_db
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "mysqladmin", "-uroot", "-pYourStr0ng!Pass", "ping", "-h", "127.0.0.1"]
    interval: 15s
    timeout: 10s
    retries: 5

重要排错经验

1. healthcheck不支持--no-auth-warning

问题 :mysqladmin命令不支持--no-auth-warning参数

错误配置

复制代码
healthcheck:
  test: ["CMD", "mysqladmin", "-uroot", "-pYourStr0ng!Pass", "ping", "--no-auth-warning"]  # 错误

正确配置

复制代码
healthcheck:
  test: ["CMD", "mysqladmin", "-uroot", "-pYourStr0ng!Pass", "ping", "-h", "127.0.0.1"]

2. 使用-h 127.0.0.1走TCP

问题:socket连接可能失败

解决方法 :使用-h 127.0.0.1强制TCP连接

3. caching_sha2_password认证问题

问题:MGR复制用户不支持新认证插件

解决方法 :创建用户时使用mysql_native_password

复制代码
CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStr0ng!Pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

服务IP分配

节点 MySQL IP 容器名 MGR通信端口 member_weight
Node1 Primary 172.20.4.11 mysql-01 33061 70
Node2 Secondary 172.20.4.12 mysql-02 33061 60
Node3 Secondary 172.20.4.13 mysql-03 33061 50

常见问题

Q1: MGR无法启动

  • 检查gtid_mode=ON是否设置

  • 检查server-id是否唯一

  • 查看错误日志:docker logs mysql-01

Q2: 节点无法加入集群

  • 检查网络连通性:ping 172.20.4.11

  • 检查防火墙:端口3306、33061是否开放

  • 确认report_host使用IP地址

Q3: 复制延迟

  • 检查网络带宽

  • 调整member_weight优先级

  • 查看慢查询日志

下一步

相关推荐
Thecozzy7 小时前
线上 Bug 排查与修复实录
架构
鹏大师运维7 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
问心无愧05137 小时前
ctf show web入门111
android·前端·笔记
梦梦代码精9 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
杨了个杨898210 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
56AI12 小时前
360 智语 AI 企业智能体平台深度评测:从 L4 蜂群架构到政企落地实战
人工智能·架构
youngerwang12 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
老毛肚13 小时前
JeecgBoot 后端架构与技术栈全景导读 01
架构
极客先躯13 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
ha_lydms14 小时前
AnalyticDB分区、分布键性能优化
android·大数据·分布式·性能优化·分布式计算·分区·analyticdb