云计算百科
云计算领域专业知识百科平台

彻底解决数据库单点故障!Keepalived+LVS(DR)+MariaDB主主高可用架构实战

彻底解决数据库单点故障!Keepalived+LVS(DR)+MariaDB主主高可用架构实战

一、项目背景

1.1 业务场景与数据库核心诉求

在企业级应用中,数据库作为业务数据的“核心载体”,其高可用性、读写性能、数据一致性直接决定业务能否稳定运行。无论是电商交易系统(订单生成、库存扣减)、金融支付平台(交易对账、资金流转),还是政务管理系统(数据上报、业务审批),均对数据库提出以下刚性需求:

(1)无间断服务(高可用)

数据库需实现24×7小时不间断运行,避免因单点故障(如数据库服务器宕机、磁盘损坏、网络中断)导致业务中断。例如:电商平台秒杀活动中,若数据库不可用,将直接导致订单无法生成,每中断1分钟可能造成数万元营收损失;金融系统中,数据库故障可能引发交易对账异常,甚至触发合规风险。

(2)高并发承载(读写性能)

随着用户规模增长,数据库面临的读写请求呈指数级上升(如日均SQL执行量从100万次增至1亿次)。单台数据库服务器的CPU、内存、IO能力易成为瓶颈:读请求过多会导致查询延迟(如用户查询订单列表超时),写请求集中会造成事务阻塞(如多用户同时提交订单导致库存更新排队)。

(3)数据零丢失(可靠性)

业务数据需具备“抗丢失”能力,即使遭遇硬件故障或软件异常,也需保证数据不损坏、不丢失。例如:用户充值记录、订单信息若因数据库故障丢失,将直接引发用户投诉与信任危机;同时,多节点间的数据需实时同步,避免出现“主库数据已更新,从库仍展示旧数据”的一致性问题。

(4)灵活扩展(可扩展性)

业务增长过程中,需支持“按需扩展”数据库能力:读压力增大时可快速新增读节点,写压力上升时可优化写分发策略,避免因架构僵化导致“业务倒逼重构”的被动局面。

1.2 传统数据库架构的痛点与局限

在采用《Keepalived + LVS(DR)+ MariaDB 主主》方案前,多数企业曾使用“单节点数据库”或“简单主从架构”,但面临以下难以突破的瓶颈:

(1)单节点数据库:单点故障风险致命

问题核心:数据库仅部署在一台服务器上,一旦服务器硬件故障(如电源损坏、磁盘坏道)或软件崩溃(如MariaDB进程异常退出),将导致全量业务中断。

恢复效率低:依赖人工干预恢复(如更换服务器、重建数据库、恢复备份),平均恢复时间(MTTR)通常超过30分钟,远无法满足“秒级切换”的业务需求;若备份数据不完整,还可能导致部分业务数据永久丢失。

(2)简单主从架构(一主一从):读写瓶颈与切换缺陷

读性能局限:虽然通过“主库写、从库读”分摊读压力,但从库仅能扩展读能力,无法缓解主库的写压力(如大量订单写入仍集中在主库);且从库数量增多时,缺乏统一的读请求分发机制,易导致部分从库过载(如某台从库承担80%读请求)、部分从库空闲。

高可用缺陷:主库故障时,需手动将从库提升为新主库,再修改业务系统的数据库连接地址,切换过程耗时且易出错(如忘记同步从库未应用的binlog导致数据不一致);同时,从库仅作为“备用节点”,写请求始终依赖主库,主库写瓶颈无法突破。

(3)无负载均衡:请求分发混乱

部分企业尝试用“业务层硬编码连接地址”实现读写分离(如读请求连从库IP,写请求连主库IP),但存在两大问题:

① 缺乏故障检测机制:若某台从库宕机,业务层无法实时感知,仍会将读请求分发至故障节点,导致部分读业务失败;

② 扩展性差:新增读节点时,需修改业务代码中的连接地址列表,重启服务才能生效,不符合“无感知扩展”的运维需求。

(4)数据同步与一致性风险

传统主从架构依赖MariaDB原生的binlog同步,若网络延迟或主库binlog丢失,会导致从库数据滞后或同步失败;且主库故障时,若从库未完全同步主库数据,强制切换会造成“数据断层”(如主库已提交的订单,从库未记录)。

