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

  • 查看慢查询日志

下一步

相关推荐
我命由我123455 小时前
Android 开发问题:TextView 内容超过宽度时,默认不会换行
android·开发语言·java-ee·android studio·android jetpack·android-studio·android runtime
Jul1en_5 小时前
【Redis】Sentinel 哨兵支持,附带 Docker 部署教程
redis·docker·sentinel
ze^05 小时前
Day03 Web应用&OSS存储&负载均衡&CDN加速&反向代理&WAF防护&部署影响
web安全·网络安全·架构·安全架构
身如柳絮随风扬5 小时前
TiDB 极速入门与 Spring Boot 实战:从 Docker 部署到高并发调优
spring boot·docker·tidb
shandianchengzi6 小时前
【科普】安卓|安卓手机上如何简便实现Ctrl+Z(需要键盘或一台Windows电脑)
android·windows·智能手机·计算机外设·安卓·科普·记录
赏金术士13 小时前
Compose 教学项目
android·kotlin·compose
晓梦林13 小时前
ximai靶场学习笔记
android·笔记·学习
狼爷14 小时前
日均100万订单!「订单超时自动取消」全方案解析(附并发避坑指南)
架构
roman_日积跬步-终至千里17 小时前
如何分析复杂架构:一套真正能落地的方法
java·开发语言·架构