LVS 负载均衡原理 | 配置示例

注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。

部分内容已过时,可以看看原理实现。


使用 LVS 实现负载均衡原理及安装配置详解

posted on 2017-02-12 14:35 肖邦 linux

负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有 nginx、lvs、haproxy,商业的硬件负载均衡设备 F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。

一、负载均衡 LVS 基本介绍

LB 集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到 Director Server 上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器 (real server) 上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储。

二、LVS 的基本工作原理

img

1.当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间

2.PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数据包发往 INPUT 链

3.IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时,IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链

4.POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

三、LVS 的组成

LVS 由 2 部分程序组成,包括 ipvs 和 ipvsadm。

1.ipvs (ip virtual server):一段代码工作在内核空间,叫 ipvs,是真正生效实现调度的代码。

2.ipvsadm:另外一段是工作在用户空间,叫 ipvsadm,负责为 ipvs 内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器 (Real Server)

四、LVS 相关术语

1.DS:Director Server。指的是前端负载均衡器节点。

2.RS:Real Server。后端真实的工作服务器。

3.VIP:向外部直接面向用户请求,作为用户请求的目标的 IP 地址。

4.DIP:Director Server IP,主要用于和内部主机通讯的 IP 地址。

5.RIP:Real Server IP,后端服务器的 IP 地址。

6.CIP:Client IP,访问客户端的 IP 地址。

下边是三种工作模式的原理和特点总结。

五、LVS/NAT 原理和特点

1.重点理解 NAT 方式的实现原理和数据包的改变。

img

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

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

©.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

2.LVS-NAT 模型的特性

RS 应该使用私有地址,RS 的网关必须指向 DIP

DIP 和 RIP 必须在同一个网段内

请求和响应报文都需要经过 Director Server,高负载场景中,Director Server 易成为性能瓶颈

支持端口映射

RS 可以使用任意操作系统

缺陷:对 Director Server 压力会比较大,请求和响应都需经过 director server

六、LVS/DR 原理和特点

1.重将请求报文的目标 MAC 地址设定为挑选出的 RS 的 MAC 地址

img

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

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

© IPVS 比对数据包请求的服务是否为集群服务,若是,将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址,将目标 MAC 地址修改 RIP 的 MAC 地址,然后将数据包发至 POSTROUTING 链。 此时的源 IP 和目的 IP 均未修改,仅修改了源 MAC 地址为 DIP 的 MAC 地址,目标 MAC 地址为 RIP 的 MAC 地址

(d) 由于 DS 和 RS 在同一个网络中,所以是通过二层来传输。POSTROUTING 链检查目标 MAC 地址为 RIP 的 MAC 地址,那么此时数据包将会发至 Real Server。

(e) RS 发现请求报文的 MAC 地址是自己的 MAC 地址,就接收此报文。处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。 此时的源 IP 地址为 VIP,目标 IP 为 CIP

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

2.LVS-DR 模型的特性

特点 1:保证前端路由将目标地址为 VIP 报文统统发给 Director Server,而不是 RS

RS 可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对 RIP 进行直接访问

RS 跟 Director Server 必须在同一个物理网络中

所有的请求报文经由 Director Server,但响应报文必须不能进过 Director Server

不支持地址转换,也不支持端口映射

RS 可以是大多数常见的操作系统

RS 的网关绝不允许指向 DIP (因为我们不允许他经过 director)

RS 上的 lo 接口配置 VIP 的 IP 地址

缺陷:RS 和 DS 必须在同一机房中

3.特点 1 的解决方案

在前端路由器做静态地址路由绑定,将对于 VIP 的地址仅路由到 Director Server

存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用

arptables:在 arp 的层次上实现在 ARP 解析时做防火墙规则,过滤 RS 响应 ARP 请求。这是由 iptables 提供的

修改 RS 上内核参数(arp_ignore 和 arp_announce)将 RS 上的 VIP 配置在 lo 接口的别名上,并限制其不能响应对 VIP 地址解析请求。

七、LVS/Tun 原理和特点

在原有的 IP 报文外再次封装多一层 IP 首部,内部 IP 首部 (源地址为 CIP,目标 IIP 为 VIP),外层 IP 首部 (源地址为 DIP,目标 IP 为 RIP)

img

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

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

© 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) 响应报文最终送达至客户端

LVS-Tun 模型特性

RIP、VIP、DIP 全是公网地址

RS 的网关不会也不可能指向 DIP

所有的请求报文经由 Director Server,但响应报文必须不能进过 Director Server

不支持端口映射

RS 的系统必须支持隧道

其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,后边实践中会总结 DR 和 NAT 具体使用配置过程。

八、LVS 的八种调度算法

1.轮叫调度 rr

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

2.加权轮叫 wrr

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对 rr 算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器 A 的权值为 1,服务器 B 的权值为 2,则调度到服务器 B 的请求会是服务器 A 的 2 倍。权值越高的服务器,处理的请求越多。

3.最少链接 lc

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

4.加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

5.基于局部性的最少连接调度算法 lblc

这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

6.复杂的基于局部性最少的连接算法 lblcr

记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

7.目标地址散列调度算法 dh

该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

8.源地址散列调度算法 sh

与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

九、实践 LVS 的 NAT 模式

1、实验环境