1.3 技术方案选型逻辑

针对上述传统架构痛点,本次采用 Keepalived + LVS(DR) + MariaDB主主 企业级高可用组合,各组件分工明确、互补适配,彻底解决单点故障、读写瓶颈、数据不一致、扩容困难等问题。

(1)MariaDB 主主双活架构

摒弃传统“单主写、多从读”架构,采用双节点双向互为主从,两台数据库均支持读写接入。一方面突破单主写入性能瓶颈,写并发能力翻倍;另一方面双节点实时binlog双向同步,任意节点宕机均无数据丢失,天然实现数据库层双活容灾。

(2)LVS-DR 四层负载均衡

LVS工作在四层传输层,基于IP+端口转发请求,转发性能、并发承载能力远超Nginx等七层负载均衡,单机可支撑10万+并发连接。DR直接路由模式核心优势:请求经过LVS调度转发,后端数据库响应流量直接回包客户端,不经过LVS回程,无带宽瓶颈,转发效率接近物理直连。同时自带实时节点健康检查,自动剔除故障数据库节点。

(3)Keepalived 高可用调度

解决LVS调度器自身单点故障问题,基于VRRP协议实现LVS主备节点秒级故障转移。主节点故障后,备节点1-3秒自动接管VIP虚拟IP,业务无感知、无需人工干预,实现负载均衡层100%高可用。

1.4 项目价值与预期目标

通过整套架构落地,实现技术、运维、业务全方位升级:

1. 高可用升级:数据库服务可用性从99.9%提升至99.99%,年均故障中断时间大幅缩减,核心业务实现秒级容灾;

2. 性能大幅提升:突破单主写入瓶颈,双主写TPS翻倍,读节点可无限横向扩容,SQL查询响应延迟大幅降低;

3. 数据安全可靠:双主双向实时同步,规避数据断层、数据丢失问题,故障自动转移,全程自动化容灾;

4. 运维极简高效:新增数据库节点仅需接入LVS集群,无需修改业务代码、无需重启业务服务,实现无感扩容。

二、MariaDB 主从/主主同步核心原理

2.1 核心组件说明

MariaDB主从复制基于binlog日志实现,核心依赖日志文件与专属同步线程:

1. binlog(主库二进制日志):数据库核心日志,记录所有增删改、表结构变更等数据变更操作,是数据同步的唯一数据源;

2. relay log(从库中继日志):从库本地临时日志,用于缓存从主库拉取的binlog数据,避免网络波动导致数据同步中断、丢失;

3. 核心同步线程:主库binlog dump线程(推送日志)、从库IO线程(拉取日志)、从库SQL线程(回放日志)。

2.2 标准主从同步流程

1. 主库执行数据增删改操作,事务提交后,有序将操作事件写入binlog日志;

2. 从库IO线程主动连接主库,携带日志文件名、同步点位,请求增量日志数据;

3. 主库binlog dump线程响应请求,推送对应增量binlog事件至从库;

4. 从库IO线程接收日志,写入本地relay中继日志,并更新同步点位记录;

5. 从库SQL线程实时读取中继日志,顺序回放SQL事件,完成数据同步,最终实现主从数据一致。

2.3 主主复制实现原理

主主复制本质是双向主从复制:将两台数据库节点互相配置为对方的主库和从库,db1同步db2日志、db2同步db1日志,双向实时同步数据,最终实现双节点数据完全一致、均可读写接入。

三、项目实验环境

本次部署所有主机统一网段规划、角色明确,适配企业测试/生产模拟环境:
在这里插入图片描述

主机名IP 地址网关DNSVIP 地址服务器角色
client2.fb.cloud 10.1.1.21 (vmnet1) 10.1.1.20 223.5.5.5 无 客户端
client1.fb.cloud 10.1.8.21 (vmnet8) 10.1.8.20 223.5.5.5 无 客户端
router.fb.cloud 10.1.8.20 (vmnet8)10.1.1.20 (vmnet1) 10.1.8.2无网关 223.5.5.5无 DNS 无 路由器
ha1.fb.cloud 10.1.8.13 (vmnet8) 10.1.8.20 223.5.5.5 10.1.8.100 LVS+keepalived 服务器
ha2.fb.cloud 10.1.8.14 (vmnet8) 10.1.8.20 223.5.5.5 10.1.8.100 LVS+keepalived 服务器
db1.fb.cloud 10.1.8.11 (vmnet8) 10.1.8.20 223.5.5.5 10.1.8.100 db 服务器
db2.fb.cloud 10.1.8.12 (vmnet8) 10.1.8.20 223.5.5.5 10.1.8.100 db 服务器

