LVS+keepalived

前言

在当今高度数字化的时代,互联网服务的连续性、稳定性和高性能已成为企业生存与发展的生命线。无论是电子商务、金融支付、在线社交还是云计算服务,用户对访问速度和服务可用性的要求都达到了前所未有的高度。任何短暂的服务中断或性能瓶颈,都可能导致巨大的经济损失和不可逆的品牌信誉损害。

在这种背景下,传统的单服务器架构显得力不从心。它存在两个致命的弱点:

  1. 单点故障:一旦服务器硬件、网络或应用本身出现故障,整个服务将彻底瘫痪。
  2. 性能瓶颈:随着用户量和并发请求的激增,单台服务器的性能上限很快会被触及,无法进行水平扩展。

为了解决这些问题,集群技术应运而生。其核心思想是通过将多台服务器组合起来,形成一个统一的、虚拟的服务实体,共同对外提供服务。在这一领域,负载均衡高可用性 是两个最为关键的技术支柱。

  • 负载均衡:将涌入的海量用户请求,合理地分发到后端多台真实服务器上,从而充分利用集群中每台服务器的处理能力,消除单点性能瓶颈,实现规模的横向扩展。
  • 高可用性:通过冗余和故障自动转移机制,确保当集群中的某个组件(如服务器、网络、服务进程)发生故障时,能够立即由备用组件接管工作,从而保证整个服务对外部用户而言几乎是"永不中断"的。

LVS 正是负载均衡领域的杰出代表。作为国内顶尖的开源项目,它工作在 Linux 内核层面,基于 IP 层和内容请求分发,提供了极高的吞吐量和连接处理能力,能够轻松应对数百万的并发连接,是构建大型网站基础架构的"定海神针"。

然而,LVS 调度器本身也可能成为新的单点。如果负载均衡调度器宕机,即使后端有成千上万台服务器,整个服务依然无法被访问。

此时,Keepalived 登场了。它是一个基于 VRRP 协议实现的高可用解决方案。Keepalived 可以为 LVS 调度器提供"热备份"。它通过竞选机制确定主备节点,主节点会虚拟出一个 VIP 对外提供服务。当主节点发生故障时,备节点会在极短时间内接管 VIP,从而接管所有流量,实现了 LVS 调度器自身的高可用。

LVS 与 Keepalived 的珠联璧合,构成了一个既具备超高负载处理能力,又拥有极强故障自愈能力的完整解决方案。 LVS 负责"冲锋陷阵",高效地分发流量;Keepalived 则作为"忠诚的卫士",在幕后保障着 LVS 调度器本身的安危。

本文将深入浅出地解析 LVS 的工作原理、三种工作模式,以及如何与 Keepalived 无缝集成,一步步指导您从零开始,构建一个坚实、可靠、高性能的现代互联网服务集群基础设施。让我们一同开启这段探索高可用与负载均衡核心技术的旅程。

keepalived

概念

  1. 基于 VRRP 协议实现高可用(HA)
  2. 初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)
  3. 具体实现功能:
    1.LVS集群管理
    2.节点健康检查
    3.故障自动切换
    4.高可用vip接管

原理

  1. MASTER 节点发送心跳(通告)给 BACKUP 节点。
  2. BACKUP 节点收不到心跳时,接管 VIP。
  3. MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
  4. 默认多播地址:224.0.0.18
  5. 优先级决定 MASTER 节点(数值越大优先)

keepalived主要模块

  1. core : 核心进程、配置文件加载解析
  2. vrrp : VRRP 协议实现,高可用
  3. check : 健康检查,支持 TCP/HTTP/脚本检查

脑裂

什么是脑裂

两个节点失去心跳连接,均认为对方挂掉

结果:

  1. 共享资源冲突

  2. 数据损坏(如数据库

脑裂的原因

  1. 心跳线故障(断线、老化)
  2. 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。
  3. 网卡/驱动故障
  4. 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
  5. 心跳网络设备故障
  6. 因心跳线间连接的设备故障(网卡及交换机)。
  7. 仲裁机器异常
  8. 因仲裁的机器出问题
  9. 防火墙阻挡 VRRP
  10. 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
  11. 配置不一致(virtual_router_id、优先级、实例名)
  12. Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
  13. vrrp实例名字不一致、优先级一致。

解决方案

  1. 双心跳线冗余添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。
  2. 磁盘锁(锁定共享资源)正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
  3. 仲裁机制(Ping 参考 IP)例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
  4. 脚本监控报警

LVS+keepalived部署

环境

主 DR:192.168.10.103(MASTER)

备 DR:192.168.10.104(BACKUP)

VIP:192.168.10.180

Web 节点:

192.168.10.101

192.168.10.102

客户端:192.168.10.2

操作

1.关闭防火墙和selinux 代码:

关闭防火墙和增强服务

systemctl stop firewalld

setenforce 0

永久关闭SELinux(需重启)

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

安装依赖包:

主 / 备 LVS 节点:安装 keepalived、ipvsadm和加载ip_vs

代码:

下载安装keepalived

yum -y install ipvsadm keepalived

加载lvs模块

modprobe ip_vs

cat /proc/net/ip_vs # 检查模块

后端 RealServer:安装 httpd或nginx(用于测试负载均衡)

yum install -y httpd && systemctl enable httpd

如果需要使用nginx可以看之前的nginx编译安装流程。当然也可以yum install -y nginx(不推荐,更新、模块、安装路径无法控制)

配置节点(DR)-keepalived

配置主节点-keepalived

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_01

vrrp_skip_check_adv_addr

#vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 10

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass abc123

}

