lvs实践

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
    本人环境,
  1. manjaro 192.168.1.104
  2. ubuntu arm64 192.168.1.101
  3. 给出我实际的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

介绍

  1. 负载均衡能力的提供,nginx,k8s,nacos.etc是常见的中间件,了解到硬件也可以做,本文不讨论
  2. ngix拥有极高的性能,但是lvs作为application直接运行在linux kernel,
  3. 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

  1. http之上,针对domain,url做load balance
  2. 基于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节点

转发机制

三种工作模式:

  1. NAT(Network Address Translation)模式

    • 在 NAT 模式下,LVS 作为网络地址转换设备,接收来自客户端的请求,然后转发给后端的真实服务器。响应则由后端服务器发送回 LVS,再由 LVS 转发给客户端。
    • 优点:易于实现,无需更改后端服务器配置。
    • 缺点:由于所有的响应都需要经过 LVS,可能导致 LVS 成为瓶颈
  2. TUN(IP Tunneling)模式

    • 在 TUN 模式下,LVS 将请求封装成 IP 包,通过隧道传输到后端服务器。后端服务器解封装请求,处理后直接响应客户端
    • 优点:响应速度快,因为后端服务器可以直接回应客户端
    • 缺点:需要在客户端和后端服务器之间建立隧道连接
  3. 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 的工作过程主要包括以下几个步骤:

  1. ARP 请求
    当主机 A 需要向主机 B 发送数据时,如果主机 A 的 ARP 缓存中没有主机 B 的 MAC 地址,那么主机 A 会发送一个广播请求(ARP 请求),询问网络中的所有设备哪个设备拥有目标 IP 地址的 MAC 地址。ARP 请求包含以下信息:

    • 目标 IP 地址
    • 发送者的 MAC 地址
    • 发送者的 IP 地址
  2. ARP 回应
    当主机 B 收到 ARP 请求后,如果它的 IP 地址与请求中的目标 IP 地址匹配,那么主机 B 会发送一个单播回应(ARP 回应),告诉请求方自己的 MAC 地址。ARP 回应包含以下信息:

    • 请求者的 MAC 地址
    • 请求者的 IP 地址
    • 发送者的 MAC 地址
    • 发送者的 IP 地址
  3. 更新 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为动态调度算法)

  1. 轮询(round robin, rr)

  2. 加权轮询(Weighted round robin, wrr)——

  3. 目标地址散列调度(Destination Hashing,dh)

针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先 根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空,

  1. 源地址散列调度(Source Hashing,sh)

简单理解就是nginx的ip-hash

  1. 最少连接(least connected, lc), 加权最少连接(weighted least connection, wlc)——

新的连接请求将被分配至当前连接数最少的RealServer;动态调度,通过服务器当前所活跃的连接数来估计服务器的负载情况.调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一

  1. 基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,lblc)——

针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器

  1. 带复制的基于局部性最少链接调度(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地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

  1. 最短的期望的延迟(Shortest Expected Delay Scheduling ,sed)

sed: (A+1)/w=当前连接数

  1. 最少队列调度(Never Queue Scheduling ,nq)

无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算

操作

首先装ipvsadm软件,yay的话sudo pacman -S ipvsadm

ipvsadm -h运行的话可以看到command,这里简单解释下

  1. 操作虚拟服务
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  1. 操作realserver
--add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server 
  1. 配置操作
--list            -L|-l     list the table
--clear           -C        clear the whole table
--restore         -R        restore rules from stdin
--save            -S        save rules to stdout
  1. 配置选项
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
  1. 调度方式
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
  --pe            engine              alternate persistence engine may be sip,
  1. session保持,保证客户端都发到同一个server上。-p指定多长时间。不指定时间,默认300秒
  --persistent   -p [timeout]         persistent service     
  1. 掩码,不同ip地址和掩码与得到的网络地址,启用一个网络地址,对应一个realserver
  --netmask      -M netmask           persistent granularity mask
  --real-server  -r server-address    server-address is host (and port)
  1. 转发模式
  --gatewaying   -g                   gatewaying (direct routing) (default)
  --ipip         -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)
  1. 负载的比例,默认值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

  1. blog1
  2. blog2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lamooo19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值