四、全局基础环境配置

4.1 所有节点主机名与IP配置

统一配置各节点静态IP、主机名、网关与DNS,保证内网互通:

# client1 配置
hostnamectl set-hostname client1.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# client2 配置
hostnamectl set-hostname client2.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# router:
hostnamectl set-hostname router.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.20/24 autoconnect yes
nmcli connection up ens36

# ha1 配置
hostnamectl set-hostname ha1.fb.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

# ha2 配置
hostnamectl set-hostname ha2.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.14/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# db1 配置
hostnamectl set-hostname db1.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# db2 配置
hostnamectl set-hostname db2.fb.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

4.2 路由网关转发配置

路由节点开启内核转发、配置防火墙伪装,实现跨网段互通:

# 开启内核IP转发
[root@router ~ 22:08:06]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~ 22:08:58]# sysctl -p
net.ipv4.ip_forward = 1

# 防火墙配置,放行所有流量,且开启NAT地址伪装功能
[root@router ~ 22:09:51]# systemctl enable firewalld.service –now
[root@router ~ 22:10:19]# firewall-cmd –set-default-zone=trusted
[root@router ~ 22:10:49]# firewall-cmd –add-masquerade
[root@router ~ 22:11:01]# firewall-cmd –add-masquerade –permanent

五、MariaDB 安装、初始化与主主同步部署

5.1 db1、db2 安装数据库

# 安装服务
[root@db1-2 ~ 22:03:05]# yum -y install mariadb-server

# 启动服务,并设置开机自启
[root@db1-2 ~ 22:13:29]# systemctl enable mariadb –now

# 查看状态
[root@db1-2 ~ 22:13:48]# systemctl status mariadb

# 关闭防火墙
[root@db1-2 ~ 22:14:23]# systemctl disable firewalld –now

5.2 数据库配置文件修改

db1 配置 /etc/my.cnf.d/server.cnf

[root@db1 ~ 22:14:03]# vim /etc/my.cnf.d/server.cnf
# 在下面新增3行
[mysqld]
server-id=1
log_bin=mysql-bin
relay_log=mysql-relay-bin

db2 配置 /etc/my.cnf.d/server.cnf

[root@db2 ~ 22:18:09]# vim /etc/my.cnf.d/server.cnf
# 在下面新增3行
[mysqld]
server-id=2
log_bin=mysql-bin
relay_log=mysql-relay-bin

配置完成重启服务:

[root@db1-2 ~ 22:18:15]# systemctl restart mariadb

5.3 数据库安全初始化(双节点一致)

[root@db1-2 ~ 22:19:09]# mysql_secure_installation

交互流程:默认回车无密码登录 – 设置密码为 huawei – 全程回车默认删除匿名用户、禁止远程root登录、删除test库、刷新权限。

5.4 搭建双向主主同步

5.4.1 db1授权同步用户、查看主库状态

# # 1、创建复制用户repl,仅允许从10.1.8.12连接,密码huawei,2、授予复制从库、复制客户端权限,*.*对全部库表生效
[root@db1 ~ 22:21:31]# mysql -uroot -phuawei -e "grant replication slave, replication client on *.* to 'repl'@'10.1.8.12' identified by 'huawei';"

# 刷新权限
[root@db1 ~ 22:26:46]# mysql -uroot -phuawei -e "flush privileges;"

# 输出File(日志文件名)、Position(日志偏移位置),用于从库配置复制起点
[root@db1 ~ 22:28:10]# mysql -uroot -phuawei -e "show master status;"
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 1728 | | |
+——————+———-+————–+——————+

5.4.2 db2配置同步指向db1

