0823Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程

作者:Void 出逃日期:2026/8/28

文章目录

  • Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程
    • 一、业务背景与架构选型
      • 数据库业务四大刚性需求
        • 传统架构痛点
        • 本套方案组件分工
        • 项目预期收益
    • 二、MariaDB主从/主主复制原理
      • 核心日志与线程
        • 完整同步流程
    • 三、实验环境规划
    • 四、基础环境初始化(所有机器)
      • 1. 修改主机名、网卡IP
        • 2. router路由器开启IP转发
    • 五、部署MariaDB,配置主主双向复制
      • db1配置
        • db2配置
        • 第一步:db2作为从库,同步db1(db1→db2)
        • 第二步:db1作为从库,同步db2(db2→db1,完成双向主主)
    • 六、数据库后端RS配置LVS‑DR环境(db1、db2两台都操作)
    • 七、Keepalived+LVS配置调度器ha1、ha2
      • ha1(主调度器,priority 110)
        • ha2(备调度器,priority 100)
    • 八、业务测试验证
      • 1. 在数据库创建远程测试账号(db1执行即可,主主会同步到db2)
        • 2. client客户端安装mysql客户端工具访问VIP
        • 故障模拟测试(核心高可用验证)
    • 九、常见踩坑排错清单

Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程

整套架构:四层负载均衡LVS‑DR + Keepalived实现调度器主备高可用 + MariaDB双主互备复制,实现数据库无间断对外服务,企业常用数据库高可用方案。 整体流程:客户端连接VIP访问数据库 → Keepalived+LVS做四层调度,分发请求到两台MariaDB;数据库双向主主复制保证两边数据一致;任意一台调度器/数据库故障自动切换,业务无感知。

一、业务背景与架构选型

数据库业务四大刚性需求

  1. 高可用(24×7不间断):硬件宕机、进程崩溃不能导致业务中断,故障自动转移。
  2. 高并发承载:读写量大,单台数据库CPU/IO容易瓶颈。
  3. 数据可靠性:故障不丢失数据,多节点之间数据同步一致。
  4. 可扩展:增加数据库节点不用修改业务代码。

传统架构痛点

架构问题
单节点数据库单点故障,宕机业务全部中断,恢复慢,有丢数据风险
简单一主一从写操作全部压在主库;故障切换需要人工操作,容易出错
业务层硬编码地址没有故障检测,后端宕机业务还会继续访问故障节点;新增节点需要改代码重启服务

本套方案组件分工

组件作用
MariaDB主主复制两台数据库互为主从,双向binlog同步;两台库都可以读写,一台故障另一台拥有完整数据
LVS‑DR四层负载均衡转发数据库3306端口请求;响应报文数据库直接返回客户端,不经过调度器,性能极高;自带后端节点健康检测,故障节点自动剔除
Keepalived1. 给LVS做主备高可用,VIP故障漂移,消除调度器单点;2. 直接写配置生成ipvs规则,不用敲命令;3. TCP健康检查后端数据库3306端口,数据库挂掉自动摘除节点

项目预期收益

  • 可用性提升,故障自动切换无需人工干预;
  • 写能力双库分担,读能力可以继续追加从库横向扩展;
  • 业务只需要连接一个VIP地址,后端数据库变更业务代码零修改。

二、MariaDB主从/主主复制原理

主主复制本质就是两台数据库互做对方的主从复制,A同步B,B同步A,实现双向数据同步。

核心日志与线程

  1. binlog二进制日志(主库):记录所有增删改DDL/DML语句,是复制的数据源。
  2. relay log中继日志(从库):从库拉取到binlog先存成本地中继日志,再执行。
  3. binlog dump线程(主库):把binlog事件发送给从库IO线程。
  4. IO线程(从库):连接主库,拉取binlog,写入relay‑log。
  5. SQL线程(从库):读取relay‑log,在本机回放SQL实现数据同步。

完整同步流程

  1. 主库执行写操作,事务提交,写入binlog日志。
  2. 从库IO线程连接主库,指定binlog文件名和position位置请求日志。
  3. 主库dump线程读取binlog,把事件传给从库IO线程。
  4. IO线程收到数据写入本机relay‑log,记录同步位点。
  5. SQL线程读取relay‑log,回放SQL语句,完成数据同步。

主主复制:db1→db2做一遍主从;db2→db1再反向做一遍主从,双向同步。

三、实验环境规划

