【网络架构】Keepalived + LVS(DR) + MariaDB 双主备实践

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 ha2
  • state BACKUP
  • priority 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 检查双向同步状态是否恢复正常。
相关推荐
seeInfinite6 小时前
MOE架构
架构
大鹏说大话7 小时前
SSL证书自动化的未来:ACME协议与Let’s Encrypt实践
网络·安全
哑巴湖小水怪8 小时前
Android的架构是四层还是五层
android·架构
被摘下的星星8 小时前
网际协议(IP协议)
网络·tcp/ip
小白学大数据8 小时前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
sghuter8 小时前
数字资源分发架构解密
后端·架构·dubbo
NineData8 小时前
NineData将亮相DACon 2026上海站!解锁AGI时代数据“智理”新范式
数据库·后端·架构
爱学习的小囧9 小时前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化