负载均衡——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 集群的负载均衡与故障自动切换,规避脑裂风险,为业务高可用提供可靠实操方案。

相关推荐
怣506 分钟前
Linux创意命令组合:让终端变得有趣又高效
linux·运维·服务器
啟明起鸣12 分钟前
【Nginx 网关开发】上手 Nginx,简简单单启动一个静态 html 页面
运维·c语言·前端·nginx·html
Tinyundg24 分钟前
Linux系统分区
linux·运维·服务器
要做一个小太阳27 分钟前
华为Atlas 900 A3 SuperPoD 超节点网络架构
运维·服务器·网络·华为·架构
江畔何人初31 分钟前
service发现
linux·运维·云原生
life码农38 分钟前
Linux系统清空文件内容的几种方法
linux·运维·chrome
zbguolei43 分钟前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu
UP_Continue1 小时前
Linux--基础IO
linux·运维·服务器
驱动探索者1 小时前
linux hwspinlock 学习
linux·运维·学习
RisunJan1 小时前
Linux命令-logout(安全结束当前登录会话)
linux·运维·安全