负载均衡集群( LVS 相关原理与集群构建 )

embedded/2025/2/24 4:05:56/

目录

1、LVS 相关原理

1.1、LVS集群的体系结构以及特点

1.1.1 LVS简介

1.1.2 LVS体系结构

1.1.3 LVS相关术语

1.1.4 LVS工作模式

1.1.5 LVS调度算法

1.2 LVS-DR集群介绍

1.2.1 LVS-DR模式工作原理

1.2.2 LVS-DR模式应用特点

1.2.3 LVS-DR模式ARP抑制

1.3 LVS – NAT 模式

1.4 LVS – TUN 模式

2、LVS 集群构建

2.1 LVS – NAT 模式集群构建

2.2 LVS – DR 模式集群构建

2.3 LVS 持久连接

2.4 LVS 高可用性实现

ldirectord软件

ldirectord配置文件示例


1、LVS 相关原理

1.1、LVS集群的体系结构以及特点

1.1.1 LVS简介

        LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是http://www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

        使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

        LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(http://www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(http://www.real.com)、全球最大的开源网站(http://sourceforge.net)等。

1.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.1.3 LVS相关术语

为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表

名称缩写说明
虚拟IP地址(Virtual IP Address)VIPDirector用于向客户端计算机提供服务的IP地址
真实IP地址(Real Server IP Address)RIP在集群下面节点上使用的IP地址
Director的IP地址(Director
IP Address)
DIPDirector用于连接内外网网络的IP地址
客户端主机IP地址(Client
IP Address)
CIP客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址

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

1.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实现负载均衡机制有三种,分别是NATTUNDR

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.1.5 LVS调度算法

调度方法决定了如何在这些集群节点之间分布工作负荷。

        当Director收到来自客户端计算机访问她的VIP上的集群服务的入站请求时,Director必须决定那个集群节点应该获得请求。Director可用于做出该决定的调度方法分成两个基本类别:

  • 固定调度算法:rr,wrr,dh,sh
  • 动态调度算法:wlc,lblc,lblcr,SED,NQ(后两种官方站点没提到)

10种调度算法见如下表格:

算法说明
rr轮循调度(Round-Robin),它将请求依次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合于处理性能相差不大的情况
wrr加权轮循调度(Weighted Round-Robin)它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相同数目的连接数。
dh目的哈希调度(Destination Hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS。
sh源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。
wlc加权最小连接数调度(weighted leastconnection)假设各台RS的权值依次为wi(i=1..n),当前的TCP连接数依次为Ti(i=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。
lc最小连接数调度(Least-Connection),IPVS表存储了所有的活动的连接。把心的连接请求发送到当前连接数最小的RS。
lblc基于地址的最小连接数调度(locality-Based Least-Connection)将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它
为下一次分配的首先考虑。
lblcr基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication)对于某一目的地址,对应有一个RS子集。对此地址请求,为它分配子集中连接数最小RS;如果服务器中所有子集均已满负荷,则从集群中选择一个连接数较小服务器,将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。
SED最短期望的延迟(shortest expected delay scheduling SED)(SED) 基于wlc算法。这个必须举例来说了 ABC三台机器分别权重123,连接数也分别是123.那么如果使用wlc算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进这样一个运算 A(1+1)/1 B(1+2)/2 C(1+3)/3 根据运算结果,把连接交给C。
NQ最少队列调度(Never Queue Scheduling NQ)(NQ) 无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算

详细讲述最常用的四种调度算法:

轮询调度(Round Robin)

        “轮询”调度也叫1:1调度,调度器通过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。

加权轮询调度(Weighted Round Robin)

        “加权轮询”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的RealServer,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。

最少链接调度(Least Connections)  

        “最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

加权最少链接调度(Weighted Least Connections)  

        “加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

1.2 LVS-DR集群介绍

LVS的基本工作原理

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

1.2.1 LVS-DR模式工作原理

  • 首先,来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。
  • 然后,集群某个节点将回复该数据包,并将该数据包直接发送到客户端计算机(不经过director),并且以此回复数据包使用的目的VIP 地址作为源IP地址。
  • 因此,实际上是客户计算机被“欺骗”了,客户计算机始终认为它正与同一台计算机对话,而实际上它正在发送请求数据包给一台计算机(LB),并从另一台计算机(RS)接收回复的数据包。

LVS DR模式集群结构图分解展示:
图1:LVS DR模式集群结构图

图2:客户端准备发出请求报文

图3:报文到达调度器后的改变

图4:RS处理报文后的报文情况

1.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台)承受更多的并发请求和转发更多的服务器数量。

1.2.3 LVS-DR模式ARP抑制

如果不抑制RS端arp影响

图1:抑制RS端arp前的广播情况                                                     图2:抑制RS端arp前响应情况
提示:广播消息会通过物理网卡到达真实服务器,而真实服务器上有VIP,所以,会响应此请求

抑制RS端arp响应后

图1:抑制RS端arp后广播情况                                                          图2:抑制RS后arp响应情况图

LVS DR类型:
1、让前端路由将请求发往VIP时,只能是Dirctor上的VIP;

解决方案:
(1) 静态地址绑定;
        未必有路由器的配置权限;
        Director调用时静态地址绑定将难以适用;

(2) arptables
Disable ARP for VIP
Basically, we have the following commands to disable ARP for VIP at real servers.
arptables -F
arptables -A INPUT -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

(3) 修改Linux内核参数,将RS上的VIP配置为lo接口的别名,限制Linux仅对对应接口的ARP请
求做响应;

1.3 LVS – NAT 模式

LVS/NAT原理

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

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

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

(d). POSTROUTING链通过选路,将数据包发送给Real Server

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

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

工作逻辑图

模式特点

  • 集群节点,必须在一个网络中
  • 真实服务器必须将网关指向负载调度器
  • RIP 通常都是私有 IP,仅用于各个集群节点通信
  • 负载调度器必须位于客户端和真实服务器之间,充当网关
  • 支持端口映射
  • 负载调度器操作系统必须是 Linux ,真实服务器可以使用任意系统

1.4 LVS – TUN 模式

LVS/TUN原理

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

(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链

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

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

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

(f) 响应报文最终送达至客户端

工作逻辑图

模式特点

  • 集群节点不必位于同一个物理网络但必须都拥有公网 IP(或都可以被路由)
  • 真实服务器不能将网关指向负载调度器
  • RIP 必须是公网地址
  • 负载调度器只负责入站请求
  • 不支持端口映射功能
  • 发送方和接收方必须支持隧道功能

2、LVS 集群构建

2.1 LVS – NAT 模式集群构建

架构图

ipvsadm工具使用

ipvsadm工具常用的参数选项有:

-A --add-service添加一条新的虚拟服务
-E --edit-service编辑虚拟服务
-D --delete-service删除虚拟服务
-C --clear清除所有的虚拟服务规则
-R --restore恢复虚拟服务规则
-a --add-server在一个虚拟服务中添加一个新的真实服务器
-e --edit-server编辑某个真实服务器
-d --delete-server删除某个真实服务器
-L | -l --list显示内核中的虚拟服务规则
-n --numeric以数字形式显示IP端口
-c --connection显示ipvs中目前存在的连接,也可以用于分析调度情况
-Z --zero将转发消息的统计清零
-p --persistent配置持久化时间
--set tcp tcpfin udp配置三个超时时间(tcp/tcpfin/udp)
-t | -uTCP/UDP协议的虚拟服务
-g | -m | -iLVS模式为:DR | NAT | TUN
-w配置真实服务器的权重
-s配置负载均衡算法,如:rr, wrr, lc等
--timeout显示配置的tcp/tcpfin/udp超时时间
--stats显示历史转发消息统计(累加值)
--rate显示转发速率信息(瞬时值)

示例:
1. 管理虚拟服务

  • 添加一个虚拟服务192.168.1.100:80,使用轮询算法
ipvsadm -A -t 192.168.1.100:80 -s rr
  • 修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.1.100:80 -s wrr
  • 删除虚拟服务
ipvsadm -D -t 192.168.1.100:80

2. 管理真实服务

  • 添加一个真实服务器192.168.1.123,使用DR模式,权重2
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
  • 修改真实服务器的权重
ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5
  • 删除真实服务器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123

3. 查看统计

  • 查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
  • 查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
  • 查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate

另外,--stats和--rate统计在分析问题时经常用到,输出各项的含义:
--stat选项是统计自该条转发规则生效以来的包

1. Conns (connections scheduled) 已经转发过的连接数
2. InPkts (incoming packets)   入包个数
3. OutPkts (outgoing packets)   出包个数
4. InBytes (incoming bytes)     入流量(字节)  
5. OutBytes (outgoing bytes)     出流量(字节)

--rate选项是显示速率信息

1. CPS   (current connection rate) 每秒连接数
2. InPPS (current in packet rate) 每秒的入包个数
3. OutPPS (current out packet rate) 每秒的出包个数
4. InBPS (current in byte rate)   每秒入流量(字节)
5. OutBPS (current out byte rate)   每秒入流量(字节)

构建代码

负载调度器
vim /etc/sysctl.conf # 开启路由转发功能
net.ipv4.ip_forward=1
sysctl -piptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source
20.20.20.11
# 添加防火墙记录,当源地址是 内网网段 并且出口网卡为 eth0 的时候进行 SNAT 转换,
转换源地址为外网卡地址iptables -t nat -L # 查看记录是否保存成功
ipvsadm -A -t 20.20.20.11:80 -s rr # 添加 ipvsadm TCP 集群
ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m # 添加 ipvsadm 节点
ipvsadm -Ln
ipvsadm-save > /etc/sysconfig/ipvsdm # 保存 ipvs 集群设置到文件进行持久化
systemctl enable ipvsadm真实服务器
route add default gw IP 地址 # 指定网关至负载调度器
service httpd start # 开启 Apache 服务器
chkconfig httpd on

2.2 LVS – DR 模式集群构建

架构图

构建代码

yum install ipvsadm配置LVS负载均衡服务
(1)手动添加LVS转发1)用户访问:www.uolookking.com-->vip 192.168.79.110 ##==>这个是在DNS配置hzitedu域的DNS记录设置www     IN  A   192.168.79.110没有配置DNS可以使用hosts文件配置方式来实现域名解析。192.168.79.110  www.hzitedu.com2)配置LVS虚拟IP(VIP)[root@Directory ~]# ifconfig eth1:110 192.168.79.110 netmask 255.255.255.0 up#这里采用子接口配置3)手工执行配置添加LVS服务并增加两台RS[root@Directory ~]# ipvsadm -C[root@Directory ~]# ipvsadm --set 30 5 60[root@Directory ~]# ipvsadm -A -t 192.168.79.110:80 -s wrr -p 20[root@Directory ~]# ipvsadm -a -t 192.168.79.110:80 -r 192.168.79.118:80 -g -w 1[root@Directory ~]# ipvsadm -a -t 192.168.79.110:80 -r 192.168.79.119:80 -g -w 1[删除方法]# ipvsadm -D -t 192.168.79.110:80 -s wrr# ipvsadm -d -t 192.168.79.110:80 -r 192.168.79.118:80[相关参数说明][root@Directory ~]# ipvsadm –help-A  添加虚拟服务器-t  设置群集地址(VIP,Virtual IP)-s  指定负载调度算法-a  添加真实服务器-d  删除真实服务器-r  指定真实服务器(Real Server)的地址-m  使用NAT模式;-g、-i分别对应DR、TUN模式-w  为节点服务器设置权重,默认为14)查看之前配置[root@Directory ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.79.110:80 wrr persistent 20-> 192.168.79.119:80            Route   1      0          0        -> 192.168.79.118:80            Route   1      0          0   (2)手工在RS端绑定VIP
每台real server端执行
[root@RS1 ~]# ifconfig lo:110 192.168.79.110 netmask 255.255.255.255 up
添加本机访问VIP的路由
[root@RS1 ~]# route add -host 192.168.79.110 dev lo每个集群节点上的环回接口lo设备上绑定VIP地址(其广播地址是其本身,子网掩码是255.255.255.255,
采取可变长掩码方式把网段划分成只含一个主机地址的目的是避免IP地址冲突)允许LVS-DR集群中的集群节
点接受发向该VIP地址的数据包,这会有一个非常严重的问题发生,集群内部的真实服务器将尝试回复来自正
在请求VIP客户端的ARP广播,这样所有的真实服务器都将声称自己拥有该VIP地址,这时客户端将直接发送请
求数据包到真实服务器上,从而破坏了DR集群的方法。因此,必须要抑制真实服务器的ARP广播。(3)手工在RS端抑制ARP响应
每台real server端执行
调整内核参数,关闭arp响应
[root@RS1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce中文说明:
arp_ignore-     INTEGER
定义对目标地址为本地IP的ARP询问不同的应答模式
0 -(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。
1 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
2 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
3 – 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
4-7 –保留未使用。
8 – 不回应所有(本地地址)的arp查询。arp_announce -     INTEGER
对网络接口上,本地IP地址发出的,ARP回应,做出相应级别的限制;
确定不同程度的限制,宣布对来自本地源IP地址发出ARP请求的接口
0 -(默认)在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 – 尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起ARP请求的源IP地址是被设置应该经由
路由到达此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内ip之一。如果该来访IP不
属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
2 – 对查询目标是要最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通
信的本地地址。首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有
合适的地址被发现,将选择当前的网络发送接口或其他的有可能接受到该ARP回应的网络接口来进行发送。限
制了使用本地的vip地址作为优先的网络接口。提示:也可以使用arptables实现抑制arp
?arptables -A INPUT -d $VIP -j DROP
?arptables -A OUTPUT -s $VIP -j mangle --mangle-ip-s $RIP
# arptables-save > /etc/sysconfig/arptables
# systemctl enable --now arptables

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 ];thenecho "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 Lvsecho "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/nullrm -rf $LOCKecho "stopping LVS-DR server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR Server is already running !"elseecho "The LVS-DR Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;
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 ];thenecho "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:10echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce/bin/touch $LOCKecho "starting LVS-DR-RIP server is ok !"fi
}stop() {/sbin/route del -host $VIP dev lo:10/sbin/ifconfig lo:10 down >/dev/nullecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcerm -rf $LOCKecho "stopping LVS-DR-RIP server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR-RIP Server is already running !"elseecho "The LVS-DR-RIP Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;
status)status;;
*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0

