Keepalived + LVS(DR) + MariaDB 双主备实践
一、架构背景与核心诉求
这套架构旨在解决传统单节点或简单主从数据库的痛点,实现以下目标:
- 高可用(无间断服务) :消除单点故障,故障自动切换,目标可用性 99.99%。
- 高性能(高并发承载):突破单主写瓶颈(双主同时写),LVS统一分发读请求,消除负载不均。
- 数据可靠性(零丢失):双主实时双向同步,任一节点故障数据不丢。
- 可扩展性:增加节点无需修改业务代码。
二、技术原理
1、MariaDB 主主复制原理:
实质是==双主双向同步==,即将两台服务器互为主从。
- 主库:将数据变更写入二进制日志(binlog)。
- 从库IO线程:连接主库,拉取binlog,写入本地中继日志(relay log)。
- 从库SQL线程:读取relay log并在本地执行,实现数据同步。
- 主主核心:先配置 db1→db2 的主从同步,再配置 db2→db1 的同步,双方即可互相同步数据。
2、LVS(DR模式)原理
- 工作层级 :四层(传输层),基于IP和端口转发,性能极高。
- DR模式(直接路由) :
- 请求路径:客户端 → LVS → 后端数据库(Real Server)。
- 响应路径 :后端数据库 → 客户端(直接返回,不经LVS)。
- 关键点 :LVS和后端服务器需配置相同的虚拟IP(VIP),并抑制后端服务器对VIP的ARP响应。
3、Keepalived 原理
- 作用:为LVS提供高可用,解决LVS本身的单点故障。
- 机制:通过VRRP协议在主备LVS节点间虚拟出一台路由器。
- 工作方式:主节点拥有VIP,故障时备用节点在1~3秒内抢占VIP,接管流量,实现无感知切换。
三、环境准备
| 主机名 | IP地址 | 服务器角色 |
|---|---|---|
| client1 | 10.1.8.21/24 | 客户端(vmnet8网段) |
| client2 | 10.1.1.21/24 | 客户端(vmnet1网段) |
| ha1 | 10.1.8.13/24 | LVS + Keepalived 主节点 |
| ha2 | 10.1.8.14/24 | LVS + Keepalived 备节点 |
| db1 | 10.1.8.11/24 | MariaDB 主库1(主主互备) |
| db2 | 10.1.8.12/24 | MariaDB 主库2(主主互备) |
| router | 10.1.8.20/24 10.1.1.20/24 | 路由器(转发跨网段流量) |
| VIP | 10.1.8.100 | 集群对外服务虚拟IP |
四、实践步骤
第一部分:环境基础配置
1、所有节点:设置主机名与IP
以ha1为例,其他节点类似,确保IP、网关正确。
bash
hostnamectl set-hostname ha1.harvy.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.13/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
2、路由转发
bash
# 开启路由转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 配置防火墙伪装,使不同网段客户端能互访【不设置会影响client2的网络访问】
systemctl enable firewalld --now
firewall-cmd --set-default-zone=trusted
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
第二部分: MariaDB 主主复制配置
1、安装并初始化db1和db2
两台都要做
bash
# 安装
yum install -y mariadb-server
# 开启二进制日志(主主复制必需)
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=1 # db2上设为2,两者不能相同
log_bin=mysql-bin
relay_log=mysql-relay-bin
systemctl enable mariadb --now
mysql_secure_installation # 按提示设置root密码,删除匿名用户等
2、配置db1 --> db2主从同步
- 在db1上(将此节点视为主库)创建复制账号:
bash
mysql -uroot -p
grant replication slave, replication client on *.* to 'repl'@'10.1.8.12' identified by 'huawei';
flush privileges;
show master status; -- 记住 File 和 Position 值,如 mysql-bin.000003, 327
- 在db2上(将此节点视为db1的从库)配置并启动同步:
bash
mysql -uroot -p
change master to
master_host='10.1.8.11',
master_user='repl',
master_password='huawei',
master_port=3306,
master_log_file='mysql-bin.000003', -- 需与上面show master status结果一致
master_log_pos=327,
master_connect_retry=30;
start slave;
show slave status\G; -- 确认 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes
3、验证单向同步
在db上建库、表、插入数据,到db2上查询,确认数据已同步。
4、配置db2-->db1主从同步,实现主主互备
- 在db2上创建复制账号并查看状态:
bash
-- 在db2上执行
grant replication slave, replication client on *.* to 'repl'@'10.1.8.11' identified by 'huawei';
flush privileges;
show master status; -- 记下结果,用于db1的同步配置
- 在db1上配置并启动反向同步:
bash
-- 在db1上执行
change master to master_host='10.1.8.12', master_user='repl', master_password='huawei', master_port=3306, master_log_file='[db2的binlog文件]', master_log_pos=[db2的pos值], master_connect_retry=30;
start slave;
show slave status\G; -- 确认双Yes
第三部分:LVS + Keepalived 负载均衡高可用配置
1、后端服务器配置(db1和db2均需操作)
- 配置VIP到本地回环口,并抑制ARP响应,这是DR模式的核心。
bash
# 添加VIP到回环口(dummy接口)
nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
nmcli connection up dummy
# 抑制对VIP的ARP解析
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy.arp_ignore = 1
net.ipv4.conf.dummy.arp_announce = 2
EOF
sysctl -p
2、配置主LVS+Keepalived(ha1)
bash
yum install -y keepalived ipvsadm
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
配置文件内容:
tex
global_defs {
router_id ha1 # 唯一标识
}
vrrp_instance db { # VRRP实例,与ha2保持一致
state MASTER # 角色为MASTER
interface ens33
virtual_router_id 51 # 主备必须相同
priority 110 # 优先级高于备机,抢占VIP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 认证密码,主备一致
}
virtual_ipaddress {
10.1.8.100/24 # 对外VIP
}
}
virtual_server 10.1.8.100 3306 { # LVS虚拟服务配置
delay_loop 6
lb_algo rr # 轮询算法
lb_kind DR # 直接路由模式
persistence_timeout 50 # 持久连接超时
protocol TCP
real_server 10.1.8.11 3306 { # 后端db1
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.12 3306 { # 后端db2
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
bash
# 启动keepalived服务
systemctl enable keepalived --now
3、 配置备LVS+Keepalived(ha2)
安装步骤与ha1完全相同,配置文件修改以下几项:
router_id ha2state BACKUPpriority 100(必须小于ha1的110)
其余配置(virtual_router_id, 密码,virtual_ipaddress,virtual_server)须与ha1完全一致。
五、测试验证
1、创建远程访问测试账号(任意一个DB节点执行,会自动同步)
bash
mysql -uroot -p
grant ALL PRIVILEGES on *.* to 'harvy'@'%' identified by '123456';
FLUSH PRIVILEGES;
2、功能与高可用测试
- 基础连接测试 :客户端执行
mysql -uharvy -p123456 -h 10.1.8.100,能成功连上并读写。 - LVS负载均衡测试 :停掉ha1的keepalived (
systemctl stop keepalived),检查VIP是否漂移到ha2 (ip a查看),客户端连接VIP不应中断。 - DB故障转移测试 :停掉db1的mariadb (
systemctl stop mariadb),客户端连接VIP应能自动路由到db2,业务无感知;重启db1后,show slave status\G检查双向同步状态是否恢复正常。