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优先级

  • 查看慢查询日志

下一步

相关推荐
Liben26 分钟前
Weex开发踩坑记录
android·前端·ios
Dawson Zhu43 分钟前
【AI编译器入门⑥】端到端编译流程实战:ONNX → TVM → TensorRT全链路
人工智能·语言模型·架构·aigc·agi
深圳市益普科技有限公司1 小时前
半导体SPC工具怎么选?从控制图算法到落地架构的对比
大数据·人工智能·架构
每天一道题1 小时前
微服务为什么会变慢?从 QPS、P99 到 Trace 与性能瓶颈
微服务·云原生·架构
xunberg1 小时前
【Agent 生产化手记-02】Agent 怎么向人提问
人工智能·算法·架构
牛马工作号2 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
利威尔xu2 小时前
Go IM 源码实战(11):token 只是个 HASH,多端互踢的顺序错了就踢错人
后端·微服务·面试·架构·golang
充值内卷2 小时前
把 Visio 和 Axure 塞进一个 1.5 MB 的 exe:Visioxure 的架构与取舍
架构·axure
QianhangQianping2 小时前
一块大屏的数据在浏览器里怎么变成画面:背景、子屏、前景三层结构
前端·低代码·架构·编辑器·数据可视化·大屏可视化
救救孩子把2 小时前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务