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、网关正确。
hostnamectl set-hostname ha1.harvy.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses10.1.8.13/24 ipv4.gateway10.1.8.20 ipv4.dns223.5.5.5 autoconnectyesnmcli connection up ens332、路由转发
# 开启路由转发echo"net.ipv4.ip_forward = 1">>/etc/sysctl.confsysctl-p# 配置防火墙伪装,使不同网段客户端能互访【不设置会影响client2的网络访问】systemctlenablefirewalld--nowfirewall-cmd --set-default-zone=trusted firewall-cmd --add-masquerade--permanentfirewall-cmd--reload第二部分: MariaDB 主主复制配置
1、安装并初始化db1和db2
两台都要做
# 安装yuminstall-ymariadb-server# 开启二进制日志(主主复制必需)vim/etc/my.cnf.d/server.cnf[mysqld]server-id=1# db2上设为2,两者不能相同log_bin=mysql-binrelay_log=mysql-relay-bin systemctlenablemariadb--nowmysql_secure_installation# 按提示设置root密码,删除匿名用户等2、配置db1 --> db2主从同步
- 在db1上(将此节点视为主库)创建复制账号:
mysql-uroot-pgrant 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的从库)配置并启动同步:
mysql-uroot-pchange master tomaster_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 均为 Yes3、验证单向同步
在db上建库、表、插入数据,到db2上查询,确认数据已同步。
4、配置db2–>db1主从同步,实现主主互备
- 在db2上创建复制账号并查看状态:
-- 在db2上执行 grant replication slave, replication client on *.* to'repl'@'10.1.8.11'identified by'huawei';flush privileges;show master status;-- 记下结果,用于db1的同步配置- 在db1上配置并启动反向同步:
-- 在db1上执行 change master tomaster_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模式的核心。
# 添加VIP到回环口(dummy接口)nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.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 EOFsysctl-p2、配置主LVS+Keepalived(ha1)
yuminstall-ykeepalived ipvsadmcp/etc/keepalived/keepalived.conf{,.bak}vim/etc/keepalived/keepalived.conf配置文件内容:
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 } } }# 启动keepalived服务systemctlenablekeepalived--now3、配置备LVS+Keepalived(ha2)
安装步骤与ha1完全相同,配置文件修改以下几项:
router_id ha2state BACKUPpriority 100(必须小于ha1的110)
其余配置(virtual_router_id, 密码,virtual_ipaddress,virtual_server)须与ha1完全一致。
五、测试验证
1、创建远程访问测试账号(任意一个DB节点执行,会自动同步)
mysql-uroot-pgrant 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检查双向同步状态是否恢复正常。