在 Ubuntu 上实现 MySQL 高可用的主流方案与落地步骤
一、方案总览与选型建议
| 方案 | 架构要点 | 自动故障切换 | 一致性 | 典型场景 | 关键组件 |
|---|---|---|---|---|---|
| 主从复制 + 读写分离 | 一主多从,从库承担读流量 | 需配合 Orchestrator/MHA/脚本 | 最终一致 | 读写分离、读多写少 | MySQL 复制、ProxySQL/HAProxy、Orchestrator/MHA |
| 双主(MM)+ Keepalived | 两节点互为主从,配 VIP 漂移 | 由 Keepalived 脚本实现 | 依赖配置,可能有复制冲突 | 中小规模、快速切换 | MySQL、Keepalived |
| MySQL Group Replication(MGR) | 多节点组复制,多数派提交 | 内置多数派自动切换 | 强一致(多数派) | 原生高可用、多节点 | MySQL 8.0+、MGR |
| Percona XtraDB Cluster(PXC/Galera) | 多主多写,同步复制 | 多节点自动接管 | 强一致(同步) | 高并发、强一致 | PXC、Galera |
二、方案一 主从复制 + 读写分离(入门与通用)
主库配置(Ubuntu 常见路径为 /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
gtid-mode=ON
enforce-gtid-consistency=ON
sudo systemctl restart mysqlCREATE USER 'replica'@'%' IDENTIFIED BY 'StrongPass!';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;(记下 File 与 Position)。从库配置
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
sudo systemctl restart mysqlCHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replica',
MASTER_PASSWORD='StrongPass!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G,确保 Slave_IO_Running/Slave_SQL_Running=Yes,关注 Seconds_Behind_Master。读写分离与流量治理
三、方案二 双主(MM)+ Keepalived(快速自动切换)
MySQL 双主要点
# node1
auto-increment-increment=2
auto-increment-offset=1
# node2
auto-increment-increment=2
auto-increment-offset=2
Keepalived 实现 VIP 漂移
四、方案三 原生高可用集群 MGR 或 PXC(强一致与多节点)
MySQL Group Replication(MGR)
[mysqld]
server-id=1
gtid-mode=ON
enforce-gtid-consistency=ON
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.1.1:33061"
loose-group_replication_group_seeds="192.168.1.1:33061,192.168.1.2:33061,192.168.1.3:33061"
loose-group_replication_bootstrap_group=OFF
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
START GROUP_REPLICATION;,通过 performance_schema.replication_group_members 查看成员状态。Percona XtraDB Cluster(PXC/Galera)
[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1_ip,node2_ip,node3_ip"
wsrep_cluster_name="my_cluster"
wsrep_node_address="node1_ip"
wsrep_node_name="node1"
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
wsrep_new_cluster 启动,其余节点加入;可通过 rsync 或 SST 同步数据目录。五、生产落地要点与运维清单
slave-parallel-workers);对一致性敏感的业务考虑 增强半同步 或 组复制/ Galera 的强一致。