lvs
本文实验先行,后续存在原理(lvs,arp.etc)
实验
- 用DR转发,前提:LVS服务器必须要有两张网卡,一张网卡用来模拟外网(仅主机),一张网卡连接内网(NAT),LVS服务器的作用就是以仅主机网卡,通信NAT网卡进入内网,而web服务器只需要内网网卡(NAT)
- echo 1 > /proc/sys/net/ipv4/ip_forward #启动路由功能 Linux接收到一个不是自己的包的时候,设备默认是丢弃的
vip
这里重点说下这个虚拟ip vip,很多blog上只是单纯的提出,跟着配置完不一定能成功
- 对外暴露,举个例子,假设本机ip192.168.1.100但是你的vip是192.168.1.101,如果client去访问vip,是不可能成功的,所以vip必须和实际的公网ip相同
- 不对外暴露,看过不少lvs的文章的话,就会对上面的结论质疑,别的blog的本机ip和vip都是不同的,但是不同的话,足够做实验了
总结下原理:
之所以vip和ip不同,是不需要对外提供服务,我自己尝试过iptables绑定一个路由转发,但是流量过不去,由于水平有限,未解决,
可是lvs就是对外提供服务的,是因为这些blog的实验就未尝试别的client访问,所以你在lvs这个机器上curl是可以成功的,但是可以试下在
局域网里发请求,找不到的,我之前用移动设备请求vip,理论上不成功,但是由于ARP还是成功了,一段时间后失效,不要认为这个是配置成功了
注意,有些blog的环境是单机,所以ip route add dev lo:0 192.168.xx.xx,网卡直接选择lo了,这里要根据自己的实际情况配置,
我的环境是两个设备,那么如果我的lvs配置成lo,那怎么可能转发到real server,所以这里要根据自身选择,lo enoX,ethX .etc
如果环境可以对外,那就把vip配置外网的ip
本人环境,
- manjaro 192.168.1.104
- ubuntu arm64 192.168.1.101
- 给出我实际的lvs配置和real server配置,直接执行bash
接下来的配置是本人实验环境,自行配置前一定要了解其原理,按需配置,否则大概率是实验不成功的
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.1.13
rs1=192.168.1.102
#添加vip网卡之eth0:0
sudo ip route add $vip dev eno2:0
sudo ip link set dev eno2:0 up
ipvsadm -C
ipvsadm -A -t $vip:80 -s rr
ipvsadm -a -t $vip:80 -r $rs1 -g
#关闭VIP 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
vip=192.168.1.13
#添加lo:1
ifconfig lo:1 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:1
#关闭VIP 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
[yutak paul]# ipvsadm -A -t 192.168.1.100:9001 -s rr
-A 添加
-t ip地址 虚拟地址和端口
-s 负载均衡模式 rr(轮询模式)
# 这里自行选择,本人也不是这么配的
[yutak paul]# ipvsadm -E -t 192.168.1.100:9001 -s wlc
[yutak ipv4]# ipvsadm -a -t 192.168.1.100:9001 -r 192.168.1.104:9002 -m
[yutak ipv4]# ipvsadm -a -t 192.168.1.100:9001 -r 192.168.1.104:9003 -m
echo 1 > /proc/sys/net/ipv4/ip_forward #开启服务器路由转发
-a 添加一个realserver
-t 支持tcp
-r 代表一个realserver的ip:port
-m 代表通过nat协议转发
抑制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
realserver的一个http服务:
package main
import (
"fmt"
"net/http"
)
func main(){
http.HandleFunc("/",test)
http.ListenAndServe(":80",nil)
}
func test(w http.ResponseWriter, r *http.Request){
if r.Method != "GET" {
http.Error(w,"no support",http.StatusMethodNotAllowed)
return
}
fmt.Fprintf(w,"hello world")
}
测试
[yutak paul]# curl 192.168.1.13
hello world
使用wireshark抓包
因为是director发送的请求,所以存在http response
介绍
- 负载均衡能力的提供,nginx,k8s,nacos.etc是常见的中间件,了解到硬件也可以做,本文不讨论
- ngix拥有极高的性能,但是lvs作为
application
直接运行在linux kernel, - lvs,即linux virtual server,基于传输层的负载均衡器,24年的现在,linux kernel基本上都内置了此mod
功能特性
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,减少人为出错的几率
3、工作稳定,自身有完整的双机热备方案
4、无流量,保证均衡器IO的性能不会收到大流量的影响
5、应用范围比较广,可以对所有应用做负载均衡
高可用性
LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
高可靠性
LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等
对比
nginx
- http之上,针对domain,url做load balance
- 基于lua的openrestry在cdn业务,或者业务增强很出色
lvs
基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s
原理
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP.访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点
转发机制
三种工作模式:
-
NAT(Network Address Translation)模式:
- 在 NAT 模式下,LVS 作为网络地址转换设备,接收来自客户端的请求,然后转发给后端的真实服务器。响应则由后端服务器发送回 LVS,再由 LVS 转发给客户端。
- 优点:易于实现,无需更改后端服务器配置。
- 缺点:由于所有的响应都需要经过 LVS,可能导致 LVS 成为瓶颈
-
TUN(IP Tunneling)模式:
- 在 TUN 模式下,LVS 将请求封装成 IP 包,通过隧道传输到后端服务器。后端服务器解封装请求,处理后直接响应客户端
- 优点:响应速度快,因为后端服务器可以直接回应客户端
- 缺点:需要在客户端和后端服务器之间建立隧道连接
-
DR(Direct Routing)模式:
- 在 DR 模式下,LVS 和后端服务器位于同一个物理网络中。LVS 接收到请求后,修改目标 MAC 地址为对应的后端服务器的 MAC 地址,然后将请求直接转发给后端服务器。后端服务器处理请求后直接响应客户端
- 优点:性能最高,因为不需要额外的封装/解封装过程,也不需要经过 LVS
- 缺点:要求 LVS 和后端服务器在同一物理网络内
ARP(Address Resolution Protocol,地址解析协议)是一种网络层协议,用于将一个 IP 地址解析成对应的物理地址(MAC 地址)。ARP 在同一个局域网(LAN)内工作,用于解决在网络层(IP 层)中只知道目标设备的 IP 地址但不知道其 MAC 地址的问题。ARP 是 IPv4 中的一个重要组成部分,在 IPv6 中则使用邻居发现协议(NDP)来实现类似的功能。
ARP
ARP 的主要功能是将 IP 地址转换为 MAC 地址,以便在局域网内发送数据帧。这是因为路由器和交换机等网络设备在局域网内部传输数据时,需要使用 MAC 地址而不是 IP 地址。
ARP 的工作原理
ARP 的工作过程主要包括以下几个步骤:
-
ARP 请求:
当主机 A 需要向主机 B 发送数据时,如果主机 A 的 ARP 缓存中没有主机 B 的 MAC 地址,那么主机 A 会发送一个广播请求(ARP 请求),询问网络中的所有设备哪个设备拥有目标 IP 地址的 MAC 地址。ARP 请求包含以下信息:- 目标 IP 地址
- 发送者的 MAC 地址
- 发送者的 IP 地址
-
ARP 回应:
当主机 B 收到 ARP 请求后,如果它的 IP 地址与请求中的目标 IP 地址匹配,那么主机 B 会发送一个单播回应(ARP 回应),告诉请求方自己的 MAC 地址。ARP 回应包含以下信息:- 请求者的 MAC 地址
- 请求者的 IP 地址
- 发送者的 MAC 地址
- 发送者的 IP 地址
-
更新 ARP 缓存:
当主机 A 收到 ARP 回应后,它会在自己的 ARP 缓存中记录下主机 B 的 IP 地址和对应的 MAC 地址,以便后续直接发送数据帧而不需要再次广播。
ARP 缓存
ARP 缓存是一个存储 IP 地址和 MAC 地址对应关系的临时表。每当成功解析一个 IP 地址的 MAC 地址后,ARP 缓存就会记录这一对映射关系。ARP 缓存中的条目具有一定的生存时间(TTL),如果在这段时间内没有再次使用该映射,则该条目会被删除。
调度算法
Director在接收到来自于Client的请求时,会基于"schedule"从RealServer中选择一个响应给Client。ipvs支持以下调度算法:(1、2为静态调度算法,3、4、5、6、7、8为动态调度算法)
-
轮询(round robin, rr)
-
加权轮询(Weighted round robin, wrr)——
-
目标地址散列调度(Destination Hashing,dh)
针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先 根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空,
- 源地址散列调度(Source Hashing,sh)
简单理解就是nginx的ip-hash
- 最少连接(least connected, lc), 加权最少连接(weighted least connection, wlc)——
新的连接请求将被分配至当前连接数最少的RealServer;动态调度,通过服务器当前所活跃的连接数来估计服务器的负载情况.调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一
- 基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,lblc)——
针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器
- 带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,lblcr)
——也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器
这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率
LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度
- 最短的期望的延迟(Shortest Expected Delay Scheduling ,sed)
sed: (A+1)/w=当前连接数
- 最少队列调度(Never Queue Scheduling ,nq)
无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算
操作
首先装ipvsadm
软件,yay的话sudo pacman -S ipvsadm
ipvsadm -h运行的话可以看到command,这里简单解释下
- 操作虚拟服务
--add-service -A add virtual service with options
--edit-service -E edit virtual service with options
--delete-service -D delete virtual service
- 操作realserver
--add-server -a add real server with options
--edit-server -e edit real server with options
--delete-server -d delete real server
- 配置操作
--list -L|-l list the table
--clear -C clear the whole table
--restore -R restore rules from stdin
--save -S save rules to stdout
- 配置选项
Options:
--tcp-service -t service-address service-address is host[:port]
--udp-service -u service-address service-address is host[:port]
--fwmark-service -f fwmark fwmark is an integer greater than zero
--ipv6 -6 fwmark entry uses IPv6
- 调度方式
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
--pe engine alternate persistence engine may be sip,
- session保持,保证客户端都发到同一个server上。-p指定多长时间。不指定时间,默认300秒
--persistent -p [timeout] persistent service
- 掩码,不同ip地址和掩码与得到的网络地址,启用一个网络地址,对应一个realserver
--netmask -M netmask persistent granularity mask
--real-server -r server-address server-address is host (and port)
- 转发模式
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
- 负载的比例,默认值1,越大负载越高
--weight -w weight capacity of real server
--u-threshold -x uthreshold upper threshold of connections
--l-threshold -y lthreshold lower threshold of connections
总结
水平有限,很多理解都有问题,之后在改todo
我学习时的blog