负载均衡——LVS+Keepalived群集部署

文章目录


前言

上一章节介绍了LVS的部署,本文主要介绍keepalived和部署keepalived在LVS上的内容。

本文围绕 LVS+Keepalived 高可用负载均衡集群展开,先解析核心概念与 VRRP 原理,再阐述脑裂问题解决方案,最后提供从环境配置到测试验证的完整部署实操指南。


一、keepalived概念和原理

1、keepalived介绍

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

2、vrrp工作原理

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

3、keepalived主要模块

core : 核心进程、配置文件加载解析

vrrp : VRRP 协议实现,高可用

check : 健康检查,支持 TCP/HTTP/脚本检查

二、脑裂问题和解决方案

1、什么是脑裂

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

结果:

1、共享资源冲突

2、数据损坏(如数据库)

2、原因

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

解决策略

1、双心跳线冗余

添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。

2、磁盘锁(锁定共享资源)

正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。

3、仲裁机制(Ping 参考 IP)

例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

4、脚本监控报警

三、LVS+keepalived部署

1、环境准备

主 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

2、通用操作(所有节点)

2.1、关闭防火墙和selinux

bash 复制代码
# 关闭防火墙和增强服务
systemctl stop firewalld
setenforce 0
# 永久关闭SELinux(需重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2.2、安装依赖包

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

bash 复制代码
# 下载安装keepalived
yum -y install ipvsadm keepalived
# 加载lvs模块
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块

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

bash 复制代码
yum install -y httpd && systemctl enable httpd

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

3、配置节点(DR)-keepalived

3.1、配置主节点-keepalived

vim /etc/keepalived/keepalived.conf

bash 复制代码
! 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
    }
}

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
      }
    }
}

3.2、配置备用节点-keepalived

vim /etc/keepalived/keepalived.conf

bash 复制代码
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
		}
	}
}

3.3、主备节点参数优化

bash 复制代码
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

4、节点配置

4.1、配置 VIP 到 lo 接口

bash 复制代码
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

4.2、ARP 参数调整,避免MAC冲突

bash 复制代码
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

5、启动服务

测试页面写入内容

bash 复制代码
# 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

启动服务

bash 复制代码
systemctl restart httpd # rs节点
systemctl restart nginx # rs节点
systemctl restart keepalived # 主备节点

6、测试

主节点启动keepalived正常显示如下:

备节点启动keepalived正常显示如下:

7、小结

1、VIP

DR 节点配置 VIP 网卡 ens33:0,Web 节点配置 lo:0

2、抢占模式

MASTER 恢复会抢回 VIP,非抢占模式需配置 nopreempt

3、健康检查

Keepalived 支持 TCP/HTTP 检查,可防止故障节点被调度

4、防火墙

Firewalld 需关闭,确保 VRRP 心跳消息畅通

5、脑裂防护

双心跳线、磁盘锁、仲裁 IP、脚本监控


总结

本文通过标准化部署流程与参数优化,实现了 LVS+Keepalived 集群的负载均衡与故障自动切换,规避脑裂风险,为业务高可用提供可靠实操方案。

相关推荐
love530love1 小时前
【笔记】解决 Stable Diffusion WebUI 启动 “找不到llama_cpp模块”
运维·windows·笔记·python·stable diffusion·github·llama
豆浆whisky1 小时前
构建可观测的Go应用:指标、日志与追踪的统一之道|Go语言进阶(21)
linux·运维·后端·golang
TeleostNaCl1 小时前
Docker | 如何限制容器的 CPU/内存/磁盘IO 的资源利用以降低性能消耗
运维·经验分享·嵌入式硬件·docker·容器·智能路由器
热爱编程的小白白9 小时前
【Playwright自动化】录制生成脚本
运维·自动化
java_logo9 小时前
MySQL Server Docker 容器化部署指南
linux·运维·数据库·docker·容器
I***t7169 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
BJ_Bonree9 小时前
数智先锋 | 核心应用响应时常<1s、多终端崩溃率低至 0.1%!Bonree ONE 赋能蓝月亮应用性能与终端体验双重升级!
运维
张鱼小丸子10 小时前
电脑刷机教程:轻松重装系统指南
运维
k***19510 小时前
Nginx反向代理出现502 Bad Gateway问题的解决方案
运维·nginx·gateway