三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡 (172.16.254.200) 和一个内网 ip (192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和 (192.168.0.28),并且需要把两个 real server 的内网网关设置为 director 的内网 ip (192.168.0.8)

2、安装和配置

两个 real server 上都安装 nginx 服务 # yum install -y nginx Director 上安装 ipvsadm # yum install -y ipvsadm

Director 上编辑 nat 实现脚本

#!/bin/bash# 开启 director 服务器的路由转发功能,使服务器能够在不同网络接口间转发数据包,这是实现 NAT 模式负载均衡的基础
# 因为在 NAT 模式下,director 需要将来自客户端的数据包转发到后端服务器,并将后端服务器的响应数据包转发回客户端
echo 1 > /proc/sys/net/ipv4/ip_forward# 关闭所有网络接口的 ICMP 重定向功能
# 防止因 ICMP 重定向消息可能导致的网络路径异常,确保流量按照预期的负载均衡配置进行转发
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# 关闭默认网络接口的 ICMP 重定向功能
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 关闭 eth0 网络接口的 ICMP 重定向功能
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
# 关闭 eth1 网络接口的 ICMP 重定向功能
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects# 对 director 服务器的 nat 表进行防火墙规则设置
# 清空 nat 表中的所有规则链,以便重新配置规则
iptables -t nat -F
# 删除 nat 表中用户自定义的空规则链,清理规则环境
iptables -t nat -X
# 在 nat 表的 POSTROUTING 链中添加规则
# 对源地址属于 192.168.0.0/24 网段的数据包进行源地址伪装(MASQUERADE)
# 这样,当后端服务器返回响应数据包时,数据包的源地址会被替换为 director 服务器的公网地址(或其他可用地址),实现 NAT 功能
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE# 设置 director 服务器的 ipvsadm 相关配置
# 定义 ipvsadm 命令的路径
IPVSADM='/sbin/ipvsadm'
# 清除已有的 IPVS 规则,准备重新配置
$IPVSADM -C
# 添加一个虚拟服务,监听在 172.16.254.200 的 80 端口,使用加权轮询(WRR)调度算法
# 该虚拟服务将作为客户端访问的统一入口,director 根据调度算法将请求分配到后端服务器
$IPVSADM -A -t 172.16.254.200:80 -s wrr
# 添加一个真实服务器到虚拟服务中,真实服务器地址为 192.168.0.18 的 80 端口
# 使用 NAT 模式(-m),并设置权重为 1
# 表示该真实服务器在加权轮询算法中的权重,权重越大,被分配到的请求相对越多
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1
# 再添加一个真实服务器到虚拟服务中,真实服务器地址为 192.168.0.28 的 80 端口
# 同样使用 NAT 模式,权重为 1
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1

上述脚本主要完成以下几个功能:

1.开启路由转发:
通过 echo 1 > /proc/sys/net/ipv4/ip_forward 语句开启服务器的路由转发功能,使得服务器能够在不同网络接口间转发数据包,这对于基于NAT(网络地址转换)的负载均衡场景是很关键的一步。

2.关闭ICMP重定向:
分别针对不同的网络接口配置(alldefaulteth0eth1 等),将 send_redirects 参数设置为 0,以此关闭ICMP重定向功能,避免一些不必要的网络路径调整相关的ICMP消息发送,让网络行为更符合预期的负载均衡配置逻辑。

3.配置NAT防火墙:
- iptables -t nat -F 用于清空 nat 表中的已有规则链,进行规则初始化。
- iptables -t nat -X 删除用户自定义的 nat 表链,确保规则环境的整洁。
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE 则是在 POSTROUTING 链(数据包离开本地网络接口时进行处理的链)添加规则,对源地址属于 192.168.0.0/24 网段的数据包进行源地址伪装(MASQUERADE),实现NAT功能,将内部网络的数据包通过负载均衡器(Director)转发到外部网络时进行地址转换。

4.配置IPVSADM(IP虚拟服务器管理工具):
- IPVSADM='/sbin/ipvsadm' 定义了 ipvsadm 命令的路径变量。
- $IPVSADM -C 用于清除已有的IPVS规则,进行初始化。
- $IPVSADM -A -t 172.16.254.200:80 -s wrr 创建一个虚拟服务,监听在 172.16.254.20080 端口,调度算法采用加权轮询(WRR)。
- 后面两条以 $IPVSADM -a 开头的语句分别添加了两个真实服务器(192.168.0.18:80192.168.0.28:80)到虚拟服务中,使用NAT模式(-m),并设置了权重(-w 1),让负载均衡器能够按照设定的规则将请求分发给后端的真实服务器。

最后,通过 /bin/bash /usr/local/sbin/lvs_nat.sh 语句可以直接运行这个脚本,来完成LVS/NAT相关的配置操作。

保存后,在 Director 上直接运行这个脚本就可以完成 lvs/nat 的配置

/bin/bash/usr/local/sbin/lvs_nat.sh

查看 ipvsadm 设置的规则

ipvsadm -ln

3、测试 LVS 的效果

通过浏览器测试 2 台机器上的 web 内容 http://172.16.254.200 。为了区分开,我们可以把 nginx 的默认页修改一下:

在 RS1 上执行

echo "rs1rs1" >/usr/share/nginx/html/index.html

在 RS2 上执行

echo "rs2rs2" >/usr/share/nginx/html/index.html

注意,切记一定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。

十、实践 LVS 的 DR 模式

1、实验环境

三台机器:

Director 节点: (eth0 192.168.0.8 vip eth0:0 192.168.0.38)

Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38)

Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)

2、安装

两个 real server 上都安装 nginx 服务 # yum install -y nginx Director 上安装 ipvsadm # yum install -y ipvsadm

3、Director 上配置脚本

#!/bin/bash# 开启路由转发功能,使得服务器能够在不同网络接口间转发数据包,这对于后续的负载均衡等网络配置很重要
echo 1 > /proc/sys/net/ipv4/ip_forward# 定义ipvsadm命令的路径变量,后续将使用该命令来配置IP虚拟服务器相关规则
ipv=/sbin/ipvsadm# 定义虚拟IP(VIP)地址,该IP将作为对外提供服务的统一入口IP地址
vip=192.168.0.38# 定义第一个真实服务器的IP地址,即后端实际提供服务的服务器之一的IP
rs1=192.168.0.18# 定义第二个真实服务器的IP地址,同样是后端实际提供服务的服务器之一的IP
rs2=192.168.0.28# 先关闭名为eth0:0的虚拟网络接口(如果之前存在且处于开启状态的话),进行配置前的清理准备工作
ifconfig eth0:0 down# 配置eth0:0虚拟网络接口,设置其IP地址为定义好的虚拟IP(vip),广播地址也设置为该虚拟IP,子网掩码设置为255.255.255.255,然后启用该接口
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up# 添加一条路由规则,将指向虚拟IP(vip)的主机路由指定通过eth0:0这个虚拟网络接口出去,确保流量能正确转发到相应接口
route add -host $vip dev eth0:0# 使用ipvsadm命令清除已有的IPVS规则,进行初始化操作,为后续添加新的负载均衡规则做准备
$ipv -C# 使用ipvsadm命令创建一个虚拟服务,监听在定义好的虚拟IP(vip)的80端口,调度算法采用加权轮询(WRR)方式
$ipv -A -t $vip:80 -s wrr# 使用ipvsadm命令添加第一个真实服务器(rs1)到虚拟服务中,采用直接路由(DR)模式(-g表示),并设置权重为3,使得该真实服务器在负载均衡中按权重分配请求
$ipv -a -t $vip:80 -r $rs1:80 -g -w 3# 使用ipvsadm命令添加第二个真实服务器(rs2)到虚拟服务中,同样采用直接路由(DR)模式,设置权重为1,让其参与负载均衡并按相应权重接收请求
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

上述脚本主要用于配置基于 LVS 的直接路由(DR)模式的负载均衡环境,大致执行以下几个关键步骤:

1.基础网络功能准备:
首先开启路由转发功能,为后续数据包在不同网络接口间的转发奠定基础,这是整个负载均衡配置能够正常运作的前提条件之一。

2.虚拟网络接口配置:
对名为 eth0:0 的虚拟网络接口进行配置,先关闭再重新设置其IP、广播地址以及子网掩码等信息,然后启用该接口,使其绑定虚拟IP(VIP),这个VIP就是对外提供服务的统一入口,外部客户端将通过这个IP来访问服务。并且添加相应的路由规则,确保指向该VIP的流量能够正确地通过这个虚拟接口进行转发。

3.IPVS规则配置:
- 通过 ipvsadm 工具,先清除已有的IP虚拟服务器相关规则进行初始化。
- 创建一个监听在VIP的 80 端口的虚拟服务,并指定加权轮询(WRR)作为调度算法,用于决定如何将客户端请求分发给后端的真实服务器。
- 接着分别添加两个真实服务器到该虚拟服务中,采用直接路由(DR)模式,同时为每个真实服务器设置不同的权重,使得它们在接收请求时按照权重比例来分担负载,实现负载均衡的功能。

需要注意的是,在实际使用场景中,要确保相关网络接口名称、IP地址等配置符合实际网络拓扑结构,同时服务器具备相应的权限来执行这些网络配置操作,避免出现配置错误导致的网络故障等问题。

执行脚本

\# bash /usr/local/sbin/lvs_dr.sh

4、在 2 台 rs 上配置脚本

vim /usr/local/sbin/lvs_dr_rs.sh

#!/bin/bashvip=192.168.0.38# 配置 VIP 到 lo:0 接口
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up# 添加 VIP 路由
route add -host $vip lo:0# 配置 ARP 相关参数
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/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

rs 上分别执行脚本

bash /usr/local/sbin/lvs_dr_rs.sh

5、实验测试

测试方式同上,浏览器访问 http://192.168.0.38