2.3 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 值为 10service iptables save # 保存防火墙规则持久化生效ipvsadm -A -f 10 -s wlc -p 120 # 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使
用wlc 算法,持久化生效时间为 120s

2.4 LVS 高可用性实现

LVS 不可用时:

Director不可用,整个系统将不可用;SPoF Single Point of Failure

解决方案:高可用,keepalived、heartbeat/corosync

RS 不可用时:

某RS不可用时,Director依然会调度请求至此RS

解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用

常用解决方案:

  • keepalived
  • heartbeat/corosync
  • ldirectord

检测方式:

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

RS全不用时:backup server, sorry server

ldirectord软件

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

ldirectord:监控和控制LVS守护进程,可管理LVS规则

包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

/repositories/network:/ha-clustering:/稳定版 - openSUSE 下载

相关文件:

  • /etc/ha.d/ldirectord.cf #主配置文件
  • /usr/share/doc/ldirectord-3.9.6/ldirectord.cf # 配置模版
  • /usr/lib/systemd/system/ldirectord.service # 服务
  • /usr/sbin/ldirectord #主程序,Perl实现
  • /var/log/ldirectord.log #日志
  • /var/run/ldirectord.ldirectord.pid #pid文件

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为从调度列表中删除RSvirtual=192.168.150.100:80real=192.168.150.14 gate 1  #gate 表示DR模式,1 表示weightreal=192.168.150.15 gate 2fallback=127.0.0.1:80 gateservice=httpscheduler=wrr#persistent=600#netmask=255.255.255.255protocol=tcpchecktype=negotiatecheckport=80[root@node1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.150.100:80 rr-> 192.168.150.14:80           Route   1      0          0        -> 192.168.150.15:80           Route   2      0          0