主机名IP地址网关角色VIP
client2.meng.cloud10.1.1.2110.1.1.20外部测试客户端
client1.meng.cloud10.1.8.2110.1.8.20内网测试客户端
router.meng.cloud10.1.8.20 / 10.1.1.2010.1.8.2路由器
ha1.meng.cloud10.1.8.1310.1.8.20LVS+Keepalived主调度器10.1.8.100
ha2.meng.cloud10.1.8.1410.1.8.20LVS+Keepalived备调度器10.1.8.100
db1.meng.cloud10.1.8.1110.1.8.20MariaDB数据库110.1.8.100(dummy网卡)
db2.meng.cloud10.1.8.1210.1.8.20MariaDB数据库210.1.8.100(dummy网卡)

VIP统一:10.1.8.100,业务客户端只连接这个IP访问数据库3306端口。

四、基础环境初始化(所有机器)

1. 修改主机名、网卡IP

1#### client2
2hostnamectl set-hostname client2.meng.cloud
3nmcli 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
4nmcli connection up ens33
5
6#### client1
7hostnamectl set-hostname client1.meng.cloud
8nmcli 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
9nmcli connection up ens33
10
11#### router路由器
12hostnamectl set-hostname router.meng.cloud
13nmcli 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
14nmcli connection up ens33
15nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.20/24 autoconnect yes
16nmcli connection up ens36
17
18#### ha1调度器
19hostnamectl set-hostname ha1.meng.cloud
20nmcli 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
21nmcli connection up ens33
22
23#### ha2调度器
24hostnamectl set-hostname ha2.meng.cloud
25nmcli 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
26nmcli connection up ens33
27
28#### db1数据库
29hostnamectl set-hostname db1.meng.cloud
30nmcli 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
31nmcli connection up ens33
32
33#### db2数据库
34hostnamectl set-hostname db2.meng.cloud
35nmcli 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
36nmcli connection up ens33
37

2. router路由器开启IP转发

1echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
2sysctl -p
3systemctl enable --now firewalld
4firewall-cmd --set-default-zone=trusted
5firewall-cmd --add-masquerade --permanent
6firewall-cmd --add-masquerade
7

五、部署MariaDB,配置主主双向复制

db1配置

  1. 安装服务,开启binlog、relay‑log
1yum install -y mariadb-server
2vim /etc/my.cnf.d/server.cnf
3

写入mysqld段落:

1[mysqld]
2server-id=1
3log_bin=mysql-bin
4relay_log=mysql-relay-bin
5

启动服务:

1systemctl enable --now mariadb
2
  1. 安全初始化(设置root密码huawei,移除匿名用户等)
1mysql_secure_installation
2

交互步骤:回车(旧密码为空) → Y设置密码,输入huawei,确认;后面全部回车确认。

  1. 创建复制账号,授权给db2
1mysql -uroot -phuawei
2grant replication slave, replication client on *.* to 'repl'@'10.1.8.12' identified by 'huawei';
3flush privileges;
4show master status\G;
5

记录输出:File、Position,这里示例:mysql‑bin.000003Position:327

db2配置

  1. 安装,配置my.cnf,server‑id必须不一样!db2写2
1yum install -y mariadb-server
2vim /etc/my.cnf.d/server.cnf
3[mysqld]
4server-id=2
5log_bin=mysql-bin
6relay_log=mysql-relay-bin
7systemctl enable --now mariadb
8mysql_secure_installation
9
  1. 创建复制账号授权给db1
1mysql -uroot -phuawei
2grant replication slave, replication client on *.* to 'repl'@'10.1.8.11' identified by 'huawei';
3flush privileges;
4show master status\G;
5

记录File、Position示例:mysql‑bin.000002Position:1769

第一步:db2作为从库,同步db1(db1→db2)

db2数据库执行mysql命令,替换成刚刚show master status拿到的文件名和position

1change master to
2master_host='10.1.8.11',
3master_user='repl',
4master_password='huawei',
5master_port=3306,
6master_log_file='mysql-bin.000003',
7master_log_pos=327,
8master_connect_retry=30;
9
10start slave;
11show slave status\G;
12

✅必须看到:Slave_IO_Running: YesSlave_SQL_Running: Yes才算正常。

测试:db1建库建表插入数据,db2查询,确认数据同步过来。

第二步:db1作为从库,同步db2(db2→db1,完成双向主主)

db1数据库执行,替换db2的binlog文件名和position

1change master to
2master_host='10.1.8.12',
3master_user='repl',
4master_password='huawei',
5master_port=3306,
6master_log_file='mysql-bin.000002',
7master_log_pos=1769,
8master_connect_retry=30;
9
10start slave;
11show slave status\G;
12

✅db1这边也必须IO、SQL线程全部Yes;双向复制完成,两边写数据都可以互相同步。

