1.什么是mysql高可用
指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现“零停机、数据零丢失”的业务连续性
2.方案组成:MySQL主主复制+Keepalived+HAProxy
MySQL主主复制:两台MySQL实例互为主从,双向同步数据,均支持读写操作。提供冗余和扩展能力
Keepalived:通过VRRP协议管理虚拟IP(VIP),监控MySQL状态,故障时自动将VIP漂移至存活节点,确保服务地址不变
HAProxy:作为反向代理和负载均衡器,将流量分发至MySQL节点,支持健康检查、读写分离(可选)和故障节点自动剔除
3.优势
高可用性:Keepalived实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用备节点分担读压力灵活
灵活扩展:可横向扩展HAProxy或MySQL节点,支持动态调整负载均衡策略(如轮询、权重)运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群
实验过程
1.安装MySQL数据库
数据库创建完成后登录上,创建测试用户,后续用来验证实验(master1、master2)
mysql -uroot -ppwd123
create user 'test'@'192.168.10.%' identified by '123456';
grant all on *.* to 'test'@'192.168.10.%';
alter user 'test'@'192.168.10.%' identified with mysql_native_password by '123456';
flush privileges;
2.配置mysql主主复制
(1)master1中:
vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=1
log-slave-updates=1
(2)master2中:
vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=2
log-slave-updates=1
(3)重启mysql服务,两台都执行
systemctl restart mysqld
(4)登录mysql程序,给从服务器授权,两台都执行
mysql -u root -ppwd123
create user 'myslave'@'192.168.10.%' identified by '123456';
grant replication slave on *.* to 'myslave'@'192.168.10.%';
alter user 'myslave'@'192.168.10.%' identified with mysql_native_password by '123456';
flush privileges;
(5)登录mysql,配置同步,两台都执行
master1:
change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;
start slave;
master2:
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;
start slave;
3.安装haproxy
HAProxy是一个开源的高性能负载均衡和代理工具,支持TCP/HTTP应用的流量分发,具备健康检查、SSL终止、会话保持等功能,广泛应用于Web服务器集群、数据库读写分离及API网关场景,以高效稳定的特性提升系统的可用性和扩展能力
以下,两台keepalived都要执行
(1)关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config'
setenforce 0
systemctl disable firewalld
systemcrl stop firewalld
(2)安装haproxy
dnf install haproxy
(3)编辑haproxy配置文件
更改部分红色标注,两台配置相同
defaults tcp
option tcplog
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.101:3306 check port 3306 maxconn 30
注释:
mode tcp:表示tcp代理
listen mysql 0.0.0.0:3306表示创建一个名为mysql的监听服务
bind 0.0.0..0:3306绑定到所有网卡的3306端口(mysql)默认端口,作为流量入口
balance leastconn指定使用 最少连接算法 分配请求,将新连接导向当前活跃连接最少的后端服务器,避免单点过载
Server声明两个mysql服务器节点mysql1和mysql2分别指向192.168.10.101:3306和192.168.10.102:3306
check port 3306表示通过检查节点的3306端口是否响应,判断其存活状态
maxconn 300限制每个后端节点的最大并发连接数为300,防止节点被压垮
(4)检测配置文件并启动服务
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
(5)测试
使用测试用户test,访问haproxy的代理端口登录mysql
mysql -utest -p123456 -h192.168.10.103 -p3306
4.安装keepalived
Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断。常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。
以下过程两台keepalived都要执行
(1)关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled' / root/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
(2)安装keepalived
dnf install keepalived
(3)编辑haproxy配置文件
第一台keepalived1配置,红色标注为两台不同之处
cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
global_defs {
router_id r1
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface ens33
priority 100
启用nopreempt作用:
节点A(优先级100,配置nopreempt)故障,节点B成为Master
节点A恢复,不触发抢占,节点B继续作为Master,VIP不切换
仅当节点B故障时,节点A才会重新成为Master
添加监控脚本并启动keepalived
vim /etc/keepalived/chk.sh
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
chmod +x /etc/keepalived/chk.sh
systemctl start keepalived
配置keepalived2,红色标注为两台不同之处
cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
global_defs {
router_id r2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
priority 99
添加监控脚本并启动keepalived
vim /etc/keepalived/chk.sh
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
chmod +x /etc/keepalived/chk.sh
systemctl start keepalived
此处两台主机均配置为BACKUP,因此哪台先运行keepalived,VIP就在哪台上
在keepalived测试查看VIP(查看VIP只能使用ip命令,ifconfig不显示)
命令:ip -a
(4)编测试使用VIP连接mysql
mysql -utest -p123456 -h192.168.10.100
5.测试故障转移
1.关闭 master1 主机,测试使用 vip 能否正常访问 mysql 数据库关闭 master1后,因为master1、master2 通过 haproxy 负载均衡,masterl关闭后,haproxy 检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysq1 的高可用
ping 192.168.10.101 #ping masterl 发现已离线
mysql -utest -p123456 -h192.168.10.100
2.接着关闭 keepalivedl,测试使用 vip 能否正常访问 mysql 数据库关闭keepalived1后,keepalived 检测到主节点离线,VIP 192.168.10.100会漂移至 keepalived2 节点,mysql 依然可以访问
ip a #vip 192.168.10.100 漂移至 keepalived
mysql -utest -p123456 -h192.168.10.100