注意:在 DR 模式下,2 台 rs 节点的 gateway 不需要设置成 dir 节点的 IP 。

参考链接地址:

  • LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义 - haifeng0730 - 博客园
    http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html(见后面引文)

十一、LVS 结合 keepalive

LVS 可以实现负载均衡,但是不能够进行健康检查,比如一个 rs 出现故障,LVS 仍然会把请求转发给故障的 rs 服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。

1、实验环境

4 台节点

Keepalived1 + lvs1 (Director1):192.168.0.48

Keepalived2 + lvs2 (Director2):192.168.0.58

Real server1:192.168.0.18

Real server2:192.168.0.28

IP: 192.168.0.38

2、安装系统软件

Lvs + keepalived 的 2 个节点安装

# yum install ipvsadm keepalived -y

Real server + nginx 服务的 2 个节点安装

# yum install epel-release -y # yum install nginx -y

3、设置配置脚本

Real server 节点 2 台配置脚本

# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.0.38
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

2 节点 rs 上分别执行脚本:

bash /usr/local/sbin/lvs_dr_rs.sh

keepalived 节点配置 (2 节点)

主节点 ( MASTER ) 配置文件

vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.0.38}
}
virtual_server 192.168.0.38 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 0protocol TCPreal_server 192.168.0.18 80 {weight 1TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}real_server 192.168.0.28 80 {weight 1TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}
}

从节点 ( BACKUP )配置文件

拷贝主节点的配置文件 keepalived.conf,然后修改如下内容:

state MASTER -> state BACKUP
priority 100 -> priority 90

keepalived 的 2 个节点执行如下命令,开启转发功能:

# echo 1 > /proc/sys/net/ipv4/ip_forward

4、启动 keepalive

先主后从分别启动 keepalive:

service keepalived start

5、验证结果

实验 1

手动关闭 192.168.0.18 节点的 nginx,servicenginx stop 在客户端上去测试访问 http://192.168.0.38 结果正常,不会出现访问 18 节点,一直访问的是 28 节点的内容。

实验 2

手动重新开启 192.168.0.18 节点的 nginx,servicenginx start 在客户端上去测试访问 http://192.168.0.38 结果正常,按照 rr 调度算法访问 18 节点和 28 节点。

实验 3

测试 keepalived 的 HA 特性,首先在 master 上执行命令 ip addr ,可以看到 38 的 vip 在 master 节点上的;这时如果在 master 上执行servicekeepalived stop 命令,这时 vip 已经不再 master 上,在 slave 节点上执行 ip addr 命令可以看到 vip 已经正确漂到 slave 节点,这时客户端去访问 http://192.168.0.38 访问依然正常,验证了 keepalived 的 HA 特性。

lvs 介绍:http://www.it165.net/admin/html/201401/2248.html

posted on 2017-02-12 14:35 肖邦 linux


LVS 负载均衡

笨小孩 @GF 知行合一于 2020-02-22 10:42:05 发布

LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器 ,是一个虚拟的服务器集群系统。本项目在 1998 年 5 月由 [章文嵩](https://baike.baidu.com/item/ 章文嵩 / 6689425) 博士成立,是中国国内最早出现的自由软件项目之一。负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有 nginx、lvs、haproxy,商业的硬件负载均衡设备 F5、Netscale。

  • 使用集群技术和 Linux 操作系统实现一个高性能、高可用的服务器.

  • 很好的可伸缩性(Scalability)

  • 很好的可靠性(Reliability)

  • 很好的可管理性(Manageability)

  • 开源,免费

  • 在网上能找到一些相关技术资源

  • 具有软件负载均衡的一些优点

可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出 IP 负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的 IP 负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为 VS/NAT 技术(Virtual Server via Network Address Translation)。在分析 VS/NAT 的缺点和网络服务的非对称性的基础上,我们提出了通过 IP 隧道实现虚拟服务器的方法 VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法 VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN 和 VS/DR 技术是 LVS 集群中实现的三种 IP 负载均衡技术。

img

LVS 技术
  • 技术简介

LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

  • 集群采用三层结构

一般来说,LVS 集群采用三层结构,其主要组成部分为:

A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个 IP 地址(我们可称之为虚拟 IP 地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有 WEB、MAIL、FTP 和 DNS 等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

  • 调度器

调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用 IP 负载均衡技术、基于内容请求分发技术或者两者相结合。在 IP 负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在 Linux 操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。

对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如 NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS 服务器只能支持 3~6 个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如 AFS、GFS、Coda 和 Intermezzo 等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。

LVS 的八种调度算法

  1. 轮叫调度 rr :这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

  2. 加权轮叫 wrr :这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对 rr 算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器 A 的权值为 1,服务器 B 的权值为 2,则调度到服务器 B 的请求会是服务器 A 的 2 倍。权值越高的服务器,处理的请求越多。

  3. 最少链接 lc :这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

  4. 加权最少链接 wlc : 这个算法比 lc 多了一个权重的概念。

  5. 基于局部性的最少连接调度算法 lblc: 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

  6. 复杂的基于局部性最少的连接算法 lblcr : 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

  7. 目标地址散列调度算法 dh : 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

  8. 源地址散列调度算法 sh : 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

img

  • 分布式锁管理器

此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。

负载调度器、服务器池和共享存储系统通过高速网络相连接,如 100Mbps 交换网络、Myrinet 和 Gigabit 网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。

  • 监视器

Graphic Monitor 是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor 是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过 HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。

  • LVS 由 2 部分程序组成, ipvs 和 ipvsadm。

ipvs (ip virtual server):工作在内核空间,叫 ipvs,是真正生效实现调度的代码。

pvsadm:工作在用户空间,负责为 ipvs 内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器 (Real Server)

  • DS:Director Server。指的是前端负载均衡器节点。

  • RS:Real Server。后端真实的工作服务器。

  • VIP:向外部直接面向用户请求,作为用户请求的目标的 IP 地址。

  • DIP:Director Server IP,主要用于和内部主机通讯的 IP 地址。

  • RIP:Real Server IP,后端服务器的 IP 地址。

  • CIP:Client IP,访问客户端的 IP 地址。


LVS 三种工作模式的解析

  • 基于 NAT 的 LVS 模式负载均衡

NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有 IP 地址可以访问外网,以及外部用用户可以访问位于公司内部的私有 IP 主机。VS/NAT 工作模式拓扑结构如图 2 所示,LVS 负载调度器可以使用两块网卡配置不同的 IP 地址,eth0 设置为私钥 IP 与内部网络通过交换设备相互连接,eth1 设备为外网 IP 与外部网络联通。

第一步,用户通过互联网 DNS 服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS 外网 IP 又称 VIP(Virtual IP Address),用户通过访问 VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的 VIP 仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

第二步,用户将请求发送至 124.126.147.168,此时 LVS 将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并且在转发之前 LVS 会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器 IP 地址以及相应的端口。

第三步,真实的服务器将响应数据包返回给 LVS 调度器,调度器在得到响应的数据包后会将源地址和源端口修改为 VIP 及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于 LVS 调度器有一个连接 Hash 表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该 Hash 表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。

  • 基于 TUN 的 LVS 负载均衡

    在 LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过 LVS 调度器转发,如果后端服务器的数量大于 10 台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以 LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN 工作模式拓扑结构如图 3 所示。其中,IP 隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的 VIP 地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的 IP 地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

  • 基于 DR 的 LVS 负载均衡

img

在 LVS(TUN)模式下,由于需要在 LVS 调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与 LVS(TUN)类似,DR 模式也叫直接路由模式 ,其体系结构如图 4 所示,该模式中 LVS 依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR 模式)要求调度器与后端服务器必须在同一个局域网内,VIP 地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源 IP 为 VIP 地址,目标 IP 为客户端 IP,这样客户端访问的是调度器的 VIP 地址,回应的源地址也依然是该 VIP 地址(真实服务器上的 VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个 VIP 地址,所以在直接路由模式中要求调度器的 VIP 地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的 VIP 地址必须配置在 Non-ARP 的网络设备上,也就是该网络设备并不会向外广播自己的 MAC 及对应的 IP 地址,真实服务器的 VIP 对外界是不可见的,但真实服务器却可以接受目标地址 VIP 的网络请求,并在回应数据包时将源地址设置为该 VIP 地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的 MAC 地址修改为选出的真实服务器的 MAC 地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的 VIP 不需要对外界可见。


下面开始搭建基于 DR 模式 的 LVS 负载均衡

  • 试验环境简介

  • VIP 172.16.1.168

  • Director Server CentOS 7.5 : (eth0 192.168.1.2 eth1 172.16.1.1 vip eth1:0 172.16.1.168)

  • Real server1 CentOS 7.5 : (eth0 172.16.1.4 vip lo:0 172.16.1.168)

  • Real server2 CentOS 7.5 : (eth0 172.16.1.5 vip lo:0 172.16.1.168)

首先在 Director 上使用 yum 方式安装 ipvsadm

  • 在 CentOS 7 中 LVS 默认已经被编译进内核中,主要分为两部分 ipvs 和 ipvsadm,ipvs 是 LVS 软件核心,是运行在 LB 上的,基于 ip 层的负载均衡;ipvsadm 是用户空间(DR)集群管理工具。

  • 查看内核是否加载 LVS 模块

    lsmod | grep ip_vs

  • 安装 ipvsadm

    yum``install``-y ipvsadm

  • 要想起到负载均衡效果,所有请求报文必须发往 LVS 服务器 (DS),然后 DS 根据指定算法分发到后端服务器上(RS),因此 DS 必须配置 VIP 地址,VIP 是与公网 client 通信地址,这样 DS 才能接受到请求报文进行分发。

  • 在 LVS 服务器上添加一个地址为 VIP 的虚拟网卡 eth1:0

    ifconfig eth1:0 172.16.1.168 netmask 255.255.255.255 up

  • 添加 IPVS 规则

    ipvsadm -A -t 172.16.1.168:80 -s wrr
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.4:80 -g -w 1
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.5:80 -g -w 1
    ipvsadm-save -n > /etc/sysconfig/ipvsadm

    -A -t server1.2:http -s wrr

    -a -t server1.2:http -r 172.16.1.4:http -g -w 1

    -a -t server1.2:http -r 172.16.1.5:http -g -w 1

    systemctl start ipvsadm

  • 确认无误启动 LVS 服务

  • PS:规则文件会保存在 /etc/sysconfig/ipvsadm 文件中

img

img

img

  • 永久保存 VIP
  • vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

img

img

img

  • ipvs 规则保存与恢复

    ipvsadm-save > / 保存文件

    ipvsadm-restore < / 保存文件

  • 设置开机自动恢复

    vim /etc/rc.loal

    ipvsadm-restore < /etc/sysconfig/ipvsadm

img

img


  • 接着分别在 Real server (Rs)端设置

  • 将对应网卡设置为只回应目标 IP 为自身接口地址的 ARP 请求

    echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

    echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

  • 将 ARP 请求的源 IP 设置为 eth0 上的 IP,也就是 RIP

    echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

    echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

  • 永久生效方式,编辑 /etc/sysctl.conf 在末尾添加

    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.lo.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.lo.arp_announce=2

  • 必须完成以上设置,然后 添加 IP 地址为 VIP 的虚拟网卡 lo:0

    ifconfig lo:0 172.16.1.168 netmask 255.255.255.255 up

  • 添加一条路由,目标 IP 为 VIP 的数据包使用 lo 接口发送,这样响应报文的源 IP 就会为 VIP

    route add -host 172.16.1.168 dev lo:0

貌似不用加路由也可以。。。

  • 永久保存 lo:0

    vim /etc/rc.local

    ifconfig lo:0 192.168.2.168 netmask 255.255.255.255 up

img

  • 使用 yum 方式安装 nginx

    yum -y install nginx

    echo “172.16.1.4” > /usr/share/nginx/html/index.html

    systemctl start nginx

img

  • 两台 RS 都要做相同的设置

img

img

  • 打开浏览器 输入 http://172.16.1.168,手动刷新查看结果(一直按住 F5 可以看到变化)

img

img

  • 使用 apache 的 ab 工具进行 压测

    yum -y install httpd-tools

    ab -n 3400 -c 3400 http://gf-beyond.com/index.php

img

img

-c 表示并发用户数

-n 表示请求总数

  • Linux 内核参数 arp_ignore 和 arp_announce 作用说明

arp_ignore - INTEGER

0:默认值,表示可使用本地任意接口上配置的任意地址进行 arp 应答;

1:仅当请求的目标 IP 配置在本地主机接受到报文的接口上时,才给予响应;

2:仅当目的 IP 配置在收到报文的接口上,且 arp 请求的源 IP 和该接口同一网段,才响应 arp 请求;

3:如 ARP 请求的 IP 作用域是主机则不响应,如果作用域是全局或者链路则响应 ARP

4-7:保留

8:不应答所有本地 IP

arp_announce - INTEGER

0:默认值,允许使用本机上所有接口的 IP 作 ARP 通告。

1:尽量避免使用本地 IP 向非本网卡直接连接网络进行 ARP 通告。

2:必须避免使用本地 IP 向非本网卡直接连接网络进行 ARP 通告


LVS 负载均衡超详细入门介绍

杜北先森 已于 2024-05-14 16:36:32 修改

一、LVS 入门介绍

1.1. LVS 负载均衡简介

LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS 实际上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了一种高效的解决方法。

LVS 现在已经成为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够实现自动调用,在 CentOS 7 系列中通过 “modprobe ip_vs” 加载该模块。

lvs 工作在四层,只转发请求不涉及流量,效率更高

nginx 工作在七层能够针对域名、目录做特定转发,功能更全面

1.2. 负载均衡的工作模式

关于集群的负载调度技术,可以基于 IP、端口、内容等进行分发。其中基于 IP 的负载调度效率最高,基于 IP 的负载均衡模式中,常见的有地址转换、IP 隧道和直接路由三种工作模式,如下图:

img

1.2.1. 地址转换 NAT(Network Address Translation)

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

1.2.2.IP 隧道 TUN(IP Tunneling)

采用 NAT 技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过 IP 隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 LVS/TUN 技术后,集群系统的最大吞吐量可以提高 10 倍。

1.2.3. 直接路由 DR(Direct Routing)

LVS/DR 通过改写请求报文的 MAC 地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同 LVS/TUN 技术一样,LVS/DR 技术可极大地提高集群系统的伸缩性。这种方法没有 IP 隧道的开销,对集群中的真实服务器也没有必须支持 IP 隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一个物理网段上。

以上三种工作模式中,NAT 方式只需要一个公网 IP 地址,从而成为最易用的一种负载均衡模式,安全性也比较好,许多硬件负载均衡设备就采用这种方式;相对而言,DR 模式和 TUN 模式负载能力更加强大,适合范围更广,但是节点的安全性要稍差一些。

1.3. LVS 常用的负载调度算法

针对不同的网络服务和配置需要,LVS 调度器提供多种不同的负载调度算法,其中最常见的如下所示:

轮询(Round Robin):

将收到的访问请求按照顺序轮流分配给集群中的各节点服务器,均等地对待每台节点服务器,而不考虑服务器实际的连接数和系统负载等条件;当所有节点服务器的配置都相近或一致时一般采用这种方式。

加权轮询(Weighted Round Bobin):

根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。

最少连接(Least Connections):

根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地负载均衡。

加权最少连接(Weighted Least Connections):

在服务器节点的性能差异较大情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大比例的活动连接负载。

1.4. LVS 管理工具 ipvsadm

ipvsadm 是在负载调度器上使用的 LVS 集群管理工具,通过调用 ip_vs 模块添加、删除、查看负载均衡集群运行状态。在 CentOS 7 系列中需要手动安装 ipvsadm 管理工具。

# modprobe ip_vs // 加载 LVS 功能模块
# yum install -y ipvsadm // 安装
# ipvsadm -v // 查看已安装的 ipvsadm 版本ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)# man ipvsadm // 查询 ipvsadm 使用手册

创建虚拟服务器

若集群的 VIP 地址为 192.168.1.100,针对 TCP 80 端口提供负载分流服务,使用的调度算法为轮询,则对应的 ipvsadm 命令操作如下,对于负载均衡调度器来说,VIP 地址必须是本机实际已启用的 IP 地址。

# ipvsadm -A -t 192.168.1.100:80 -s rr
//-A/ 表示添加虚拟服务器
//-t/ 指定 VIP 地址以及端口
//-s/ 指定负载调度算法,轮询 /rr、加权轮询 /wrr、最少连接 /lc、加权最少连接 /wlc

添加节点服务器

为虚拟服务器 192.168.1.100 添加四个节点服务器,命令如下,若希望使用保持连接,还应添加 “-p 60” 选项,其中 60 为保持时间,单位为秒

# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.40:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.50:80 -m -w 1//-a/ 表示添加节点服务器
//-t/ 指定 VIP 地址以及端口
//-r/ 指定 RIP 地址以及端口
//-m/ 表示使用 NAT 集群模式,-g 为 DR 模式、-i 为 TUN 模式
//-w/ 指定权重,权重值越高被分配的用户请求数量就越多,权重为 0 时,表示停用该节点服务器

查看 LVS 集群状态

# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port      Forward Weight ActiveConn InActConnTCP  192.168.1.100:80 rr-> 192.168.1.20:80        Masq   1    0      0
-> 192.168.1.30:80        Masq   1    0      0
-> 192.168.1.40:80        Masq   1    0      0
-> 192.168.1.50:80        Masq   1    0      0Forward :负载均衡集群模式,Masq 为 NAT,Route 为 DR 模式,Tunnel 为 TUN 模式Weight :权重,该值越大被分配的请求就越多,都一致时,表示均匀地接受请求ActiveConn :活跃的连接数InActConn:已处理的连接数

删除集群相关条目

# ipvsadm -d -r 192.168.1.20:80 -t 192.168.1.100:80 // 删除单条节点服务器
# ipvsadm -D -t 192.168.1.100:80 // 删除虚拟服务器,包括所有节点服务器

二、NFS 共享存储服务

2.1. NFS 简介

NFS 是 Network File System 的缩写,中文意思是网络文件系统。它的主要功能是通过 TCP/IP 网络让不同的主机系统之间可以共享文件或目录。NFS 客户端 (一般为‘应用 / 节点’服务器) 可以通过 mount 挂载的方式将 NFS 服务器端共享的存储目录挂载到 NFS 客户端本地系统中,从客户端本地来看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的 NFS 服务器的目录。在互联网中小型网站集群架构后端常用 NFS 进行数据共享,如果是大型网站,可能还会用到更复杂的分布式文件系统。例如 Moosefs/MFS、GlusterFS、FastDFS。

NFS 服务的实现依赖于 RPC(Remote Process Call,远程过程调用)机制,以完成远程到本地的映射过程,在 CentOS 7 系列系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务。前者用于 NFS 共享发布和访问,后者用于 RPC 支持。

NFS 的 RPC 服务的主要功能就是记录每个 NFS 功能所对应的端口号,并且在 NFS 客户端请求时将该端口和功能对应的信息传递给请求数据的 NFS 客户端,从而确保客户端可以连接到正确的 NFS 端口上去,达到实现数据传输交互数据目的,这个 RPC 服务类似 NFS 服务器端和 NFS 客户端之间的一个中介。

2.2. NFS 共享存储服务实战

案例描述:

通过 NFS 服务实现共享文件,使得两台 Web 服务器能够同时访问该共享获取同样的数据。

案例环境:

主机

操作系统

IP地址

主要软件

NFS Server

CentOS 7.5_64

192.168.1.14/24

nfs-utils、rpcbind

Web Client_1

CentOS 7.5_64

192.168.1.12/24

Web Client_2

CentOS 7.5_64

192.168.1.13/24

2.2.1.NFS 服务器的安装配置
# yum install -y nfs-utils rpcbind
# systemctl enable nfs
# systemctl enable rpcbind

NFS 设置共享目录

# mkdir -p /var/www/html
# echo "这是 NFS 存储服务器!" > /var/www/html/index.html
# vim /etc/exports// 该文件用于设置 NFS 共享项目,指定共享目录、权限等/var/www/html   192.168.1.0/24 (rw,sync,no_root_squash)或者/var/www   192.168.1.0/24 (rw) ,192.168.2.1 (ro)

编辑以上配置文件时客户机可以是主机名、IP 地址、网段、且允许使用 *、?

通配符

权限中 rw 表示读写、ro 表示只读,sync 表示同步写入,no_root_squash 表示当客户机用 root 登录时赋予本地 root 权限

# systemctl restart rpcbind  // 先启动该服务
# systemctl restart nfs

查看本地共享的项目:

# showmount -e"clnt_create: RPC: Unknown host" // 首次查看时可能会报此错误

解决方法:

# vim /etc/hosts
192.168.1.14   pillarx1m // 加入当前主机 IP 地址与对应的主机名
# showmount -e // 再次查看当前服务器的共享项目
Export list for pillarx1m:
/var/www/html 192.168.1.0/24
2.2.2.NFS 客户端访问挂载

NFS 协议的目标是提供一种网络文件系统因此对 NSF 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs。即可以手动挂载也可以加入 fstab 配置文件实现开机自动挂载,考虑到集群系统网络稳定性,NFS 服务器和 NFS 客户端之间最好是使用专用网络来进行连接。

# yum install -y nfs-utils rpcbind  //rpcbind 客户机必须安装,nfs 用于支持 showmount 命令
# systemctl enable rpcbind
# systemctl start rpcbind
# showmount -e 192.168.1.14 // 查询 NFS 服务器的共享项目Export list for 192.168.1.14:
/var/www/html 192.168.1.0/24

客户端手动挂载 NFS 服务器共享的目录

# mkdir /var/www
# mount 192.168.1.14:/var/www//var/www

查看客户机中的网页是否为 NFS 服务器的内容:

# cat /var/www/html/index.html
这是 NFS 存储服务器!

此时通过# mount 命令同样可以查看到已挂载的项目中有当前的 NFS 项目

客户端实现开机自动挂载:

# vim /etc/fstab
192.168.1.14:/var/www/var/www/     nfs   rw        0 0

添加开机自动挂载配置文件后,重启电脑后可以查看到该项目已经挂载

也可以在当前状态下输入# mount -a 实现立即加载 fstab 配置文件

三、LVS 负载均衡集群实战

3.1. 地址转换模式 (LVS - NAT)

3.1.1. 案例描述

在 NAT 模式的集群中,LVS 负载调度器是所有节点访问互联网的网关服务器,其外网地址 192.168.1.10 同时也作为整个集群的 VIP 地址,LVS 服务器具备两块网卡,分别连接内网和外网。关于客户机访问服务器的数据流量的大致流向是这样的:

client --> LVS --> RS --> LVS --> client。此外,在接下来的案例中,** 均不再结合 NFS 共享存储 **,原因是加上 NFS 后当客户端访问服务器时,无论如何都只会显示一个网页内容,因此验证效果不明显。

案例架构图如下:

img

案例环境:
主机操作系统IP 地址主要软件
LVS ServerCentOS 7.5_64192.168.1.10/24 192.168.2.10/24ipvsadm
Web Server_1CentOS 7.5_64192.168.2.20/24httpd-2.4.6-45.el7.centos.x86_64
Web Server_2CentOS 7.5_64192.168.2.30/24
3.1.2. 案例实施

对于 LVS 负载调度器来说,需要开启路由转发规则,以便节点服务器能够访问到互联网,所有的节点服务器、共享存储均位于内网中,其默认网关设置为 LVS 负载调度器的内网 IP 地址 (192.168.2.10)。

LVS Server 操作

开启路由转发:

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

配置负载分配策略

# yum install -y ipvsadm
# ipvsadm -A -t 192.168.1.10:80 -s rr
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.20:80 -m -w 1
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.30:80 -m -w 1
若要验证权重分配几率,最好是采用 wrr 来实现,CentOS 7 中通过 rr 无法体现出权重的几率
# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port      Forward Weight ActiveConn InActConnTCP  192.168.1.10:80 rr-> 192.168.2.20:80        Masq   1    0      0
-> 192.168.2.30:80        Masq   1    0      0

两台 Web Server 配置

Web Server_1 配置:

指定网关为 LVS 服务器的内网 IP 地址:

# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY="192.168.2.10"
# systemctl restart network

安装配置提供给客户端的应用服务程序

# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "[LVS 负载均衡](https://so.csdn.net/so/search?q=LVS  负载均衡 & spm=1001.2101.3001.7020) 集群之 Web Server_1" > /var/www/html/index.html

Web Server_2 配置:

指定网关为 LVS 服务器的内网 IP 地址:

# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY="192.168.2.10"
# systemctl restart network

安装配置提供给客户端的应用服务程序

# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS 负载均衡集群之 Web Server_2" > /var/www/html/index.html
3.1.3. 验证测试

外网客户机测试:

通过外网客户机访问集群 VIP 地址访问集群,发现不断刷新或重新连接能够出现不同的页面信息,不过这些信息都来自于节点服务器中的数据,此时再查看 LVS 服务器的负载情况,也是有所变化的:

# 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.1.10:80 rr
-> 192.168.2.20:80        Masq   1    0      6
-> 192.168.2.30:80        Masq   1    0      5

此外,还可以直接查看节点服务器的访问日志,由于此种集群方式采用的是转发请求,因此在节点服务器日志中是能够看到外网客户机访问的。

# cat /etc/httpd/logs/access_log192.168.1.253 - - [11/Nov/2018:12:04:15 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"

默认 lvs 会话保持为五秒。

会话保持时间设置:

节点服务器:KeepAliveTimeout 10

lvs 调度服务器:

# ipvsadm --list --timeout
# ipvsadm --set 720 120 300

3.2. 直接路由模式 (LVS - DR)

3.2.1. 案例描述

在 DR 模式的集群中,LVS 负载调度器作为集群的访问入口,但不作为网关使用;服务器池中的所有节点服务器各自接入互联网,发送给客户机的 Web 响应数据包不需要经过 LVS 负载调度器。这种方式入站、出站访问数据被分别处理,因此 LVS 负载调度器和所有的节点服务器都需要配置 VIP 地址,以便响应对整个集群的访问,考虑到数据存储安全性,共享存储设备会放在内部专用网络中。关于客户机访问服务器的数据流量的大致流向是这样的:client --> LVS --> RS --> client。此外,在接下来的案例中,均不再结合 NFS 共享存储,原因是加上 NFS 后当客户端访问服务器时,无论如何都只会显示一个网页内容,因此验证效果不明显。

案例架构图如下:

img

案例环境:

img

3.2.2. 案例实施

LVS Server 操作

配置虚拟 IP 地址

采用虚接口的方式 (ens32:0) 为网卡 ens32 绑定一个 VIP 地址,以便响应集群访问,配置结果为 ens32:192.168.1.10、ens32:0:192.168.1.100

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-ens32 ifcfg-ens32:0
# vim ifcfg-ens32:0 // 只修改以下三部分内容即可
NAME=ens32:0
DEVICE=ens32:0
IPADDR=192.168.1.100
# ifup ens32:0
# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 192.168.1.100 netmask 255.255.255.0  broadcast 192.168.1.255
ether 00:0c:29:99:f9:ca  txqueuelen 1000  (Ethernet)

调整 /proc 响应参数

对于 DR 集群来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应。

# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens32.send_redirects = 0 // 此接口地址为 lvs 服务器正在使用的物理接口
# sysctl -p

配置负载分配策略

# yum install -y ipvsadm
# ipvsadm -A -t 192.168.1.100:80 -s rr
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20 -g -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30 -g -w 1
# 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.1.100:80 rr
-> 192.168.1.20:80        Route  1    0      0
-> 192.168.1.30:80        Route  1    0      0

两台 Web Server 配置

使用 DR 模式时,节点服务器也需要配置 VIP 地址,并调整内核的 ARP 响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突,除此之外,WEB 服务器的配置与 NAT 模式配置类似。

节点服务器配置 VIP 地址仅用作发送 Web 响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚接口 lo:0 来承受 VIP 地址,并为本机添加一条路由记录,将访问 VIP 地址的数据限制在本地,避免通信紊乱。

Web Server_1 配置:

设置 VIP 地址:

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0 // 只修改以下三部分内容即可
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
# ifup lo:0
# ifconfig lo:0

添加路由

# /sbin/route add -host 192.168.1.100 dev lo:0
# vim /etc/rc.local
/sbin/route add -host 192.168.1.100 dev lo:0

调整 /proc 相应参数

# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce =2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
# sysctl -p

安装配置提供给客户端的应用服务程序

# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS 负载均衡集群之 Web Server_1" > /var/www/html/index.html

Web Server_2 配置:

设置 VIP 地址:

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0 // 只修改以下三部分内容即可
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
# ifup lo:0
# ifconfig lo:0

添加路由

# /sbin/route add -host 192.168.1.100 dev lo:0
# vim /etc/rc.local
/sbin/route add -host 192.168.1.100 dev lo:0

调整 /proc 相应参数

# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce =2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
# sysctl -p

安装配置提供给客户端的应用服务程序

# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS 负载均衡集群之 Web Server_2" > /var/www/html/index.html
3.2.3. 验证测试

外网客户机测试:

通过外网客户机访问集群 VIP 地址访问集群,发现不断刷新或重新连接能够出现不同的页面信息,不过这些信息都来自于节点服务器中的数据,此时再查看 LVS 服务器的负载情况,也是有所变化的:

# ipvsadm -ln

此外,还可以直接查看节点服务器的访问日志,由于此种集群方式采用的是转发请求,因此在节点服务器日志中是能够看到外网客户机访问的。

# cat /etc/httpd/logs/access_log192.168.1.253 - - [11/Nov/2018:12:04:15 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"

LVS 负载均衡中 arp_ignore 和 arp_announce 参数配置的含义

2012-10-16 16:43 haifeng0730

一、LVS 负载均衡简介

LVS(Linux Virtual Server)即 Linux 服务器集群系统,旨在满足高可伸缩、高可用服务的需求,它基于 IP 层和内容请求分发提供负载均衡调度解决方案,并于 Linux 内核中实现,能将一组服务器构建成可实现可伸缩、高可用网络服务的虚拟服务器。

(一)负载均衡作用

1.流量分担与等待时间减少

可将大量并发访问或数据流量分配到多个节点设备分别处理,以此减少用户的等待时间。

2.运算分担与结果汇总

能把单个重负载的运算分配到多个节点设备上并行处理,各节点设备处理完毕后,将结果汇总再返回给用户。

(二)负载调度器

一组服务器通过高速局域网或者地理分布的广域网相互连接,在其前端设有负载均衡调度器(Load Balancer)。该调度器能够无缝地把网络请求调度到真实的服务器上,使得服务器集群的结构对用户而言是透明的。用户访问集群系统所提供的网络服务时,就如同在访问一台高性能、高可用的服务器一样。

(三)IP 负载均衡技术(三种)

1.VS/NAT(网络地址转换)

通过网络地址转换,调度器重写请求报文的目标地址,依据预设的调度算法,将请求分发给后端的真实服务器。真实服务器的响应报文经过调度器时,报文的源地址会被重写,而后再返回到客户端,如此便完成了整个调度过程。

2.VS/TUN(IP 隧道模式)

调度器将请求的报文通过 IP 隧道转发至真实服务器,而真实服务器会直接将结果返回给用户。调度器只负责处理请求报文,鉴于一般网络服务的应答数据量大于请求数据量,采用 IP 隧道模式时,集群系统的最大吞吐量能够提高 10 倍。

3.VS/DR(直接路由)

借助改写请求报文的 MAC 地址,将请求发送到真实服务器,真实服务器再把响应直接返回给用户。直接路由模式可极大地提升集群系统的伸缩性,此方法不存在 IP 隧道的开销,集群中的真实服务器也并非必须支持 IP 隧道协议,只是要求调度器与真实服务器有一块网卡连接在同一物理网段上。

在这三种 IP 负载均衡技术里,DR 和 TUN 模式都需要在真实服务器上对 arp_ignore 和 arp_announce 参数进行配置,主要目的是实现禁止响应对 VIP(虚拟 IP)的 ARP(地址解析协议)请求。

在 lvs 环境中,需设定以下参数:

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

二、arp_ignore 相关介绍

arp_ignore 参数说明(英文)

arp_ignore - INTEGER Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured on any interface
1 - reply only if the target IP address is local address configured on the incoming interface
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender’s IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host, only resolutions for global and link addresses are replied
4-7 - reserved
8 - do not reply for all local addresses
The max value from conf/{all,interface}/arp_ignore is used when ARP request is received on the {interface}

arp_ignore 参数说明(中文)

arp_ignore - 整数类型,用于定义针对接收到的、解析本地目标 IP 地址的 ARP 请求,发送回复时的不同模式:

  • 0 - (默认值):对在任何接口上配置的任何本地目标 IP 地址的 ARP 查询请求进行回复。
  • 1 - 仅当目标 IP 地址是传入接口上配置的本地地址时才回复。
  • 2 - 仅当目标 IP 地址是传入接口上配置的本地地址,并且发送方的 IP 地址与该接口上的同一子网相关时才回复。
  • 3 - 对于配置了主机作用域的本地地址不回复,仅回复全局地址和链路地址的解析请求。
  • 4-7 - 保留(暂未使用)。
  • 8 - 对所有本地地址均不回复。
    当在某个接口上接收到 ARP 请求时,将使用 conf/{all,interface}/arp_ignore 中的最大值。

三、arp_announce 相关介绍

arp_announce 参数说明(英文)

arp_announce - INTEGER Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface:
0 - (default) Use any local address, configured on any interface
1 - Try to avoid local addresses that are not in the target’s subnet for this interface. This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level 2.
2 - Always use the best local address for this target. In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with the target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with the hope we will receive reply for our request and even sometimes no matter the source IP address we announce.
The max value from conf/{all,interface}/arp_announce is used. Increasing the restriction level gives more chance for receiving answer from the resolved target while decreasing the level announces more valid sender’s information.

arp_announce 参数说明(中文)

arp_announce - 整数类型,用于定义对网络接口上发送的 ARP 请求中 IP 数据包的本地源 IP 地址宣告的不同限制级别:

  • 0 - (默认):使用在任何接口上配置的任何本地地址。
  • 1 - 尽量避免使用不在该接口目标子网内的本地地址进行 ARP 回复。当通过此接口可访问的目标主机要求 ARP 请求中的源 IP 地址属于接收接口上配置的其逻辑网络的一部分时,此模式很有用。当我们生成请求时,会检查包含目标 IP 的所有子网,如果源地址来自这样的子网,则保留该源地址;若不存在这样的子网,则按照级别 2 的规则选择源地址。
  • 2 - 始终针对此目标使用最合适的本地地址。在此模式下,我们会忽略 IP 数据包中的源地址,并尝试选择与目标主机通信时更倾向使用的本地地址。这样的本地地址是通过查找外出接口上所有包含目标 IP 地址的子网中的主 IP 地址来选定的。如果未找到合适的本地地址,则选择外出接口或其他所有接口上的第一个本地地址,期望能收到对我们请求的回复,有时甚至无论宣告的源 IP 地址是什么都可以。
    使用 conf/{all,interface}/arp_announce 中的最大值。提高限制级别会增加从已解析目标接收回复的机会,而降低级别则会宣告更多有效的发送方信息。

四、关于对 arp_announce 理解的一点补充

Assume that a linux box X has three interfaces - eth0, eth1 and eth2. Each interface has an IP address IP0, IP1 and IP2. When a local application tries to send an IP packet with IP0 through the eth2. Unfortunately, the target node’s mac address is not resolved. Thelinux box X will send the ARP request to know the mac address of the target (or the gateway).

In this case what is the IP source address of the “ARP request message”? The IP0- the IP source address of the transmitting IP or IP2 - the outgoing interface? Until now (actually just 3 hours before) ARP request uses the IP address assigned to the outgoing interface (IP2 in the example) However the linux’s behavior is a little bit different. Actually the selection of source address in ARP request is totally configurable bythe proc variable “arp_announce”.

If we want to use the IP2 not the IP0 in the ARP request, we should change the value to 1 or 2. The default value is 0 - allow IP0 is used for ARP request.

arp_announce 理解的一点补充 (中文)

假设一台 Linux 主机 X 有三个网络接口,分别是 eth0、eth1 和 eth2。每个接口都有一个 IP 地址,分别为 IP0、IP1 和 IP2。当本地的一个应用程序试图通过 eth2 接口发送一个源 IP 地址为 IP0 的 IP 数据包时,不巧的是,目标节点的 MAC 地址尚未解析出来。这时,Linux 主机 X 将会发送 ARP(地址解析协议)请求,以获取目标(或网关)的 MAC 地址。

在这种情况下,“ARP 请求消息” 的 IP 源地址会是哪个呢?是 IP0(即正在传输的 IP 数据包的源 IP 地址),还是 IP2(也就是向外发送该 ARP 请求的那个接口对应的 IP 地址)呢?直到现在(实际上就在 3 小时前还是如此),ARP 请求通常使用分配给向外发送接口的 IP 地址(就像上述例子中的 IP2)。然而,Linux 系统的实际行为稍有不同,实际上,ARP 请求中源地址的选择是完全可以通过 proc 变量 “arp_announce” 来进行配置的。

如果我们希望在 ARP 请求中使用 IP2 而不是 IP0 作为源 IP 地址,那么就应该将 “arp_announce” 的值修改为 1 或 2。其默认值是 0,也就是允许使用 IP0 作为 ARP 请求中的源 IP 地址。

其实就是路由器的问题,因为路由器一般是动态学习 ARP 包的(通常在动态配置 DHCP 的情况下),当内网的机器要发送一个到外部的 IP 包时,就会请求路由器的 Mac 地址,发送一个 ARP 请求,这个 ARP 请求中包含了自身的 IP 地址和 Mac 地址,而 Linux 默认是使用 IP 的源 IP 地址作为 ARP 请求里的源 IP 地址,并非使用发送设备自身的地址。在 LVS 这样的架构下,所有发送包都是同一个 VIP 地址,那么 ARP 请求就会包含 VIP 地址和设备 Mac 地址,路由器收到这个 ARP 请求后就会更新自己的 ARP 缓存,这样就会造成 IP 欺骗,VIP 地址可能被抢夺,从而出现问题。

关于 ARP 缓存更新的情况,其目的是减少 ARP 请求的次数。当主机接收到询问自己的 ARP 请求时,会把源 IP 和源 Mac 放入自己的 ARP 表中,方便后续通讯。如果收到的不是询问自己的包(因为 ARP 是广播的,所有设备都会收到),就会丢弃该包,这样可以避免 ARP 表中无用数据过多,导致有用记录被删除。

在设置参数时,将 arp_ignore 设置为 1 意味着,当有其他设备发送 ARP 请求过来时,如果接收请求的设备上没有对应的 IP 地址,就不会做出响应,默认值是 0,即只要这台机器上任何一个设备有这个 IP 地址,就会响应 ARP 请求,并发送 Mac 地址。

五、其它的相关资料

http://kb.linuxvirtualserver.org/wiki/Using_arp_announce/arp_ignore_to_disable_ARP
http://itnihao.blog.51cto.com/1741976/752472


  • 使用 LVS 实现负载均衡原理及安装配置详解 - 肖邦 linux - 博客园 posted on 2017-02-12 14:35 肖邦 linux
    https://www.cnblogs.com/liwei0526vip/p/6370103.html

  • LVS 负载均衡_lvs+lo:0-CSDN 博客 笨小孩 @GF 知行合一于 2020-02-22 10:42:05 发布
    https://blog.csdn.net/gaofei0428/article/details/104438533

  • LVS 负载均衡超详细入门介绍 - CSDN 博客 杜北先森 已于 2024-05-14 16:36:32 修改
    https://blog.csdn.net/qq_58461022/article/details/138857962

  • LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义 - haifeng0730 - 博客园 2012-10-16 16:43 haifeng0730
    https://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497933.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 快速搭建 GBase 8s数据库服务

1.查看Gbase 8s镜像版本 可以去到docker hub网站搜索&#xff1a;gbase8s liaosnet/gbase8s如果无法访问到该网站&#xff0c;可以通过docker search搜索 docker search gbase8s2.拉取Gbase 8s镜像 以下演示的版本是目前官网最新版本Gbase8sV8.8_3.5.1 docker pull liaosn…

使用Lodash工具库的orderby和sortby进行排序的区别

简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序&#xff0c;并为每个属性指定排序方向&#xff08;升序或降序&#xff09;。默认所有值为升序排&#xff0c;指定为"desc" 降序&#xff0c…

uniapp中Nvue白屏问题 ReferenceError: require is not defined

uniapp控制台输出如下 exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught ReferenceError: require is not defined 或者 exception function:createInstanceContext, exception:white s…

STM32-笔记16-定时器中断点灯

一、实验目的 使用定时器 2 进行中断点灯&#xff0c;500ms LED 灯翻转一次。 二&#xff0c;定时器溢出时间计算 Tout&#xff1a;定时器溢出时间 Ft&#xff1a;定时器的时钟源频率 ARR&#xff1a;自动重装载寄存器的值&#xff08;可设置ARR从0开始&#xff0c;但是计数到…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

【数据结构】数据结构整体大纲

数据结构用来干什么的&#xff1f;很简单&#xff0c;存数据用的。 &#xff08;这篇文章仅介绍数据结构的大纲&#xff0c;详细讲解放在后面的每一个章节中&#xff0c;逐个击破&#xff09; 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢&#xff…

开放世界目标检测 Grounding DINO

开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器&#xff0c;它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术&#xff0c;实现了可以根据人类输入&#xff08;如类别名称或指代表达&#xff09;检测任意对象的功…

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…

RK3566和Robo_C的EMC防护设计细节

USB部分的防护细节&#xff1a; ROBO C的USB接口&#xff1a; PF级别的电容滤波&#xff1a; TVS电容&#xff08;TVS Capacitor&#xff09;&#xff1a;用于与TVS二极管配合&#xff0c;保护电路免受瞬态电压冲击。电容一般较小&#xff0c;通常为几十皮法&#xff08;pF&am…

如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈

如果你的网站是h5网站&#xff0c;如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈 h5如何转小程序 如果当年你们开发网站是用的h5但是没有开发小程序&#xff0c;也没有使用uniapp这样的混开框架&#xff0c;但是目前根据业务需…

30天面试打卡计划 2024-12-25 26 27 面试题

2024-12-25 面试题 后端 MySQL三层B树能存多少数据&#xff1f; B 树&#xff1a;一种特殊的多路平衡查找树&#xff0c;广泛应用于数据库索引中。它具有所有叶子节点都位于同一层且包含指向相邻叶子节点指针的特点&#xff0c;这使得范围查询更加高效。InnoDB&#xff1a;My…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

阿里云redis内存优化——PCP数据清理

在阿里云安装了一个redis节点&#xff0c;今天使用时忽然想着点击了一下分析内存。好家伙&#xff0c;居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊&#xff0c;怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度&#xff0c;研究了下这个问题的来源。网上…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度&#xff08;最好&#xff09;时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;平均&#xff09;辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录&#xff0c;需借助插件才行&#xff0c;常见的插件如果git history只能查看某页面的改动记录&#xff0c;无法查看某分支的整体提交记录&#xff0c;我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…

学习solid works第八课------工程图

一、新建工程图 工程图创建不像零件和装配体一样直接点击新建&#xff0c;工程图跟零件的关联在一起的&#xff0c;我们需要需要先打开零件&#xff0c;在零件中建立对应的工程图。 1. 打开需要做工程图的零件&#xff08;以一颗螺丝为例子&#xff09;。 2. 在文件下拉菜单中…

Python 爬虫

一、创建项目 1.双击打开pycharm&#xff0c;点击新建项目 2.项目设置- 勾选[继承全局站点软件包]- 勾选[可用于所有项目]- 取消勾选[创建main.py欢迎脚本]- 点击创建 3.项目名称右键--新建--python文件 4.输入文件名--回车二、编辑代码 # 导入请求模块 import requests # 如…

Azure Function 解决跨域问题

这边前端call本地部署的azure function出现了跨域问题&#xff0c;搜索一下解决方案 直接修改local.setting.json&#xff0c;在其中添加CORS配置为通配符”*”&#xff0c;就行了 local.settings.json {"IsEncrypted": false,"Values": {"PYTHON_E…