⚠️主主复制注意:业务层要做好主键冲突规避,否则双向同时插入相同主键会报错。

六、数据库后端RS配置LVS‑DR环境(db1、db2两台都操作)

DR模式关键点:后端数据库也要绑定VIP/32掩码;ARP抑制,不对外响应VIP的ARP请求,防止ARP漂移

1# 创建dummy虚拟网卡,绑定VIP,掩码32位!!
2nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
3nmcli connection up dummy
4
5# 配置arp抑制内核参数
6cat >> /etc/sysctl.conf << EOF
7net.ipv4.conf.all.arp_ignore = 1
8net.ipv4.conf.all.arp_announce = 2
9net.ipv4.conf.dummy.arp_ignore = 1
10net.ipv4.conf.dummy.arp_announce = 2
11EOF
12sysctl -p
13

参数解释: arp_ignore=1:只接收本机真实网卡IP的ARP请求,dummy上的VIP不回复ARP; arp_announce=2:发送ARP广播不用VIP做源IP,避免把VIP‑MAC广播出去造成冲突。

七、Keepalived+LVS配置调度器ha1、ha2

Keepalived的virtual_server段直接生成ipvs规则;TCP_CHECK每隔一段时间探测3306端口,数据库端口不通自动把该RS剔除负载均衡集群。

ha1(主调度器,priority 110)

安装软件

1yum install -y keepalived ipvsadm
2cp /etc/keepalived/keepalived.conf{,.bak}
3vim /etc/keepalived/keepalived.conf
4

完整配置文件

1! Configuration File for keepalived
2global_defs {
3router_id ha1
4}
5
6vrrp_instance db {
7state MASTER
8interface ens33
9virtual_router_id 51
10priority 110
11advert_int 1
12authentication {
13auth_type PASS
14auth_pass meng@123
15}
16virtual_ipaddress {
1710.1.8.100/24
18}
19}
20
21virtual_server 10.1.8.100 3306 {
22delay_loop 6
23lb_algo rr
24lb_kind DR
25persistence_timeout 50
26protocol TCP
27
28real_server 10.1.8.11 3306 {
29weight 1
30TCP_CHECK {
31connect_timeout 3
32retry 3
33delay_before_retry 3
34}
35}
36
37real_server 10.1.8.12 3306 {
38weight 1
39TCP_CHECK {
40connect_timeout 3
41retry 3
42delay_before_retry 3
43}
44}
45}
46

启动服务

1systemctl enable --now keepalived
2ipvsadm -Ln
3ip addr
4

ha2(备调度器,priority 100)

1yum install -y keepalived ipvsadm
2cp /etc/keepalived/keepalived.conf{,.bak}
3vim /etc/keepalived/keepalived.conf
4! Configuration File for keepalived
5global_defs {
6router_id ha2
7}
8
9vrrp_instance db {
10state BACKUP
11interface ens33
12virtual_router_id 51
13priority 100
14advert_int 1
15authentication {
16auth_type PASS
17auth_pass meng@123
18}
19virtual_ipaddress {
2010.1.8.100/24
21}
22}
23
24virtual_server 10.1.8.100 3306 {
25delay_loop 6
26lb_algo rr
27lb_kind DR
28persistence_timeout 50
29protocol TCP
30
31real_server 10.1.8.11 3306 {
32weight 1
33TCP_CHECK {
34connect_timeout 3
35retry 3
36delay_before_retry 3
37}
38}
39
40real_server 10.1.8.12 3306 {
41weight 1
42TCP_CHECK {
43connect_timeout 3
44retry 3
45delay_before_retry 3
46}
47}
48}
49systemctl enable --now keepalived
50

参数说明 virtual_server:

  • delay_loop 6:每6秒执行一次后端TCP健康检查;
  • lb_algo rr:轮询调度算法;
  • lb_kind DR:LVS DR模式;
  • persistence_timeout 50:会话保持50秒,同一个客户端50秒内分配到同一台后端;
  • TCP_CHECK:探测3306端口,端口访问失败,自动从ipvs集群移除该real_server。

重要提醒:real_server后面只能写IP,不支持域名,LVS四层工作,不做域名解析,填域名直接启动报错。

八、业务测试验证

1. 在数据库创建远程测试账号(db1执行即可,主主会同步到db2)

1mysql -uroot -phuawei
2grant ALL PRIVILEGES on *.* to 'meng'@'%' identified by 'huawei';
3flush privileges;
4

2. client客户端安装mysql客户端工具访问VIP

1yum install -y mysql
2# 访问VIP,不需要写db1/db2真实IP
3mysql -umeng -phuawei -h 10.1.8.100
4

