LVS群集

LVS负载均衡群集详解:NAT与DR模式部署指南

一、LVS简介

LVS(Linux Virtual Server)是一个基于Linux内核的高性能、高可用性的负载均衡解决方案。它能够将多台服务器组成一个虚拟服务器,为客户端提供统一的服务入口,并通过多种调度算法将请求分发到后端真实服务器上。

二、ipvsadm工具选项说明

选项 说明
-A 添加虚拟服务器
-D 删除整个虚拟服务器
-s 指定负载调度算法(rr、wrr、lc、wlc)
-a 添加真实服务器(节点服务器)
-d 删除某一个节点
-t 指定VIP地址及TCP端口
-r 指定RIP地址及TCP端口
-m 使用NAT群集模式
-g 使用DR模式
-i 使用TUN模式
-w 设置权重(权重为0时表示暂停节点)
-p 60 保持长连接60秒
-l 列表查看LVS虚拟服务器
-n 以数字形式显示地址、端口等信息

三、NAT模式LVS负载均衡群集部署

环境准备

  • 负载调度器:内网关ens33:192.168.10.19,外网关ens37:10.0.0.1
  • Web节点服务器1:192.168.10.16
  • Web节点服务器2:192.168.10.17
  • NFS服务器:192.168.10.18
  • 客户端:10.0.0.12

1. 部署共享存储(NFS服务器)

bash 复制代码
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

yum install nfs-utils rpcbind -y
systemctl start rpcbind.service
systemctl start nfs.service

mkdir /opt/kgc /opt/benet
chmod 777 /opt/kgc /opt/benet
echo 'this is kgc web!' > /opt/kgc/index.html
echo 'this is benet web!' > /opt/benet/index.html

vim /etc/exports
/usr/share *(ro,sync)
/opt/kgc 192.168.10.0/24(rw,sync)
/opt/benet 192.168.10.0/24(rw,sync)

exportfs -rv

2. 配置节点服务器

bash 复制代码
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

yum install httpd -y
systemctl start httpd.service
systemctl enable httpd.service

yum install nfs-utils rpcbind -y
showmount -e 192.168.10.18

# 192.168.10.16节点
mount.nfs 192.168.10.18:/opt/kgc /var/www/html

# 192.168.10.17节点
mount.nfs 192.168.10.18:/opt/benet /var/www/html

3. 配置负载调度器

bash 复制代码
# 配置SNAT转发规则
echo '1' > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -j SNAT --to-source 10.0.0.1

# 加载LVS内核模块
modprobe ip_vs
cat /proc/net/ip_vs

# 安装ipvsadm
yum -y install ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service

# 配置负载分配策略
ipvsadm -C
ipvsadm -A -t 10.0.0.1:80 -s rr
ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.16:80 -m
ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.17:80 -m
ipvsadm

4. 测试效果

在客户端(10.0.0.12)使用浏览器访问http://10.0.0.1/,不断刷新浏览器测试负载均衡效果。

四、DR模式LVS负载均衡群集部署

环境准备

  • DR服务器:192.168.10.18
  • Web服务器1:192.168.10.16
  • Web服务器2:192.168.10.17
  • VIP:192.168.10.180
  • 客户端:192.168.10.200

1. 配置负载调度器

bash 复制代码
# 配置虚拟IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0  # 配置VIP:192.168.10.180
ifup ens33:0

# 调整proc响应参数
vim /etc/sysctl.conf  # 设置相关参数为0
sysctl -p

# 配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g

2. 配置节点服务器

bash 复制代码
# 配置虚拟IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0  # 配置VIP:192.168.10.180
ifup lo:0
route add -host 192.168.10.180 dev lo:0

# 调整内核的ARP响应参数
vim /etc/sysctl.conf  # 设置arp_ignore和arp_announce参数
sysctl -p

3. 测试LVS群集

在客户端使用浏览器访问http://192.168.10.180/

五、LVS工作模式对比

模式 优点 缺点
NAT模式 配置简单,支持任何TCP/IP系统 性能瓶颈,扩展性有限
DR模式 高性能,响应直接返回客户端 需要在同一局域网环境
TUN模式 高性能,可跨网络部署 需要服务器支持IP隧道

六、LVS调度算法

固定调度算法

  • rr:轮询算法
  • wrr:加权轮询调度
  • dh:目的地址哈希调度
  • sh:源地址哈希调度

