LVS相关原理

一、LVS集群的体系结构

1.1 LVS简介

LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目,它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分,在Linux2.4 内核以前,使用 LVS 时必须要重新编译内核以支持 LVS 功能模块,但是从 Linux2.4内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。
使用 LVS 技术要达到的目标是:通过LVS 提供的负载均衡技术和 Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

1.2 LVS体系结构

使用 LVS 架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用 Load Balancer表示;中间的服务器群组层,用 Server Array 表示;最底端的数据共享存储层,用 Shared Storage 表示。

Load Balancer **层:**位于整个集群系统的最前端,有一台或者多台负载调度器( Director Server )
组成, LVS 模块就安装在 Director Server 上,而 Director 的主要作用类似于一个路由器,它含有完成 LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array 层的应用服务器( Real Server)上。同时,在 Director Server 上还要安装对 Real Server 服务的监控模块 Ldirectord ,此模块用于监测各个Real Server 服务的健康状况。在 Real Server 不可用时把它从 LVS 路由表中剔除,恢复时重新入。
Server Array **层:**由一组实际运行应用服务的机器组成, Real Server 可以是 WEB 服务器、 MAIL 服务器、FTP 服务器、 DNS 服务器、视频服务器中的一个或者多个,每个 Real Server 之间通过高速的 LAN 或分布在各地的WAN 相连接。在实际的应用中, Director Server 也可以同时兼任 Real Server 的角色。
Shared Storage **层:**是为所有 Real Server 提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS 网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如 Red hat 的 GFS 文件系统,oracle 提供的 OCFS2 文件系统等。

1.3 LVS相关术语


LVS 集群内部的节点称为真实服务器( Real Serve ),也叫做集群节点。请求集群服务的计算机称为客户计算机。与计算机通常在网上交换数据包的方式相同,客户计算机、Director 和真实服务器使用 IP 地址彼此进行通信。不同架构角色命名情况如下图:

1.4 LVS工作模式

LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的, IPVS 是 LVS 集群系统的核心软件,它的主要作用是:安装在Director Server 上,同时在 Director Server 上虚拟出一个 IP 地址,用户必须通过这个虚拟的 IP 地址访问服务。这个虚拟IP 一般称为 LVS 的 VIP ,即 Virtual IP 。访问的请求首先经过 VIP 到达负载调度器,然后由负载调度器从Real Server 列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的 Real Server 节点,而 Real
Server 节点如何返回数据给用户,是 IPVS 实现的重点技术, IPVS 实现负载均衡机制有三种,分别是NAT、 TUN 和 DR 。

VS/NAT**: 即(Virtual Server via Network Address Translation)**

也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
VS/TUN :即( Virtual Server via IP Tunneling
也就是 IP 隧道技术实现虚拟服务器。它的连接调度和管理与 VS/NAT方式一样,只是它的报文转发方法不同, VS/TUN 方式中,调度器采用 IP 隧道技术将用户请求转发到某个 Real Server ,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对 Real Server的地域位置没有要求,可以和Director Server 位于同一个网段,也可以是独立的一个网络。因此,在 TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
VS/DR : 即( Virtual Server via Direct Routing
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与 VS/NAT 和 VS/TUN中的一样,但它的报文转发方法又有不同, VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server ,而Real Server将响应直接返回给客户,免去了 VS/TUN 中的 IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求 Director Server 与 Real Server 都有一块网卡连在同一物理网段上。


特别提示:( VS/DR )模式是互联网使用的最多多的一种模式,在 LVS-DR 配置中, Director 将所有入站请求转发给集群内部节点,但集群内部的节点直接将他们的回复发送给客户端计算机(没有通过Director回来)。如下图所示:

1.5 LVS调度算法

调度方法决定了如何在这些集群节点之间分布工作负荷。
当 Director 收到来自客户端计算机访问她的 VIP 上的集群服务的入站请求时, Director 必须决定那个集群节点应该获得请求。Director 可用于做出该决定的调度方法分成两个基本类别:
固定调度算法: rr , wrr , dh , sh
动态调度算法: wlc ,lc, lblc , lblcr , SED , NQ

二、LVS-DR模式

2.1 LVS-DR基本工作原理

  1. 当用户向负载均衡调度器( Director Server )发起请求,调度器将请求发往至内核空间;
  2. PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ,将数据包发往 INPUT 链;
  3. IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时, IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS 会强行修改数据包里的目标 IP地址及端口,并将新的数据包发往POSTROUTING 链;
  4. POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。

2.2 LVS-DR模式特点

1 )所有集群节点 RS 必须和 Director 在相同的物理网段(即同一个局域网中);
2 )所有客户端入站(而不是出站)请求由 Director 首先接收,并转发给集群节点 RS ;
3 )集群节点 RS 通常来说最好带外部 IP ,而不使用 Director 及某固定机器作为默认网关,以便将数据包直接回复给客户端计算机,且不会产生回包的瓶颈;
4 )所有集群节点 RS 上必须在 lo 网卡上绑定 VIP 地址,以便验证通过目的 IP 非 RS 的数据包;
5 )由于所有集群节点 RS 上必须在 lo 网卡上绑定 VIP 地址,因此,带来 arp 问题,即集群节点 RS 默认会相应发往Director VIP 的数据包。因此要对所有集群节点 RS 做 ARP 抑制处理,把响应 VIP 的请求交给 LVSDirector;
6 )很多操作系统都可以用在集群内部的 RS 真实服务器上,只要该操作系统能够实现 ARP 隐藏,如:Windows, linux , unix ;
7 ) LVS/DR 模式不需要开启调度器转发功能,这点和 LVS/NAT 模式是不同的;
8 ) LVS/DR Director (服务器数量 100 台)可以比 LVS-NAT Director (服务器数量 10-20 台)承受更多的并发请求和转发更多的服务器数量。