故障模拟测试(核心高可用验证)

  1. 调度器故障测试:ha1执行systemctl stop keepalived,观察VIP漂移到ha2,客户端依然可以正常连接数据库。恢复ha1 keepalived,VIP切回ha1。
  2. 数据库节点故障测试:db1执行systemctl stop mariadb;keepalived检测3306端口不通,自动将db1剔除集群;客户端访问VIP只会调度到db2,业务不中断;启动db1数据库,自动重新加入集群。
  3. 双向复制验证:db1新建库表插入数据,db2查询看是否同步;db2插入数据,db1查询看是否同步。

九、常见踩坑排错清单

  1. LVS‑DR访问不通
    • db1/db2是否配置dummy网卡VIP掩码/32
    • arp_ignore / arp_announce内核参数是否生效;
    • 所有机器必须在同一个二层广播域,DR模式依靠MAC转发,跨VLAN不行。
  2. MariaDB主主不同步
    • server‑id两台数据库不能相同
    • repl复制账号授权IP是否正确,密码一致;
    • show slave status\G看IO/SQL线程状态,Last_IO_Error、Last_SQL_Error查看报错。
  3. Keepalived脑裂(两台调度器同时拿到VIP)
    • 防火墙放行VRRP协议:firewall‑cmd --add‑protocol=vrrp --permanent
    • vrrp实例virtual_router_id两台必须一致,auth_pass密码两台必须一模一样;
    • 多网卡机器使用mcast_src_ip指定心跳报文发出网卡IP。
  4. keepalived启动失败
    • virtual_server、real_server语法不能写错,大括号配对,不能使用域名写后端地址。
  5. 主主复制业务坑:应用层尽量规避两台库同时生成自增主键,否则主键冲突复制报错;生产建议配合中间件(ProxySQL)做读写分离。

制账号授权IP是否正确,密码一致;

  • show slave status\G看IO/SQL线程状态,Last_IO_Error、Last_SQL_Error查看报错。
  1. Keepalived脑裂(两台调度器同时拿到VIP)
    • 防火墙放行VRRP协议:firewall‑cmd --add‑protocol=vrrp --permanent
    • vrrp实例virtual_router_id两台必须一致,auth_pass密码两台必须一模一样;
    • 多网卡机器使用mcast_src_ip指定心跳报文发出网卡IP。
  2. keepalived启动失败
    • virtual_server、real_server语法不能写错,大括号配对,不能使用域名写后端地址。
  3. 主主复制业务坑:应用层尽量规避两台库同时生成自增主键,否则主键冲突复制报错;生产建议配合中间件(ProxySQL)做读写分离。

0823Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程》 是转载文章,点击查看原文


相关推荐


【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 7 篇】
jufeng13072026/8/20

第 4 篇我们搭好了写入管线,背压、攒批、并发 worker 都就位了。可管线再高效,也得有数据往里喂。今天回到源头:数据从哪来?两条路——模拟器直接造,采集器从三源收,最终都汇入同一条 pipeline。这篇就讲四件事:物理模型、确定性 seed、归一化漏斗、坏数据去向。读完你能回答:模拟器的物理模型为什么这么设计?三源各适合什么场景?坏数据去哪了? 两条路径,一个入口 先看全局。整个系统的数据入口分成两条路,但最终汇聚到同一个 WritePipeline——就是第 4 篇讲背压、攒批、并发


uni-app 生命周期深度解析(iOS / Android / 鸿蒙 / Vue3 四端对照)
90后晨仔2026/8/7

📌 本文定位: 面向同时具备 iOS、Android、鸿蒙原生开发经验,正在转向 uni-app 的资深工程师。所有技术点均基于 uni-app 官方文档 及 Vue3 官方文档整理。 一、先搞懂一个 JS 语法问题:为什么说"与 data/methods 平级的叫生命周期"? 很多原生工程师初学 uni-app 时会对这句话感到困惑。我们从 JavaScript 语言层面彻底讲清楚。 1.1 Options API 的本质是一个"配置对象" 在 Vue2/Vue3 的 Options A


GPT 5.6 的真正变革:从"最强模型"到"最合适模型",AI 工程范式正在重置
浮生望2026/7/29

摘要: GPT 5.6以Sol、Terra、Luna三层架构重新定义AI使用方式。跑分不再决定竞争力,真正的差距在于把什么任务分给什么模型,用更少Token和更少返工完成更高质量交付。AI正从顾问变成协作者。 每次新模型发布,人们都在问同一个问题,但那个问题已经过时了 GPT 5.6 发布后,讨论一如既往地集中在几个老问题上:跑分涨了多少?代码能力有没有超过 Claude?谁又成了"最强模型"? 这些问题很重要,但如果你只盯着它们,就错过了 GPT 5.6 真正改变游戏规则的地方。 Open