mysql -uroot -phuawei << EOF
change master to
master_host='10.1.8.11', # 主库IP地址(db1.fb.cloud)
master_user='repl', # 主库授权的复制账号
master_password='huawei', # 复制账号repl的密码
master_port=3306, # 主库MySQL服务端口,默认3306
master_log_file='mysql-bin.000001', # 主库show master status获取的binlog日志文件名
master_log_pos=1728, # binlog日志偏移位置,从该点位开始同步数据
master_connect_retry=30; # 连接主库失败后,间隔30秒重试连接
start slave; # 启动从库IO线程、SQL线程,开启主从复制
EOF

# 竖行展示输出,重点看 Slave_IO_Running、Slave_SQL_Running 均为 Yes
[root@db2 ~ 22:39:10]# mysql -uroot -phuawei -e "show slave status\\G;"

# 注意如果从库有旧复制残留,执行下面命令,停止并清空旧复制配置
mysql -uroot -phuawei -e "stop slave;reset slave all;" # 停止并清空旧复制配置

校验:Slave_IO_Running=Yes、Slave_SQL_Running=Yes即为正常。

5.4.3 db2授权同步用户、查看主库状态

[root@db2 ~ 22:40:05]# mysql -uroot -phuawei -e "grant replication slave, replication client on *.* to 'repl'@'10.1.8.11' identified by 'huawei';"
[root@db2 ~ 22:45:41]# mysql -uroot -phuawei -e "flush privileges;"
[root@db2 ~ 22:45:59]# mysql -uroot -phuawei -e "show master status"
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 1728 | | |
+——————+———-+————–+——————+

5.4.4 db1配置同步指向db2

mysql -uroot -phuawei << EOF
change master to
master_host='10.1.8.12',
master_user='repl',
master_password='huawei',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=1728,
master_connect_retry=30;
start slave;
EOF

# 竖行展示输出,重点看 Slave_IO_Running、Slave_SQL_Running 均为 Yes
[root@db1 ~ 22:48:28]# mysql -uroot -phuawei -e "show slave status\\G;"

5.5 主主同步数据验证

db1创建测试库表写入数据:

# db1创建
mysql -uroot -phuawei << EOF
create database test;
use test;
create table linux(username varchar(15) not null,password varchar(15) not null);
insert into linux values ('fb1', 'huawei'),('fb2', 'huawei'),('fb3', 'huawei');
commit;
EOF

# db2查看
[root@db2 ~ 22:47:28]# mysql -uroot -phuawei -e "show databases;"
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| test |
+——————–+

db2查询可正常同步数据;反向在db2创建库表,db1同样可同步,双向主主搭建完成。

六、LVS-DR 后端数据库节点配置(db1/db2)

DR模式核心配置:两台DB节点均需绑定VIP至本地虚拟网卡,关闭ARP解析,防止IP冲突、回包异常。

# 搭建虚拟网卡承载VIP(掩码为32位),并查看是否生成
[root@db1 ~ 22:49:56]# nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32 autoconnect yes
[root@db1 ~ 22:55:51]# nmcli connection up dummy
[root@db1 ~ 22:56:01]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.11/24 fe80::504c:83ce:f971:1b56/64 fe80::274b:8373:f96a:1c30/64 fe80::2a57:8681:577b:52f8/64
dummy0 DOWN
dummy UNKNOWN 10.1.8.100/32 fe80::376e:1fb1:af89:a20c/64

# 关闭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

# 生效配置
[root@db1 ~ 23:01:25]# sysctl -p
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

七、Keepalived+LVS 调度层部署(ha1/ha2)

7.1 安装依赖组件

# 安装软件
[root@ha1-2 ~ 22:03:05]# yum -y install keepalived ipvsadm

# 备份配置文件
[root@ha1-2 ~ 23:04:08]# cp /etc/keepalived/keepalived.conf{,.ori}

7.2 ha1 主节点配置

[root@ha1 ~ 23:05:36]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ha1 # 设备唯一标识,主节点写ha1,备节点ha2
}

