ubuntu上如何实现mysql的高可用性
导读:在 Ubuntu 上实现 MySQL 高可用的主流方案与落地步骤 一、方案总览与选型建议 方案 架构要点 自动故障切换 一致性 典型场景 关键组件 主从复制 + 读写分离 一主多从,从库承担读流量 需配合 Orchestra...
在 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 |
- 选型建议:读多写少优先“主从+读写分离”;需要自动故障切换且接受最终一致可用“MM+Keepalived”;追求强一致与多节点原生高可用优先“MGR/PXC”。
二、方案一 主从复制 + 读写分离(入门与通用)
-
主库配置(Ubuntu 常见路径为 /etc/mysql/mysql.conf.d/mysqld.cnf)
- 开启 binlog 与唯一 server-id,建议启用 GTID 便于恢复与切换:
[mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW gtid-mode=ON enforce-gtid-consistency=ON - 重启:
sudo systemctl restart mysql - 创建复制用户并授权:
CREATE USER 'replica'@'%' IDENTIFIED BY 'StrongPass!'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES; - 记录位点:
SHOW MASTER STATUS;(记下 File 与 Position)。
- 开启 binlog 与唯一 server-id,建议启用 GTID 便于恢复与切换:
-
从库配置
[mysqld] server-id=2 relay-log=mysql-relay-bin read-only=1- 重启:
sudo systemctl restart mysql - 建立复制链路(使用上一步的 File/Position 或 MASTER_AUTO_POSITION=1 配合 GTID):
CHANGE 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。
- 重启:
-
读写分离与流量治理
- 中间件:ProxySQL/HAProxy 路由写主读从;或 MyCAT 做逻辑库与读写分离规则配置。
三、方案二 双主(MM)+ Keepalived(快速自动切换)
-
MySQL 双主要点
- 两节点互为主从,建议开启 auto-increment-increment 与 auto-increment-offset 避免主键冲突:
# node1 auto-increment-increment=2 auto-increment-offset=1 # node2 auto-increment-increment=2 auto-increment-offset=2 - 其他复制参数与主从一致(server-id 唯一、开启 binlog/relay-log 等)。
- 两节点互为主从,建议开启 auto-increment-increment 与 auto-increment-offset 避免主键冲突:
-
Keepalived 实现 VIP 漂移
- 在两台节点部署 Keepalived,配置 虚拟 IP(VIP);健康检查脚本探测 3306 与复制状态,失败则降低本机权重或停止 Keepalived,使 VIP 漂移到对端。
- 优点:部署快、切换及时;注意防范“脑裂”、双 VIP 与复制冲突,必要时引入仲裁或增强半同步降低丢数风险。
四、方案三 原生高可用集群 MGR 或 PXC(强一致与多节点)
-
MySQL Group Replication(MGR)
- 适用 MySQL 5.7+ / 8.0+,多节点组成复制组,基于 多数派 提交与自动故障切换。
- 关键配置(各节点一致,仅 server-id 不同):
[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 同步数据目录。
五、生产落地要点与运维清单
- 复制与一致性
- 优先启用 GTID,便于恢复与切换;读负载高时启用 多线程复制(
slave-parallel-workers);对一致性敏感的业务考虑 增强半同步 或 组复制/ Galera 的强一致。
- 优先启用 GTID,便于恢复与切换;读负载高时启用 多线程复制(
- 流量治理与中间件
- 读写分离用 ProxySQL/HAProxy;复杂路由与分库分表可用 MyCAT;引入 Orchestrator/MHA 做主库自动切换与可视化运维。
- 监控与备份
- 持续监控复制延迟(如 Seconds_Behind_Master)、节点存活、连接数、慢查询;定期全量+增量备份(如 mysqldump/Percona XtraBackup),并演练恢复流程。
- 网络与安全
- 开放复制与管理端口(如 3306/33061),限制来源 IP;开启 SSL 加密复制通道;保证 NTP 时间同步 与稳定的存储/网络。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: ubuntu上如何实现mysql的高可用性
本文地址: https://pptw.com/jishu/770843.html