影像创作领域的GitHub!深度体验了这个国产AI,我卸了3个AI视频工具!
程序员X小鹿2026/7/21

大家好,我是X小鹿,今天分享一个不一样的 AI 视频工具。 以前做一条 AI 短片,从剧本创作、脚本编写、到角色定妆、场景道具生成、再到分镜生成、视频生成,以及最后的剪辑成片,每一步都需要用到单独的工具。 生成一条短片,需要在多个工具间来回切换。 后来也陆续出现了一些 AI 视频工具,把上面的很多流程都集成在了一个平台上,用起来确实比之前方便了不少。 最近用了 AI 视频创作平台 updream ,发现它虽然也是将很多功能集成在了一起,但和之前接触的一些 AI 视频工具又不太一样。 体验下来,


图像的分辨率
元來2026/7/12

一、什么是分辨率 图像分辨率表示: 图像能够表示多少空间细节,或者图像在水平和垂直方向上包含多少个像素。 日常最常见的分辨率写法是: 宽度 × 高度 例如: 1920 × 1080 4096 × 4096 6144 × 6144 其中: 1920表示图像水平方向有1920个像素;1080表示图像垂直方向有1080个像素。 因此一张1920 × 1080的图像,像素总数为:1920×1080=2,073,600 即大约207万个像素,也可以称为约200万像素图像。 二、


OpenCV-Python实战(31)——实时面部情绪检测与识别系统
盼小辉丶2026/7/4

OpenCV-Python实战(31)——实时面部情绪检测与识别系统 0. 前言1. 规划应用程序1. 人脸检测1.1 基于 Haar 的级联分类器1.2 预训练的级联分类器1.3 使用预训练的级联分类器1.4 FaceDetector 类 2. 收集数据2.1 构建训练数据集2.2 运行应用程序2.3 实现数据收集器 GUI 3. 面部情绪识别3.1 处理数据集3.2 多层感知机3.3 构建 MLP用于面部表情识别 4. 整合所有内容小结系列链接 0. 前言 我


2026年6月远程控制软件横评:UU远程、ToDesk、向日葵全方位对比
凤年徐2026/6/26

2026远程控制软件横评:UU远程、ToDesk、向日葵全方位对比 远程控制早已不是“应急连一下电脑”那么简单了。开发者用它连服务器改代码,设计师用它调家里的渲染机,留学生用它操作国内的网盘和银行App,甚至游戏玩家也用它“云挂机”。市面上主流的三款工具——UU远程、ToDesk、向日葵——各有拥趸,但到底谁在哪个场景下更顺手?这篇横评不吹不黑,直接把你最关心的七个核心能力摆在一起,逐项对比。 一、终端能力:谁能让开发者真正扔掉SSH客户端? 对于开发者、运维和AI训练者来说,远程命令行是最


JavaScript 函数性能优化:配置驱动 + 按需计算实战指南
m0_733915432026/6/17

JavaScript 函数优化是前端性能调优的核心环节。当业务逻辑中存在多层条件分支与重复计算时,代码不仅执行效率低下,还难以维护和扩展。本文将基于真实业务场景,提供一套配置驱动的优化方案,通过规则表集中管理 + 按需计算策略,帮助你提升函数执行效率 80% 以上。 为什么传统条件分支会拖累性能? 理解问题根源是有效优化的前提。传统 if-else 嵌套方案存在三大性能瓶颈: 问题类型 具体表现 性能影响 重复计算


PySide6 + Qt Designer + PyCharm 完整开发流程
资深流水灯工程师2026/6/10

PyCharm 对 Python 桌面开发有更完善的支持,包括智能代码补全、断点调试、集成终端、版本控制等功能,结合 Qt Designer 的可视化 UI 设计,是工业级上位机开发的首选组合。以下是完全适配 PyCharm 的标准化开发流程。 一、环境准备与 PyCharm 配置 1. 创建项目并配置虚拟环境(必做) PyCharm 强烈推荐使用虚拟环境隔离项目依赖,避免版本冲突: 打开 PyCharm → 新建项目 (New Project)选择项目位置,命名为test_equipm


claude-code下载安装与使用
veminhe2026/6/2

1、官方网站 Claude Code by Anthropic | AI Coding Agent, Terminal, IDE 2、github的项目地址 GitHub - anthropics/claude-code: Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing ro

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读