MySQL 高可用
目录
一、概述MySQL高可用
1. 什么是高可用性(High Availability, HA)?
2. MySQL 高可用常见方案
3. 高可用核心机制
4. 选型建议
注意事项
二、案例环境组成
MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构
三、案例架构实施搭建
1. 案例需求
2. 案例实现思路
3. 搭建架构
(1)安装 MySQL 数据库;
(2)配置主主复制,MySQL互为主从
(3)部署haproxy (2台)
(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)
(5)模拟故障并验证架构效果
一、概述MySQL高可用
1. 什么是高可用性(High Availability, HA)?
定义:高可用性指系统在面临硬件故障、软件错误或维护时,仍能持续提供服务的能力,目标是尽量减少停机时间(如达到 99.99% 的可用性,即全年停机时间不超过 52.6 分钟)。
核心目标:
-
故障自动恢复:快速检测故障并自动切换至备用节点。
-
数据零丢失:确保故障切换时数据完整性。
-
服务连续性:用户无感知的故障转移。
2. MySQL 高可用常见方案
以下是 MySQL 实现高可用的主流方案及其特点:
方案 原理 优点 缺点 主从复制 + MHA 基于异步/半同步主从复制,通过 MHA(Master High Availability)监控主库故障并自动切换从库为新主库。 简单易用,适合异步复制环境。 依赖脚本和外部工具,半同步可能延迟。 Galera Cluster 基于同步多主复制(Synchronous Multi-Master),所有节点数据实时同步。 强一致性,读写分离灵活。 网络延迟敏感,写入性能受节点数影响。 MySQL Group Replication MySQL 官方方案,基于 Paxos 协议实现多主集群,支持单主或多主模式。 原生支持,自动化故障转移。 配置复杂,对网络稳定性要求高。 InnoDB Cluster 基于 MySQL Group Replication + MySQL Shell + MySQL Router 的完整高可用套件。 官方集成,管理便捷。 依赖 MySQL 8.0+,资源消耗较高。 Proxy-based HA 通过中间件(如 ProxySQL、HAProxy)实现读写分离和故障转移。 对应用透明,灵活扩展。 中间件可能成为性能瓶颈。 云服务高可用 使用云厂商方案(如 AWS RDS Multi-AZ、阿里云高可用版)。 全托管,自动备份与恢复。 成本较高,依赖云平台。 3. 高可用核心机制
-
数据冗余:
-
主从复制(异步/半同步)保障数据多副本存储。
-
同步复制(如 Galera)确保所有节点数据强一致。
-
故障检测与切换:
-
心跳机制:通过定期心跳包检测节点存活状态。
-
VIP/DNS 漂移:故障时虚拟 IP 或 DNS 指向新主库。
-
脑裂(Split-Brain)处理:
-
使用仲裁节点(如 MHA 的 Manager)或多数派投票(Paxos 协议)避免多主同时写入。
-
数据一致性保障:
-
半同步复制:主库提交事务前需至少一个从库确认接收。
-
并行复制:解决单线程复制延迟问题(MySQL 5.7+)
-
-
-
-
4. 选型建议
-
强一致性场景:选择 Galera Cluster 或 MySQL Group Replication。
-
简单主从架构:主从复制 + MHA 或 Keepalived。
-
云环境:优先使用云厂商托管方案(如 AWS RDS)。
-
大规模集群:结合中间件(ProxySQL)与 Group Replication。
注意事项
-
数据同步延迟:异步复制可能导致切换时数据丢失,需结合业务容忍度选择复制模式。
-
监控与告警:实时监控节点状态、复制延迟、集群健康度。
-
定期演练:模拟故障切换,验证高可用流程的有效性。
二、案例环境组成
MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构
-
MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。
-
Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。在这里用来检测HAPProxy的状态。
-
HAPProxy:作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。
优势
-
高可用性:Keepalived 实现秒级故障切换,HAPProxy 健康检查确保流量仅路由到正常节点,避免单点故障。
-
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAPProxy 可配置读写分离,利用备节点分担读压力。
-
灵活扩展:可横向扩展 HAPProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
-
运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
三、案例架构实施搭建
1. 案例需求
本案例要求通过 MHA 监控 MySQL 数据库,在故障时进行自动切换,不影响业务。
2. 案例实现思路
(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换。
3. 搭建架构
(1)安装 MySQL 数据库;
主页有关于MySQL的详细安装步骤
(2)配置主主复制,MySQL互为主从
#master1、2互为主从(操作一样) vim /etc/my.cnf log-bin=/usr/local/mysql/data/mysql-bin binlog-format=MIXED server-id=1/2 --重启MySQL systemctl restart mysqld #创建用户,为从授权 create user 'myslave'@'%' identified by '123456'; grant replication slave on *.* to 'myslave'@'%'; alter user 'myslave'@'%' identified with mysql_native_password by '123456'; 注意:identified with mysql_native_password 加密模块,保护密码 #刷新并查看主的状态信息 flush privileges; show master status; //看File和Position #两个主机互相连接主 (注意好不要填错IP和pos偏移量) change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1149; #开启从同步 start slave; #查看从状态信息 show slave status\G 验证主主复制的同步:创建库
(3)部署haproxy (2台)
#关闭selinux和防火墙 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 systemctl stop firewalld systemctl disable firewalld #安装haproxy dnf -y install haproxy #编辑配置文件 vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid user haproxy group haproxy daemon maxconn 4000 defaults mode tcp #改 log global option tcplog #改 option dontlognull retries 3 timeout http-request 5s timeout queue 1m timeout connect 5s timeout client 1m timeout server 1m timeout http-keep-alive 5s timeout check 5s maxconn 3000 listen mysql bind 0.0.0.0:3306 # 显式指定监听地址和端口 balance leastconn # 负载均衡算法 server mysql1 192.168.10.101:3306 check port 3306 maxconn 300 #声明服务器节点 server mysql2 192.168.10.102:3306 check port 3306 maxconn 300 #重启服务并检测文件配置 haproxy -c -f /etc/haproxy/haproxy.cfg systemctl restart haproxy
(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)
#关闭selinux和防火墙(做过不用) sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 systemctl stop firewalld systemctl disable firewalld #安装 dnf install -y keepalived #编辑配置文件 注意:原本的那个是模板文件,需要拷贝一下 cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf vim /etc/keepalived/keepalived.conf router_id r1/r2 vrrp_instance VI_1 { state BACKUP nopreempt //优先级高的主机设置 interface ens33 priority 100 //优先级 } 注释掉vrrp_strict,删除virtual_ipaddress:区域配置完后面的内容 ##2台配置不同,要注意router_id 设置不同, vrrp_instance 实例(管理VIP的): 要注意两台都为备BACKUP(通过优先级自动选主);优先级修改成不同;优先高一台设置nopreempt(不抢占模式),防止优先级高的故障后还抢占另一台的主身份。 interface 网卡对应本机的网卡名; virtual_ipaddress: 改成同网段的 注释掉vrrp_strict :严格模式,它会阻止VIP单播通信 ##### #添加监控脚本(测试haproxy的状态,故障后关闭haproxy,keepalived就把VIP漂到另一台) vim /etc/keepalived/chk.sh #!/bin/bash # if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then /etc/init.d/keepalived stop 或 systemctl stop keepalived fi #重启keepalived systemctl restart keepalived #查看VIP(必须是一台有,一台没有) ip add #自动跑监控脚本 方一:创建计划任务,定期自动执行 方二:添加到keepalived的配置文件里(keepalived允许添加外部脚本到配置里) 添到示例上方:vrrp_script chk_haproxy { script "/etc/keepalived/chk.sh" interval 2 } 添加到示例里面: track_script { chk_haproxy } chmod +x /etc/keepalived/chk.sh //给脚本执行权限 systemctl restart keepalived #客户端验证 用Vip连接MySQL mysql -utest -p123456 -h192.168.10.100 #注意:客户端没有mysql的命令,可以用“yum -y install mysql”下载
(5)模拟故障并验证架构效果
#在服务器上创建测试账户test(只需创一次,另一台主会同步) create user testt@'%' identified by '123456'; grant all on *.* to testt@'%'; alter user 'testt'@'%' identified with mysql_native_password by '123456'; flush privileges; 模拟故障: 1.关闭master1,测试HAProxy的效果,它具备健康检测功能,会自动切换 ping master1IP //发现已离线 mysql -utest -p123456 -h192.168.10.100 //客户端验证是否能正常登录,正常登为正确 2.关闭keepalived,查看VIP漂移的效果 ip a // mysql还是可以访问的
-
-
-
-