2.3 ARP抑制


让前端路由将请求发往VIP时,只能是Dirctor上的VIP,解决方案:
1.静态地址绑定:未必有路由器的配置权限,Director调用时静态地址绑定将难以适用。
2.arptables:
arptables -F
arptables -A INPUT -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
3.修改linux的 Linux 内核参数,将 RS 上的 VIP 配置为 lo 接口的别名,限制 Linux 仅对对应接口的 ARP 请 求做响应。

三、LVS-NAT模式

3.1 LVS-NAT工作原理

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报 文的源IP为CIP,目标IP为VIP;

2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;

3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP;

4.POSTROUTING链通过选路,将数据包发送给Real Server;

5.Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP;

6.Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

工作逻辑图:

3.2 LVS-NAT模式特点

1)集群节点,必须在一个网络中;

2)真实服务器必须将网关指向负载调度器;

3)RIP 通常都是私有 IP,仅用于各个集群节点通信;

4)负载调度器必须位于客户端和真实服务器之间,充当网关;

5)支持端口映射;

6)负载调度器操作系统必须是 Linux ,真实服务器可以使用任意系统。

四、LVS-TUN模式

4.1 LVS-TUN工作原理

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP;

2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;

3.IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP;

4.POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP;

5.RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP;

6.响应报文最终送达至客户端。

工作逻辑图:

4.2 LVS-TUN模式特点

1)集群节点不必位于同一个物理网络但必须都拥有公网 IP(或都可以被路由);

2)真实服务器不能将网关指向负载调度器;

3)RIP 必须是公网地址;

4)负载调度器只负责入站请求;

5)不支持端口映射功能;

6)发送方和接收方必须支持隧道功能。

五、LVS-DR模式配置脚本

在lvs director上的脚本:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR

LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
RIP1=192.168.95.11
RIP2=192.168.95.12
DipName=ens33

. /etc/rc.d/init.d/functions
start() {
    PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
    if [ $PID -gt 0 ];
    then
        echo "The LVS-DR Server is already running !"
    else
        #Set the Virtual IP Address
        /sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev ${DipName}:10
        #Clear IPVS Table
        /sbin/ipvsadm -C
        #Set Lvs
        /sbin/ipvsadm -At $VIP:80 -s rr
        /sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g
        /sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g
        /bin/touch $LOCK
        #Run Lvs
        echo "starting LVS-DR Server is ok !"
    fi
}

stop() {
    #clear Lvs and vip
    /sbin/ipvsadm -C
    /sbin/route del -host $VIP dev ${DipName}:10
    /sbin/ifconfig ${DipName}:10 down >/dev/null
    rm -rf $LOCK
    echo "stopping LVS-DR server is ok !"
}