vrrp_instance db { # 定义VRRP实例,实例名称自定义为db
state MASTER # 节点角色,MASTER主节点;备节点要改成BACKUP
interface ens33 # 绑定网卡,VIP漂移到这块网卡上
virtual_router_id 51 # VRRP组ID,主备节点必须完全一致(0‑255)
priority 110 # 优先级,数值越大优先级越高;备节点设置小于110,例100
advert_int 1 # VRRP通告报文发送间隔,单位秒,每秒发一次心跳
authentication { # VRRP通信认证,主备密码必须相同
auth_type PASS # 认证类型:密码明文认证
auth_pass 1111 # VRRP组密码,主备节点必须一模一样
}
virtual_ipaddress { # 配置VIP虚拟IP地址
10.1.8.100/24 # VIP地址,24位子网掩码,会漂移在主备节点之间
}
}

virtual_server 10.1.8.100 3306 { # LVS虚拟服务,VIP+端口,对外提供mysql访问
delay_loop 6 # 后端real_server健康检查循环间隔,单位秒,每6秒检查一次
lb_algo rr # 负载均衡调度算法,rr=轮询
lb_kind DR # LVS工作模式,DR直接路由模式
persistence_timeout 50 # 会话保持时间50秒,同一客户端50秒内调度到同一后端
protocol TCP # 负载均衡协议,MySQL使用TCP

real_server 10.1.8.11 3306 { # 后端真实服务器db1,IP+mysql端口
weight 1 # 权重,调度权重,两台权重一样代表均分流量
TCP_CHECK { # 使用TCP方式做后端服务健康检测
connect_timeout 3 # 连接超时时间3秒,连不上判定服务故障
retry 3 # 失败重试次数,最多重试3次
delay_before_retry 3 # 每次重试之间等待间隔3秒
}
}
real_server 10.1.8.12 3306 { # 后端真实服务器db2,IP+mysql端口
weight 1 # 调度权重
TCP_CHECK { # TCP健康检查
connect_timeout 3 # TCP连接超时3秒
retry 3 # 失败重试3次
delay_before_retry 3 # 重试前等待3秒
}
}
}

7.3 ha2 备节点配置

[root@ha2 ~ 23:08:30]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id ha2
}

vrrp_instance db {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.8.100/24
}
}

virtual_server 10.1.8.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP

real_server 10.1.8.11 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.12 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

7.4 启动高可用服务

# ha1和ha2启动服务,并开启开机自启
[root@ha1-2 ~ 23:20:07]# systemctl enable keepalived –now

# ha1和ha2关闭防火墙
[root@ha1-2 ~ 23:20:42]# systemctl disable firewalld –now

# ha1查看生效情况
[root@ha1 ~ 23:20:30]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.13/24 10.1.8.100/24

八、业务测试用户授权与连通性测试

8.1 数据库授权远程测试账号

[root@db1 ~ 23:01:33]# mysql -uroot -phuawei -e "grant ALL PRIVILEGES on *.* to 'fb'@'%' identified by 'huawei';"
[root@db1 ~ 23:31:01]# mysql -uroot -phuawei -e "FLUSH PRIVILEGES;"

8.2 客户端连接测试

# 客户端mariadb工具
[root@client1 ~ 22:03:04]# yum -y install mariadb

# 通过VIP虚拟入口连接数据库集群
[root@client1 ~ 23:32:35]# mysql -ufb -phuawei -h 10.1.8.100
Welcome to the MariaDB monitor. Commands end with ; or \\g.
Your MariaDB connection id is 299
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

MariaDB [(none)]>

# 当前访问的是db2数据库
MariaDB [(none)]> select @@hostname;
+————–+
| @@hostname |
+————–+
| db2.fb.cloud |
+————–+
1 row in set (0.01 sec)

MariaDB [(none)]>

九、全场景高可用故障模拟测试

验证集群容灾能力,模拟生产常见故障:

9.1 调度器主节点故障转移

# 停止主节点ha1 keepalived
[root@ha1 ~ 23:24:34]# systemctl stop keepalived

# ha2成了主节点
[root@ha2 ~ 23:24:45]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.14/24 10.1.8.100/24

# 客户端可以正常访问
[root@client1 ~ 23:36:27]# mysql -ufb -phuawei -h 10.1.8.100
Welcome to the MariaDB monitor. Commands end with ; or \\g.
Your MariaDB connection id is 357
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

MariaDB [(none)]>

现象:VIP自动漂移至ha2备节点,客户端数据库连接无中断、无报错,业务正常运行。

