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优先级 -
查看慢查询日志
下一步
-
11-MySQL-MGR初始化.md - 初始化MGR集群
-
12-验证测试.md - 验证MySQL MGR状态