status() {
    if [ -e $LOCK ];
    then
        echo "The LVS-DR Server is already running !"
    else
        echo "The LVS-DR Server is not running !"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $1 {start|stop|restart|status}"
        exit 1
esac
exit 0

RS上的脚本:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP

LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10

. /etc/rc.d/init.d/functions
start() {
    PID=`ifconfig | grep lo:10 | wc -l`
    if [ $PID -ne 0 ];
    then
        echo "The LVS-DR-RIP Server is already running !"
    else
        /sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:10
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        /bin/touch $LOCK
        echo "starting LVS-DR-RIP server is ok !"
    fi
}

stop() {
    /sbin/route del -host $VIP dev lo:10
    /sbin/ifconfig lo:10 down >/dev/null
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    rm -rf $LOCK
    echo "stopping LVS-DR-RIP server is ok !"
}

status() {
    if [ -e $LOCK ];
    then
        echo "The LVS-DR-RIP Server is already running !"
    else
        echo "The LVS-DR-RIP Server is not running !"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $1 {start|stop|restart|status}"
        exit 1
esac
exit 0

六、LVS持久连接

(1)持久客户端连接
定义:每客户端持久。将来自于同一个客户端的所有请求统统定向至此前选定的 RS ;也就是只要 IP 相同,分配的服务器始终相同。
演示代码:

ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8 ,算法为 wlc,持久化时间为 120s

(2)持久端口连接
定义:每端口持久。将来自于同一个客户端对同一个服务 ( 端口 ) 的请求,始终定向至此前选定的 RS。
演示代码:

ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8:80 ,算法为 wlc,持久化时间为 120s

(3)持久防火墙标记连接
定义:将来自于同一客户端对指定服务 ( 端口 ) 的请求,始终定向至此选定的 RS。 不过它可以将两个毫不相干的端口定义为一个集群服务。
演示代码:

iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10 
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 80 时给数据包打一个标记,设置mark 值为 10

iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 443 时给数据包打一个标记,
设置mark 值为 10

service iptables save 
# 保存防火墙规则持久化生效

ipvsadm -A -f 10 -s wlc -p 120 
# 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使用wlc 算法,持久化生效时间为 120s

七、LVS高可用性实现

LVS 不可用时:
Director 不可用,整个系统将不可用。
解决方案:高可用, keepalived 、 heartbeat/corosync。
RS 不可用时:
某 RS 不可用时, Director 依然会调度请求至此 RS。
解决方案: 由 Director 对各 RS 健康状态进行检查,失败时禁用,成功时启用。
常用解决方案:

  • keepalived
  • heartbeat/corosync
  • ldirectord

检测方式:

  • 网络层检测, icmp
  • 传输层检测,端口探测
  • 应用层检测,请求某关键资源

ldirectord 软件:
ldirectord 是专门为 LVS 监控而编写的,用来监控 lvs 架构中服务器池( server pool ) 的服务器状态。ldirectord 运行在 IPVS 节点上, ldirectord 作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控, 如果 服务器没有响应 lldirectord 的请求,那么 ldirectord 认为该服务器不可用,ldirectord 会运行 ipvsadm 对 IPVS 表中该服务器进行删除,如果等下次再次检测有相应则通过 ipvsadm进行添加。
ldirectord :监控和控制 LVS 守护进程,可管理 LVS 规则
ldirectord 配置文件示例:
范例: DR 模型的 HTTP

[root@centos7 ~]#vim /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=no     #当RS down时 yes将修改权重为0,此配置有bug ,no为从调度列表中删除RS
virtual=192.168.150.100:80
    real=192.168.150.14 gate 1 #gate 表示DR模式,1 表示weight
    real=192.168.150.15 gate 2
    fallback=127.0.0.1:80 gate
    service=http
    scheduler=wrr
    #persistent=600
    #netmask=255.255.255.255
    protocol=tcp
    checktype=negotiate
    checkport=80

范例: DR 模型的 FWM

[root@centos7 ~]# /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log" #日志文件
quiescent=no #当RS down时 yes将修改权重为0,此配置有bug ,no为从调度列表中删除RS
virtual=66 #指定VS的FWM 或 IP:PORT
    real=172.16.0.7:80 gate 2 #DR模型,权重为 2
    real=172.16.0.8:80 gate 1
    fallback=127.0.0.1:80 gate #sorry server
    service=http
    scheduler=wrr
    #protocol=tcp #如果FWM模式,此行必须注释掉
    checktype=negotiate
    checkport=80
    request="index.html"
    receive="Test Ldirectord"
相关推荐
Christal_pyy41 分钟前
树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络
linux·网络·debian
csbDD2 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
小金的学习笔记2 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
EasyNVR3 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
风口上的猪20154 小时前
thingboard告警信息格式美化
java·服务器·前端
Natsuagin4 小时前
轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
linux·windows·ubuntu·grub
我们的五年4 小时前
【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
linux·网络·http
xing.yu.CTF6 小时前
Web入侵实战分析-常见web攻击类应急处置实验2
运维·服务器·windows·web安全·apache·php漏洞·phpstudy后门漏洞
小池先生6 小时前
阿里云子账号管理ECS权限配置全指南
服务器·阿里云·云计算
我们的五年6 小时前
【Linux网络】TCP/IP地址的有机结合(有能力VS100%???),IP地址的介绍
linux·运维·网络·tcp/ip