9.2 后端数据库节点故障剔除

# 停止db2数据库服务
[root@db2 ~ 23:01:33]# systemctl stop mariadb

# 客户端访问正常,访问的是db1数据库
MariaDB [(none)]> select @@hostname;
+————–+
| @@hostname |
+————–+
| db1.fb.cloud |
+————–+
1 row in set (0.01 sec)

MariaDB [(none)]>

现象:LVS健康检查检测节点失效,自动剔除db1,所有请求自动调度至db2,业务读写正常。

9.3 故障节点恢复自愈

# 重启故障节点服务
[root@db2 ~ 23:37:56]# systemctl start mariadb
[root@ha1 ~ 23:34:32]# systemctl start keepalived
[root@ha1 ~ 23:41:56]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.13/24 10.1.8.100/24

现象:节点恢复后,LVS自动重新纳入集群,重新参与负载均衡调度,集群自愈完成。

十、生产核心注意事项(避坑指南)

10.1 LVS配置硬性限制

Keepalived 的 real_server仅支持IP地址,不支持域名。因为LVS工作在四层传输层,无DNS解析能力,填写域名会直接报错启动失败,生产环境必须写死后端真实IP。

10.2 DR模式必配项

所有后端RS节点必须配置虚拟网卡绑定VIP、关闭ARP解析,否则会出现IP地址冲突、回包路由异常,导致数据库连接时通时断。

10.3 主主复制生产优化

测试环境无主键冲突问题,生产环境必须配置自增ID偏移,避免双主同时写入产生主键重复、数据写入失败。

10.4 健康检查优化

默认仅检测3306端口存活,无法判断数据库真实读写状态。生产建议自定义shell脚本,检测数据库查询、写入可用性,实现精准故障剔除。

10.5 权限与安全加固

测试环境全权限开放,生产需严格收紧数据库远程权限、禁用不必要账号、修改默认密码、开启防火墙端口白名单,规避安全风险。

十一、架构总结

Keepalived+LVS(DR)+MariaDB主主 是中小企业性价比极高的数据库高可用解决方案,彻底解决传统架构四大痛点:

1. 彻底消除单点故障:调度层主备漂移、数据库层双活冗余,全程自动容灾;

2. 性能大幅提升:四层LVS高并发转发、双主分担写入压力,突破单库性能瓶颈;

3. 数据安全可控:双向实时同步,规避数据延迟、丢失、断层问题;

4. 运维极简:统一VIP入口、无感扩容、自动故障转移,大幅降低运维成本。

整套架构稳定可靠、可直接落地生产,适合电商、金融、政务等核心业务数据库高可用场景部署。
启动失败,生产环境必须写死后端真实IP。

10.2 DR模式必配项

所有后端RS节点必须配置虚拟网卡绑定VIP、关闭ARP解析,否则会出现IP地址冲突、回包路由异常,导致数据库连接时通时断。

10.3 主主复制生产优化

测试环境无主键冲突问题,生产环境必须配置自增ID偏移,避免双主同时写入产生主键重复、数据写入失败。

10.4 健康检查优化

默认仅检测3306端口存活,无法判断数据库真实读写状态。生产建议自定义shell脚本,检测数据库查询、写入可用性,实现精准故障剔除。

10.5 权限与安全加固

测试环境全权限开放,生产需严格收紧数据库远程权限、禁用不必要账号、修改默认密码、开启防火墙端口白名单,规避安全风险。

十一、架构总结

Keepalived+LVS(DR)+MariaDB主主 是中小企业性价比极高的数据库高可用解决方案,彻底解决传统架构四大痛点:

1. 彻底消除单点故障:调度层主备漂移、数据库层双活冗余,全程自动容灾;

2. 性能大幅提升:四层LVS高并发转发、双主分担写入压力,突破单库性能瓶颈;

3. 数据安全可控:双向实时同步,规避数据延迟、丢失、断层问题;

4. 运维极简:统一VIP入口、无感扩容、自动故障转移,大幅降低运维成本。

整套架构稳定可靠、可直接落地生产,适合电商、金融、政务等核心业务数据库高可用场景部署。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 彻底解决数据库单点故障!Keepalived+LVS(DR)+MariaDB主主高可用架构实战
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!