动态调度算法

  • wlc:加权最小连接数调度
  • lc:最小连接数调度
  • lblc:基于地址的最小连接数调度

七、总结

LVS是一个强大且灵活的负载均衡解决方案,支持多种工作模式和调度算法,能够满足不同场景下的负载均衡需求。NAT模式适合简单环境,DR模式适合高性能要求的场景,TUN模式则适用于跨网络环境的部署。在实际应用中,需要根据具体需求选择合适的工作模式和调度算法。


LVS-DR模式负载均衡群集详解:原理、部署与优化

一、DR模式工作原理

数据包流向分析

  1. 客户端请求阶段:客户端发送请求到Director Server(负载均衡器),请求数据报文的源IP是CIP,目标IP是VIP
  2. 负载均衡处理:Director Server和Real Server在同一个网络中,数据通过二层数据链路层传输
  3. 报文重封装 :内核空间判断数据包目标IP是本机VIP,IPVS比对请求服务是否为集群服务,是则重新封装数据包:
    • 修改源MAC地址为Director Server的MAC地址
    • 修改目标MAC地址为Real Server的MAC地址
    • 源IP地址与目标IP地址保持不变
  4. Real Server处理:Real Server接收报文后,重新封装响应报文(源IP为VIP,目标IP为CIP),通过lo接口传送给物理网卡发出
  5. 响应直接返回:Real Server直接将响应报文传送到客户端,不经过Director Server

DR模式特点

  • 网络要求:Director Server和Real Server必须在同一物理网络中
  • 地址灵活性:Real Server可以使用私有地址或公网地址
  • 入口角色:Director Server作为群集访问入口,但不作为网关使用
  • 流量分离:请求报文经过Director Server,响应报文直接返回客户端
  • 路由限制:Real Server的网关不能指向Director Server IP
  • 接口配置:Real Server的lo接口需要配置VIP地址

二、DR模式部署实战

环境规划

角色 IP地址 说明
DR服务器 192.168.10.23 负载调度器
Web服务器1 192.168.10.16 节点服务器
Web服务器2 192.168.10.17 节点服务器
VIP 192.168.10.180 虚拟IP地址
客户端 192.168.10.200 测试客户端
NFS服务器 192.168.10.19 共享存储

1. 配置负载调度器(192.168.10.23)

bash 复制代码
# 基础环境配置
systemctl stop firewalld.service
setenforce 0
modprobe ip_vs
cat /proc/net/ip_vs
yum -y install ipvsadm

# 配置虚拟IP地址(VIP)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
ini 复制代码
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash 复制代码
ifup ens33:0
ifconfig ens33:0

# 调整proc响应参数
vim /etc/sysctl.conf
ini 复制代码
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
bash 复制代码
sysctl -p

# 配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm

ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g
ipvsadm

# 查看节点状态
ipvsadm -ln

2. 配置节点服务器(192.168.10.16、192.168.10.17)

bash 复制代码
# 基础环境配置
systemctl stop firewalld.service
setenforce 0

# 配置虚拟IP地址(VIP)
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
ini 复制代码
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash 复制代码
ifup lo:0
ifconfig lo:0

# 添加路由规则
route add -host 192.168.10.180 dev lo:0

# 设置开机自启动
vim /etc/rc.local
bash 复制代码
/sbin/route add -host 192.168.10.180 dev lo:0
bash 复制代码
chmod +x /etc/rc.d/rc.local

# 调整内核ARP响应参数
vim /etc/sysctl.conf
ini 复制代码
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
bash 复制代码
sysctl -p

# 安装必要服务
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start httpd

# 挂载共享存储(以192.168.10.16为例)
mount.nfs 192.168.10.19:/opt/kgc /var/www/html
echo 'this is kgc web!' > /var/www/html/index.html

# 192.168.10.17节点
mount.nfs 192.168.10.19:/opt/benet /var/www/html
echo 'this is benet web!' > /var/www/html/index.html

3. 路由命令详解

bash 复制代码
route add -host 192.168.10.180 dev lo:0
  • route: 管理系统路由表的命令
  • add: 添加新路由规则
  • -host 192.168.10.180: 指定目标为主机地址
  • dev lo:0: 指定数据包通过lo:0虚拟接口传输

作用: 将目标IP地址192.168.10.180指向本地回环接口的虚拟接口lo:0,使访问该IP的数据流量不会离开本地计算机。