范例: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:PORTreal=172.16.0.7:80 gate 2    #DR模型,权重为 2real=172.16.0.8:80 gate 1fallback=127.0.0.1:80 gate   #sorry serverservice=httpscheduler=wrr#protocol=tcp     #如果FWM模式,此行必须注释掉checktype=negotiatecheckport=80request="index.html"receive=“Test Ldirectord"


http://www.ppmy.cn/embedded/164743.html

相关文章

Linux守护进程详解

什么是守护进程? 守护进程(Daemon)是指在后台运行的进程,通常用于执行系统级的任务,如日志记录、定时任务、网络服务等。守护进程不与用户直接交互,且在系统启动时自动运行。 创建守护进程的基本步骤 创…

HDLBits ——> Building Larger Circuits

是滴,你没看错,最近在学习这玩意。没办法,又被换方向了。 hdlbits刷题链接参考答案链接 基本上这5个弄懂了,后面就可以独立写写简单的东西啦! count1k 构建一个计数器,其计数范围从0到999(包…

常用 Webpack Plugin 汇总

一、HtmlWebpackPlugin ⭐⭐⭐⭐⭐ 作用 自动生成 HTML 文件,并将打包后的 JavaScript、CSS 等资源自动注入到生成的 HTML 文件中。当打包文件名包含哈希值时,能避免手动引入资源的繁琐。 使用场景 单页或多页应用开发中,只要需生成 HTML…

线性模型 - Softmax 回归(参数学习)

本文,我们来学习Softmax 回归的参数学习,在开始之前,我们先了解一下“损失函数”、“风险函数”和“目标函数”这三个核心概念。 一、损失函数、风险函数、目标函数 1. 损失函数(Loss Function) 定义: 损…

力扣——划分字母区间

题目链接: 链接 题目描述: 思路: 要找到每一个字母的最大位置end,也是这一段的结尾位置在这个最大位置内的字母,如果存在某个字母的最大位置 更大,就更新end为更大的如果遍历到end,就说明这一…

深研究:与Dify建立研究自动化应用

许多个人和团队面临筛选各种网页或内部文档的挑战,以全面概述一个主题。那么在这里我推荐大家使用Dify,它是一个用于LLM应用程序开发的低代码,开源平台,它通过自动化工作流程的多步搜索和有效汇总来解决此问题,仅需要最小的编码。 在本文中,我们将创建“ Deepresearch”…

AI大模型(DeepSeek)科研应用、论文写作、数据分析与AI绘图学习

【介绍】 在人工智能浪潮中,2024年12月中国公司研发的 DeepSeek 横空出世以惊艳全球的姿态,成为 AI领域不可忽视的力量!DeepSeek 完全开源,可本地部署,无使用限制,保护用户隐私。其次,其性能强大&#xff…

【matlab代码】基于故障概率加权与多模态滤波的AUV多源融合导航

多模态容错滤波仿真,以AUV为背景。订阅专栏后可查看完整代码,如有程序定制需求,可联系作者。 文章目录 创新点MATLAB仿真代码运行结果说明创新点 贝叶斯故障概率模型 融合SINS/DVL/GPS历史残差,计算实时故障概率 P fault P_{\text{fault}}