高可用架构实战:Keepalived+LVS(DR)+MariaDB主主集群搭建指南
在生产环境中,数据库单点故障、访问压力不均、服务切换中断是绝大多数业务系统的核心痛点。普通 MariaDB 单节点架构无法承载高并发、高可用业务,常规主从架构存在主节点单点故障、读写切换繁琐等问题。
今天给大家拆解一套生产级高可用高性能架构:Keepalived+LVS(DR)+MariaDB主主集群。这套架构结合了 LVS 四层高性能负载均衡、DR 模式无损耗转发、Keepalived 故障自动漂移、MariaDB 主主双向同步的核心优势,彻底解决数据库单点故障、并发瓶颈、手动切换运维难题,适配中小型企业生产业务、高并发接口、核心数据存储场景。
本文从架构原理、组件分工、环境规划、分步实操、故障演练、生产避坑全方位讲解,全程可直接复刻部署,零基础也能落地。
一、架构整体介绍:
1. 架构核心痛点解决
传统数据库架构缺陷:
-
单节点 MariaDB:单点故障,宕机业务直接中断,无法扩容
-
MariaDB 主从架构:主节点唯一写入口,主库宕机需手动切换,存在数据延迟、单点风险
-
单一负载均衡节点:负载均衡器自身形成新的单点故障
而 Keepalived+LVS(DR)+MariaDB 主主 架构实现了全链路无单点故障、读写负载均衡、自动故障切换、数据双向同步,是轻量、低成本、高性能的生产最优解。
2. 各组件核心分工
-
MariaDB 主主集群:两台数据库双向同步,互为主从,均可读写,数据实时同步;单库宕机不丢失数据,无需手动切换主从角色
-
LVS(DR直接路由模式):四层负载均衡,基于IP+端口转发数据库请求;DR模式不修改数据包、不占用带宽,转发性能极高,支持百万级并发,远超Nginx七层转发
-
Keepalived:基于VRRP协议实现LVS节点高可用,监控LVS服务与数据库状态;主节点故障自动漂移VIP,秒级切换备节点,全程无人工干预
3. 架构运行流程
客户端统一连接虚拟VIP访问数据库,请求经过以下链路:
客户端SQL请求 → VIP → Keepalived主节点LVS → 按照调度规则分发至两台MariaDB主主节点 → 数据库处理请求并返回数据 → 直接原路返回客户端(DR模式特性)
任意LVS节点、任意MariaDB节点宕机,架构自动容错,业务无感知中断。
二、核心技术原理精讲
1. LVS DR模式核心优势
LVS 包含 NAT、TUN、DR 三种模式,生产数据库场景首选DR直接路由模式:
-
请求入站经过LVS调度,响应出站直接由数据库节点返回客户端,不经过LVS,极大降低调度节点压力
-
无需修改数据包IP地址,转发效率极高,性能损耗极低
-
支持大规模并发连接,完美适配数据库高频读写场景
关键注意:DR模式需要所有数据库节点抑制ARP广播,避免VIP地址冲突导致调度异常。
2. MariaDB主主同步原理
两台 MariaDB 节点互相开启binlog日志,双向配置主从同步:
-
节点A的数据变更同步至节点B,节点B的数据变更同步至节点A
-
双节点均可独立读写,实现读写负载分担
-
配合自增ID偏移配置,避免双节点同时写入导致主键冲突
3. Keepalived高可用原理
部署双LVS节点(主备模式),通过VRRP协议通信:
-
正常情况下,主节点绑定VIP,承担所有请求调度
-
实时监控LVS服务、网络状态、数据库节点存活
-
主节点故障后,备节点秒级抢占VIP,接管所有业务,实现故障自动转移
三、实验环境规划
本次搭建采用双LVS+双MariaDB架构,无单点故障,环境参数统一规划:
| 节点角色 | 真实IP | 软件版本 | 核心服务 |
|---|---|---|---|
| LVS主节点(MASTER) | 192.168.10.10 | CentOS7+、LVS、Keepalived | 负载调度、VIP主承载 |
| LVS备节点(BACKUP) | 192.168.10.11 | CentOS7+、LVS、Keepalived | 故障冗余、VIP漂移接管 |
| MariaDB主主节点1 | 192.168.10.12 | MariaDB 10.6+ | 数据库读写、双向同步 |
| MariaDB主主节点2 | 192.168.10.13 | MariaDB 10.6+ | 数据库读写、双向同步 |
统一虚拟VIP:192.168.10.100,客户端统一访问该IP连接数据库
四、分步实操部署(全程可复刻)
部署顺序:MariaDB主主集群部署 → LVS环境配置 → Keepalived高可用配置 → ARP抑制优化 → 架构验证与故障演练
第一步:部署MariaDB主主集群(双节点)
两台数据库节点均安装MariaDB,关闭防火墙与SELinux,保证网络互通。
1. 基础环境准备(双节点执行)
Plain
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装MariaDB
yum install mariadb-server mariadb -y
systemctl start mariadb && systemctl enable mariadb
# 安全初始化
mysql_secure_installation
2. 配置主主同步参数
**节点1(192.168.10.12)**编辑配置文件 /etc/my.cnf
Plain
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 开启binlog日志
log_bin=mysql-bin
binlog_format=MIXED
# 服务器ID(双节点必须不同)
server-id=1
# 自增ID偏移,避免主键冲突
auto_increment_increment=2
auto_increment_offset=1
# 同步忽略系统库
binlog_ignore_db=mysql
# 开启同步日志
relay_log=relay-bin
**节点2(192.168.10.13)**编辑配置文件 /etc/my.cnf
Plain
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log_bin=mysql-bin
binlog_format=MIXED
server-id=2
auto_increment_increment=2
auto_increment_offset=2
binlog_ignore_db=mysql
relay_log=relay-bin
3. 重启服务并创建同步账号
双节点重启MariaDB服务
Plain
systemctl restart mariadb
节点1执行MySQL命令,授权节点2同步:
Plain
mysql -u root -p
# 创建同步用户
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'192.168.10.13' IDENTIFIED BY 'Sync@123456';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
# 查看binlog状态,记录文件名和位置
SHOW MASTER STATUS;
节点2执行MySQL命令,授权节点1同步:
Plain
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'192.168.10.12' IDENTIFIED BY 'Sync@123456';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
4. 双向关联主从,完成主主同步
节点1关联节点2为主库:
Plain
CHANGE MASTER TO
MASTER_HOST='192.168.10.13',
MASTER_USER='sync',
MASTER_PASSWORD='Sync@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=XXX;
START SLAVE;
SHOW SLAVE STATUS\G
节点2关联节点1为主库:
Plain
CHANGE MASTER TO
MASTER_HOST='192.168.10.12',
MASTER_USER='sync',
MASTER_PASSWORD='Sync@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=XXX;
START SLAVE;
SHOW SLAVE STATUS\G
验证标准:双节点 Slave_IO_Running、Slave_SQL_Running 均为 Yes,主主同步搭建完成。
第二步:LVS DR模式环境配置(双LVS节点)
1. 安装依赖工具
Plain
# 双节点安装ipvsadm工具
yum install ipvsadm -y
# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i 's/^net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sysctl -p
2. 数据库节点ARP抑制配置(关键)
两台MariaDB节点执行,抑制VIP的ARP广播,避免IP冲突:
Plain
# 临时配置
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 永久配置
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
sysctl -p
# 回环网卡绑定VIP
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
第三步:Keepalived安装与配置(双节点)
1. 安装Keepalived
Plain
yum install keepalived -y
systemctl start keepalived && systemctl enable keepalived
2. 主节点(192.168.10.10)配置
清空默认配置,新建 /etc/keepalived/keepalived.conf
Plain
global_defs {
router_id LVS_MASTER
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# VRRP实例配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.10.100/24 dev eth0 label eth0:1
}
}
# LVS负载均衡规则
virtual_server 192.168.10.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 600
protocol TCP
# 真实数据库节点1
real_server 192.168.10.12 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# 真实数据库节点2
real_server 192.168.10.13 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3. 备节点(192.168.10.11)配置
仅修改 state 与 priority,其余配置完全一致
Plain
global_defs {
router_id LVS_BACKUP
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.10.100/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.10.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 600
protocol TCP
real_server 192.168.10.12 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.13 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4. 重启服务生效
Plain
systemctl restart keepalived
# 查看LVS规则
ipvsadm -Ln
五、架构功能验证与故障演练
1. 基础功能验证
-
主节点绑定VIP 192.168.10.100,备节点无VIP
-
客户端通过VIP:3306可正常连接MariaDB,读写数据正常
-
双数据库节点数据双向同步,新增数据两边均可查询
-
ipvsadm可正常看到两台真实服务器调度规则
2. 故障自动切换演练
场景1:LVS主节点宕机
关闭主节点Keepalived服务,VIP秒级漂移至备节点,数据库访问无中断、无报错,业务正常运行。重启主节点后,VIP自动回迁主节点。
场景2:单台MariaDB节点宕机
关闭其中一台数据库服务,Keepalived自动检测节点状态,剔除故障节点,所有请求自动调度至正常节点;重启故障节点后,自动重新加入集群,恢复负载分担。
场景3:双数据库交叉写入
分别在两台数据库新建库表、插入数据,两边数据实时同步,无主键冲突、无数据丢失,主主同步正常生效。
六、生产环境核心避坑指南
1. DR模式必避坑
所有后端MariaDB节点必须配置ARP抑制与回环网卡绑定VIP,否则会出现IP冲突、请求调度混乱、数据库连接超时等问题,是DR模式部署最容易出错的关键点。
2. 主主同步避坑
必须配置自增ID步长与偏移,双节点同时写入时,避免主键重复导致同步失败;生产环境建议关闭mysql库同步,仅同步业务库,提升同步效率。
3. Keepalived避坑
主备节点 virtual_router_id、认证密码必须完全一致;严格区分主备优先级,防止VIP来回漂移引发业务抖动。
4. 性能优化建议
-
根据业务场景调整调度算法:读多写少用rr轮询,热点数据用wlc加权调度
-
合理配置会话保持时间,避免频繁断开重连
-
开启MariaDB并行复制,提升主主同步速度
七、架构总结与适用场景
Keepalived+LVS(DR)+MariaDB主主 架构,完美融合了四层负载的高性能、VRRP的高可用、主主数据库的高容错特性,解决了传统数据库架构的所有核心痛点。
架构核心优势总结:
-
全链路高可用:负载层、数据层均无单点故障,故障秒级自动切换
-
高性能低损耗:LVS DR模式转发几乎无性能损耗,支撑高并发数据库访问
-
数据高可靠:双向实时同步,双节点热备,杜绝数据丢失
-
运维极简:全程自动化容错,无需人工干预切换
适用场景:中小型生产核心数据库、高并发读写业务、需要7*24小时不间断运行的系统、MySQL/MariaDB数据库高可用改造场景。