virtual_ipaddress {

192.168.10.180/32

}

}

配置备用节点-keepalived

#virtual_server 192.168.10.180 80 {

delay_loop 6

lb_algo rr

lb_kind DR

persistence_timeout 50

protocol TCP

real_server 192.168.10.101 80 {

weight 1 # 服务器的权重

对后端服务器的TCP 层健康检查.(检测 80 端口是否存活)

TCP_CHECK {

connect_port 80 # 检查的端口(后端 HTTP 服务端口)

connect_timeout 3 # 连接超时时间(3 秒)

nb_get_retry 3 # 连接失败时的重试次数(3 次)

delay_before_retry 3 # 重试间隔(3 秒)

}

}

real_server 192.168.10.102 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

配置备用节点-keepalived

vim /etc/keepalived/keepalived.conf

global_defs {

router_id LVS_02 # MASTER 为 LVS_01,BACKUP 为 LVS_02

smtp_server 127.0.0.1

}

vrrp_instance VI_1 {

state BACKUP # BACKUP 节点写 BACKUP

interface ens33

virtual_router_id 10

priority 90 # MASTER 高于 BACKUP

advert_int 1

authentication {

auth_type PASS

auth_pass abc123

}

virtual_ipaddress {

192.168.10.180/32

}

}

virtual_server 192.168.10.180 80 {

delay_loop 6

lb_algo rr

lb_kind DR

persistence_timeout 50

protocol TCP

real_server 192.168.10.101 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

real_server 192.168.10.102 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

主备节点参数优化:

vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

普通节点

配置 VIP 到 lo 接口

配置 VIP 到 lo 接口

cd /etc/sysconfig/network-scripts/

cp ifcfg-lo ifcfg-lo:0

vim ifcfg-lo:0

内容

DEVICE=lo:0

ONBOOT=yes

IPADDR=192.168.10.180

NETMASK=255.255.255.255

ifup lo:0

ifconfig lo:0

route add -host 192.168.10.180 dev lo:0

ARP 参数调整,避免MAC冲突

vim /etc/sysctl.conf

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

sysctl -p

启动服务

测试页面写入内容代码:

192.168.10.101

echo 'this is 192.168.10.101 web01!' > /var/www/html/index.html

192.168.10.102

echo 'this is 192.168.10.102 web02!' > /var/www/html/index.html

启动服务

systemctl restart httpd # rs节点

systemctl restart nginx # rs节点

systemctl restart keepalived # 主备节点

测试


总结

通过本文档的详细讲解和实操部署,我们完成了LVS+Keepalived高可用集群的完整搭建。关键收获:

技术要点:

深入理解了VRRP协议的工作原理和选举机制

掌握了Keepalived的配置语法和参数调优

学会了LVS DR模式的部署和ARP问题解决

理解了脑裂问题的成因和预防措施

最佳实践:

生产环境建议使用多播检测+第三方仲裁来避免脑裂

定期进行故障切换演练,确保高可用机制有效

建立完善的监控告警体系,实时掌握集群状态

扩展思考:

可以结合Consul等服务发现工具实现动态后端服务管理

考虑使用BGP协议实现跨机房的高可用方案

探索与Kubernetes等容器平台的集成方案

这套解决方案为企业关键业务提供了可靠的高可用保障,是构建稳健基础设施的重要技术支撑。

相关推荐
LucidX1 小时前
LVS DR模式工作原理群集部署
lvs
2501_939909051 小时前
LVS+Keepalived群集
lvs
伞啊伞1 小时前
安装与配置 LVS + Keepalived
lvs
伞啊伞2 小时前
LVS-DR 模式负载均衡群集
智能路由器·负载均衡·lvs
不想画图2 小时前
负载均衡——LVS+Keepalived群集部署
运维·负载均衡·lvs
可爱又迷人的反派角色“yang”11 小时前
LVS+Keepalived群集
linux·运维·服务器·前端·nginx·lvs
Q鑫6 天前
LVS/Nginx/Haproxy+keepalived负载均衡集群工作原理
nginx·负载均衡·lvs
yifengyiyufjq8 天前
基于 CentOS 7 搭建 LVS 负载均衡(NAT 模式)搭建指南
centos·负载均衡·lvs
Aiden1212111 天前
LVS+Keepalived
lvs