4. ARP参数说明

  • arp_ignore = 1: 系统只响应目的IP为本地IP的ARP请求
  • arp_announce = 2: 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

三、LVS工作模式对比

特性 NAT模式 DR模式 TUN模式
性能 较低,有瓶颈 高性能 高性能
网络要求 无特殊要求 同一局域网 可跨网络
配置复杂度 简单 中等 复杂
适用场景 小规模应用 高性能要求 跨网络环境

四、LVS调度算法

固定调度算法

  • rr (轮询): 依次分配请求到不同RS节点
  • wrr (加权轮询): 根据权值分配任务,权值高的优先
  • dh (目的地址哈希): 以目的地址为关键字查找静态hash表
  • sh (源地址哈希): 以源地址为关键字查找静态hash表

动态调度算法

  • wlc (加权最小连接数): 选择Ti/Wi值最小的RS
  • lc (最小连接数): 选择当前连接最少的RS
  • lblc (基于地址的最小连接数): 结合地址哈希和最小连接数

五、测试验证

在客户端使用浏览器访问 http://192.168.10.180/,不断刷新页面观察负载均衡效果。正常情况下,请求应该轮流分发到两个Web服务器。

六、常见问题排查

  1. VIP无法访问

    • 检查Director Server的VIP配置
    • 验证Real Server的lo:0接口配置
    • 确认ARP参数设置正确
  2. 负载不均

    • 检查调度算法配置
    • 验证Real Server服务状态
  3. 响应缓慢

    • 检查网络连通性
    • 确认Real Server性能状态

七、总结

LVS-DR模式通过直接路由技术实现了高性能的负载均衡,响应数据直接返回客户端,避免了Director Server的性能瓶颈。在实际部署中需要注意ARP抑制、路由配置等关键技术点,确保集群的稳定性和高性能。


LVS+Keepalived 高可用群集:原理、部署与实战指南

一、Keepalived 概述

什么是Keepalived?

Keepalived 是一个基于 VRRP 协议实现的 LVS 服务高可用方案,专门用于解决静态路由单点故障问题。最初专为 LVS 负载均衡软件设计,用于管理和监控 LVS 集群中各个服务节点的状态,后来加入了高可用的 VRRP 功能。

核心功能

  • 管理 LVS 负载均衡软件:通过配置文件直接管理 LVS 配置
  • 故障自动切换(Failover):实现主备主机之间的故障转移
  • 健康检查(Health Checking):监控节点服务器状态
  • 高可用性(HA):确保负载调度器和节点服务器的高可用

二、Keepalived 体系架构

主要模块

模块 功能描述
core模块 keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析
vrrp模块 实现 VRRP 协议,处理主备切换
check模块 负责健康检查,支持端口检查和URL检查

VRRP 通信原理

  • 协议目的:解决静态路由的单点故障问题
  • 通信方式:IP多播(默认多播地址 224.0.0.18)
  • 工作机制:主节点发包,备节点接包,备节点接收不到数据包时启动接管程序
  • 认证方式:目前推荐使用明文方式配置认证类型和密码

三、脑裂问题及解决方案

什么是脑裂?

在高可用(HA)系统中,当两个节点间的"心跳线"断开时,HA系统分裂成为两个独立的个体,相互争抢共享资源和服务。

脑裂原因

  1. 心跳线链路故障
  2. 网卡及相关驱动问题
  3. 心跳线连接设备故障
  4. 仲裁机器问题
  5. iptables防火墙阻挡心跳消息
  6. VRRP实例配置不一致

应对策略

  1. 添加冗余心跳线:双线条线,减少发生几率
  2. 启用磁盘锁:正在服务一方锁住共享磁盘
  3. 设置仲裁机制:通过参考IP(如网关IP)进行判断
  4. 脚本检测报警:实时监控并报警

四、LVS+Keepalived 群集部署

环境准备

角色 IP地址 软件组件
主DR服务器 192.168.10.80 ipvsadm、keepalived
备DR服务器 192.168.10.23 ipvsadm、keepalived
Web服务器1 192.168.10.16 httpd
Web服务器2 192.168.10.17 httpd
虚拟IP(VIP) 192.168.10.180 -
客户端 192.168.10.100 -

1. 配置负载调度器(主备相同)

bash 复制代码
# 基础环境配置
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
配置keepalived
bash 复制代码
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf

主服务器配置(192.168.10.80):

nginx 复制代码
global_defs {
    smtp_server 127.0.0.1
    router_id LVS_01
    #vrrp_strict
}

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

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.16 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.10.17 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

备服务器配置(192.168.10.23):

  • 修改 router_id LVS_02
  • 修改 state BACKUP
  • 修改 priority 90
  • 其他配置与主服务器相同
配置虚拟IP
bash 复制代码
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
ini 复制代码
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash 复制代码
systemctl restart network
ifup ens33:0
systemctl start keepalived
ip addr  # 查看虚拟网卡vip
启动ipvsadm服务
bash 复制代码
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln
调整proc响应参数
bash 复制代码
vim /etc/sysctl.conf
ini 复制代码
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
bash 复制代码
sysctl -p

2. 配置节点服务器

bash 复制代码
# 基础环境配置
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd

# Web服务器1(192.168.10.16)
echo 'this is kgc web!' > /var/www/html/index.html

# Web服务器2(192.168.10.17)
echo 'this is benet web!' > /var/www/html/index.html
配置虚拟IP和ARP参数
bash 复制代码
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
ini 复制代码
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash 复制代码
service network restart
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0

vim /etc/sysctl.conf
ini 复制代码
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
bash 复制代码
sysctl -p

3. 抢占与非抢占模式

抢占模式 :MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来
非抢占模式:MASTER恢复后不抢占BACKUP升级为MASTER后的VIP

非抢占式配置:

  • 两个节点state都必须为backup
  • 添加配置 nopreempt
  • 启动服务的顺序决定master权限

五、测试验证

正常访问测试

在客户端访问 http://192.168.10.180/,观察负载均衡效果

故障切换测试

bash 复制代码
# 在主服务器关闭keepalived服务
systemctl stop keepalived

# 观察备服务器是否接管VIP和服务
ip addr  # 在备服务器上查看VIP

健康检查验证

  • 停止某个Web服务器的httpd服务
  • 观察Keepalived是否自动将其从转发队列中移除
  • 重启服务后观察是否自动重新加入

六、故障排查指南

常见问题

  1. VIP无法访问

    • 检查keepalived服务状态
    • 验证虚拟网卡配置
    • 确认防火墙设置
  2. 负载不均

    • 检查调度算法配置
    • 验证Real Server权重设置
  3. 脑裂现象

    • 检查心跳线连通性
    • 验证VRRP配置一致性

监控命令

bash 复制代码
# 查看keepalived状态
systemctl status keepalived

# 查看VIP状态
ip addr show ens33:0

# 查看LVS转发规则
ipvsadm -ln

# 查看日志
tail -f /var/log/messages

七、总结

LVS+Keepalived 组合提供了完整的高可用负载均衡解决方案,具备以下优势:

  1. 高可用性:通过VRRP协议实现主备自动切换
  2. 健康检查:实时监控后端服务器状态
  3. 负载均衡:支持多种调度算法
  4. 故障隔离:自动隔离故障节点
  5. 灵活配置:支持抢占和非抢占模式

在实际生产环境中,建议:

  • 配置冗余心跳线防止脑裂
  • 设置合适的健康检查参数
  • 定期进行故障切换测试
  • 建立完善的监控报警机制

通过本文的详细部署指南和原理讲解,相信您已经能够成功搭建和管理LVS+Keepalived高可用群集。


相关推荐
linweidong1 天前
负载均衡的LVS三种模式:NAT、TUN、DR场景对比与实践指南
负载均衡·lvs·dr模式·ip隧道·运维面经·k8s面试·docker面试
误入运维泥潭4 天前
LVS、Nginx与HAProxy负载均衡技术对比介绍
nginx·lvs·haproxy·keealived
xujiangyan_24 天前
HAProxy使用方法以及和LVS区别
lvs
竹竿袅袅2 个月前
Keepalived 原理及配置(高可用)
运维·云原生·lvs·keepalived·haproxy·高可用
hyy27952276842 个月前
LVS集群技术
lvs
Stewie121382 个月前
lvs集群技术
lvs
中心观察者2 个月前
LVS技术详解与实战
linux·运维·服务器·网络·lvs
这日光醉了城.2 个月前
LVS---集群技术
lvs
用户呢称2 个月前
Linux | LVS--Linux虚拟服务器知识点(下)
linux·服务器·lvs