LVS架构有什么难的哦,一篇带你深入浅出了解一下LVS

目录

概念性内容

引言

LVS简介

LVS概念

LVS模式

nat模式

dr模式

Tunnel模式

Fullnat模式

LVS的实现

nat模式​编辑

Client配置

LVS配置

WebServer1配置

WebServer2配置

实验测试

dr模式

Client配置

Router

LVS

Webserver2

 WebServer2

 实验测试

​编辑

LVS的调度算法

静态算法

动态算法

LVS部署

LVS软件相关文件

ipvsadm集群相关管理命令

ipvsadm集群服务RS的管理

写在最后

防火墙标记解决轮询调度问题

LVS持久连接

最后的最后


概念性内容

引言

        众所周知:这个世界上有聪明的人,比如霍金,也有笨的人,比如我自个,那我和霍金的区别在哪呢,大概就是,我同时只能接受一个人的询问,并作出有效回答;而霍金同时能接受十个人的询问并作出有效回答。

        那么我们现在来假设一个场景,同时有五百个记者举着话筒来询问 

        这个无论是我还是霍金都应付不来,那怎么样才可以解决这个呢,我们可以找50个霍金(500个我)来平均把这500个记者一分,就正正好好解决这个问题,而50个霍金(500个我)所组成的就是集群,我们为了解决这500个记者同时来询问的访问压力就组建了集群;

        那么怎么把500个记者平均的分给50个霍金呢,我们在500个记者和50个霍金之间需要一个调度者,这个调度者当接受到500个记者的询问之后,根据一定的算法,将500个记者平均分给50个霍金;当霍金们完成了回答之后,就将问题的答案给到调度者,调度者把接受到的答案再给到记者;

        现在我们将上述内容类比到服务器,服务器的性能有好有坏,对应这我们人的智商有好有坏,当无限的访问(500个记者)打到服务器上时,无论服务器的性能有多好,都是不足以支持的,所以我们把多台服务器组建成一个集群来支持这无限的访问。为了把访问引导到性能不同的服务器上,我们需要一个LVS(调度者)来根据不同的算法来引导

LVS简介

Linux Virtual Server,负载调度器

LVS相关术语:VS(Virtual Server):负责负载调度

                         RS(Real Server):负责真正提供服务

LVS概念

  • VS:Virtual Server
  • RS:Real Server
  • CIP:client IP
  • VIP:Virtual IP (外网的IP)
  • DIP:Directory IP (内网的IP)
  • RIP:Real Server IP
  • 访问流程:CIP >> VIP --- DIP >> RIP

LVS模式

LVS一共有四种模式:nat模式、dr模式、tunnel模式、fullnat模式

nat模式

基于三层网络层和四层传输层,玩的是IP地址转换和端口转换

LVS的NAT模式所有的数据报文都需要经过LVS的调度机,所以LVS调度机容易崩掉

  1. 当客户机去访问时,访问会打到调度器的外网IP上(VIP)
  2. 访问打到VIP之后会转发到内网IP中(DIP),在VS这里可以做DNAT做目标地址和端口的修改,将目标IP从VIP修改为服务器真实的IP(RIP1),将端口转换为服务真实的端口
  3. 然后请求到真实服务器(RIP1),RS1响应请求,发送响应数据包,响应数据报文头如上图
  4. 当VS接收到响应报文之后,修改响应报文头,如上图
  5. VS把修改好后的响应报文转发给客户机Client

dr模式

基于二层数据链路层,玩的是MAC地址转发,优化了nat模式,RS的响应报文可以直接转发给客户机而不需要通过LSV调度机,减轻了LVS调度机的压力,但是不能跨网络传输

  1. 客户端发送数据帧通过外网路由到内网路由给vs调度主机,帧中内容为客户端CIP地址+客户端的MAC地址+VIP地址+VIPMAC地址
  2. VS 调度主机接收到数据帧后把帧中的 VIP MAC地址 该为 RS MAC地址 ,此时帧中的数据为客户端C IP+客户端的MAC地址+VIP+RS的 MAC地址
  3. RS得到数据帧的数据包做出响应回传数据包,数据包中的内容为VIP+RS MAC+ 客户端C IP+ 客户端 的 MAC地址
    注:在RS上修改内核参数以限制arp通告及应答级别;不支持端口映射;

Tunnel模式

基于三层网络层,玩的是在数据报的IP头前再封装一层IP头部,流程于dr模式大概一致,相比于dr模式的优化为由于多封装了一层IP头部,所以可以跨网络

  1. 客户端发送请求数据包,包含CIP、VIP和端口
  2. 到VS后,给请求数据包IP头前在封装一层IP,新添加的IP中包含DIP和RIP,然后通过路由转发出去
  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含VIP、CIP和端口

注:同dr模式一样,Director和RS上需要配置一致的VIP;DIP、VIP、RIP都应是公网IP;不支持端口映射;RS的操作系统必须支持隧道功能

Fullnat模式

基于三层网络层和四层传输层实现,玩的是IP地址转换和端口转换,是nat模式的强化型

LVS的实现

实现前的补充,因环境需要多次配置网卡,所以写了一个脚本/usr/local/bin/vmset.sh,此内容跟本文关系不大,所以不在详述,如感兴趣,可私我,内容如下

#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1

[ipv4]
address1=$2/24,192.168.220.2
method=manual
dns=114.114.114.114;
EOF

chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1

hostnamectl hostname $3

cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$2  $3
EOF

nat模式

实验环境

主机名IPVIP角色
client nat:192.168.220.200null测试机
lvs仅主机:172.16.254.100  192.168.220.100调度机
server1172.16.254.10 GW:172.16.254.100nullRS1
server2172.16.254.20 GW: 172.16.254.100nullRS2

Client配置

#配置网卡eth0
vmset.sh eth0 192.168.220.200 client
nmcli connection reload
nmcli connection up eth0

配置效果如下 

LVS配置

#配置网卡LVS中有两个网卡,eth0是VIP的网卡,eth1是DIP的网卡,两块网卡属于不同Vlan
#设置eth0的IP(VIP)
vmset.sh eth0 192.168.220.100 lvs
#设置eth1的IP(DIP)
vmset.sh eth1 172.16.254.100 lvs

#DIP不需要网关,要删除DIP中的网关,DNS可删可不删
vim /etc/NetworkManager/system-connections/eth1.nmconnection
cat /etc/NetworkManager/system-connections/eth1.nmconnection #修改后的内容如下
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=172.16.254.100/24
method=manual

#下载并配置LVS
yum install ipvsadm -y
ipvsadm -A -t 192.168.220.100:80 -s rr
ipvsadm -a -t 192.168.220.100:80 -r 172.16.254.10:80 -m
ipvsadm -a -t 192.168.220.100:80 -r 172.16.254.20:80 -m
ipvsadm -Ln

#在VS中启用内核路由功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

#注ipvsadm下载后重新启动不了,需要加上创建一个文件之后才可以重启ipvsadm服务,下面是根据重定向创建的一个文件,不懂的同学可以记一下,论文件的创建方式!
> /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service

配置效果如下

WebServer1配置

#配置网卡
vmset.sh eth0 172.16.254.10 Webserver1

#修改网卡配置文件,将网关改成DIP
vim /etc/NetworkManager/system-connections/eth0.nmconnection
cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.16.254.10/24,172.16.254.100
method=manual

#配置Web服务验证LVS负载效果
yum install httpd -y
echo "Webserver1-172.16.254.10_test" >> /var/www/html/index.html
systemctl enable --now httpd

#验证web配置成功
curl localhost

配置成果如下 

WebServer2配置

#配置网卡
vmset.sh eth0 172.16.254.20 Webserver2

#修改网卡配置文件,将网关改成DIP
vim /etc/NetworkManager/system-connections/eth0.nmconnection
cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.16.254.20/24,172.16.254.100
method=manual

#配置Web服务验证LVS负载效果
yum install httpd -y
echo "Webserver2-172.16.254.20_test" >> /var/www/html/index.html
systemctl enable --now httpd

#验证web配置成功
curl localhost

配置成果如下

实验测试

在client上测试,测试效果如下

dr模式

实验环境

主机名ipVIP角色
clientnat:192.168.220.200 GW:192.168.220.100null测试机
routernat:192.168.220.100 仅主机:172.16.254.100null路由器
lvs仅主机:172.16.254.50 GW:172.16.254.100172.16.254.200调度机
server1仅主机:172.16.254.10 GW:172.16.254.100172.16.254.200RS1
server2仅主机:172.16.254.20 GW:172.16.254.100172.16.254.200

RS2

注:这里因内存支持不起来同时跑这么多虚拟机,将client和外部路由和二为一,client的网关要指向内部路由,真实环境的话,客户机不需要有任何配置,router是内部路由;

Client配置

#配置网卡
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.220.200/24,192.168.220.100  #网关指向内部路由router
method=manual
dns=114.114.114.114;
#配置完成后退出
:x

#重新加载网卡配置
nmcli c reload
nmcli c u eth0

#检查路由
route -n #如下即可
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.220.100 0.0.0.0         UG    100    0        0 eth0
192.168.220.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

Router

注:路由器需要两个网卡,且两个网卡皆不需要配置网关和DNS,路由器不需要这些 

#配置网卡eth0,eth1
#nat
vmset.sh eth0 192.168.220.100 Router
#仅主机
vmset.sh eth1 172.16.254.100 Router

#修改仅主机网卡eth0的内容
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.220.100/24
method=manual
:x

#修改仅主机网卡eth1的内容
vim /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=172.16.254.100/24
method=manual
:x

#重载两块网卡
nmcli c reload
nmcli c up eth0
nmcli c up eth1

#打开内核路由转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

#想验证的同学可以看一下
route -n
#呈现的结果配过路由器的同学应该会很熟悉

LVS

#配置仅主机网卡eth1
vmset.sh eth1 172.16.254.50 LVS

#修改网卡eth1的配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=172.16.254.50/24,172.16.254.100
method=manual
:x

#重置eth1网卡
nmcli c reload
nmcli c up eth1

#配置VIP,把VIP加入到回环上
ip addr add 172.16.254.200 dev lo

#检查路由
route -n #如下即可
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.254.100  0.0.0.0         UG    100    0        0 eth1
172.16.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth1

Webserver2

#配置网卡
vmset.sh eth0 172.16.254.10 Webserver
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
vim /etc/NetworkManager/system-connections/eth0.nmconnectionaddress1=172.16.254.10/24,172.16.254.100
method=manual
:x
nmcli c reload
nmcli c u eth0
#设置VIP
ip addr add 172.16.254.200 dev lo

#禁用ARP
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

#检查路由
route -n #如下即可
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.254.100  0.0.0.0         UG    100    0        0 eth0
172.16.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

 WebServer2

#修改网卡
vmset.sh eth0 172.16.254.20 Webserver2
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
vim /etc/NetworkManager/system-connections/eth0.nmconnectionaddress1=172.16.254.20/24,172.16.254.100
method=manual
:x
nmcli c reload
nmcli c u eth0
#设置VIP
ip addr add 172.16.254.200 dev lo

#禁用ARP
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

#检查路由
route -n #如下即可
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.254.100  0.0.0.0         UG    100    0        0 eth0
172.16.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

 实验测试

LVS的调度算法

关于LVS调度算法的个人理解:不管集群内RS死活的算法称为静态算法,根据集群内RS性能合理分配流量的算法称为动态算法

静态算法

  1. RR:roundrobin轮询,就是不管RS的性能是高是低,RS是否down机,都是你一个我一个的算法

  2. WRR:对RR算法的一个优化,可以根据RS的性能设置权重,性能高的,多接几次活,性能低的,少接几次活

  3. SH:源地址hash算法,解决会话保持问题,来自同一个IP的地址将会被始终发往同一个RS,有一个问题,一个公司若是只有一个公网IP,则这个公司的所有访问都将打向同一个RS,这会导致调度失衡,所以这个算法挺鸡肋的

  4. DH:目标地址hash算法,第一次轮询调度至一个RS,后续将发往同一个目标的请求始终转发至第一次挑中的RS,典型的应用场景是正向代理缓存场景中的负载均衡

动态算法

Overhead=负载值

activeconns=活动链接数

inactiveconns=非活动链接数

  1. LC(Least Connections):最少链接算法   
    Overhead=activeconns×256+inactiveconns
    流量打向Overhead最小的RS(没有考虑RS的性能优劣问题,相似于静态算法RR)   
  2. WLC(Weighted Least Connections):权重最小链接算法
    Overhead=(activeconns×256+inactiveconns)÷ weight
    流量打向Overhead最小的RS
  3. SED(Shortest Expection Delay):最短预期延迟算法
    Overhead=(activeconns+1+inactiveconns)×256/weight
    该算法有一点缺陷,如下图

    在开始阶段,权重10的RS1会接连承接十个访问,但是RS2一点事没有,直到接到第11个访问时,RS2才开始工作,为了优化这个问题就产生了NQ算法
  4. NQ(Never Queue):永不排队算法
    个人理解:先RR一轮,然后开始SED
  5. LBLC(Locality-Based LC):局部最少链接算法,动态的DH算法
    根据目的IP进行hash,当有大量访问去访问一个相同的资源,为了提高效率我们会把这个资源缓存到正向代理服务器上,这样既能提高访问效率,也能减轻访问压力;
    使用场景:正向代理下的负载均衡场景,如下
  6. LBLCR(LBLC with Replication):
    带复制功能的 LBLC ,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
    若资源仅在RS正向代理服务器1上,导致正向代理服务器1的负载特别重,可以把资源复制到RS正向代理服务器2上,这样PC访问该资源,也可以到正向代理服务器2
  7. FO(Weighted Fai Over):加权故障转移算法
    遍历虚拟服务所关联的真实服务器链表,找到还未过载 ( 未设置 IP_VS_DEST_F OVERLOAD标志 ) 的且权重最高的真实服务器,进行调度
    场景举例:例如,在灰度发布新版本的初期,可能为新版本的服务器设置较低的权重。如果这些服务器出现问题,加权故障转移算法可以根据权重和服务器的实际状态,将请求更多地导向旧版本中稳定且权重较高的服务器,以确保服务的连续性和稳定性,同时也能在一定程度上控制风险。
  8. OVF( Overflow-connection):过载连接算法
    基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值
    例如,三台服务器A、B、C权重分别为10、5、3,且都未设置IP_VS_DEST_F OVERLOAD标记,那么只有当服务器A的连接数达到10之后,才会把之后的连接打到服务器B,当服务器B的连接数达到5,才会把之后的连接打向服务器C;若在访问打向服务器B的过程中,服务器A的连接数小于10了,那么流量就会转为打向服务器A

LVS部署

LVS软件相关文件

  • 软件名:ipvsadm
  • /etc/sysconfig/ipvsadm-config                #配置文件
  • /etc/sysconfig/ipvsadm                           #ipvsadm配置保存的文件,需要自己创建
  • /usr/sbin/ipvsadm                                   #主程序

ipvsadm集群相关管理命令

添加:ipvsadm -A(add) -t(tcp) IP:Port -s 调度算法
修改:ipvsadm -E(Edit) -u(utp) IP:Port -s 调度算法
修改:ipvsadm -E(Edit) -f(iptable mask) IP:Port -s 调度算法
删除:ipvsadm -C
重载:ipvsadm -R
查看:ipvsadm -Ln
保存:ipvsadm-save [-n]是否域名解析,-n不解析

ipvsadm集群服务RS的管理

添加:ipvsadm -a -t|u|f IP:Port -r RIP:Port  [-g(直连) | -i(Tunnel)| -m(nat)]  [-w n(权重)]
修改:ipvsadm -e -t|u|f IP:Port -r RIP:Port  [-g(直连) | -i(Tunnel)| -m(nat)]  [-w n(权重)]
删除: ipvsadm -d -t|u|f service-address -r server-address

写在最后

防火墙标记解决轮询调度问题

模板 iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $portl,$port2,..-i MARK --set-mark NUMBER
实例: iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports  80,443 -j MARK --set-mark 666
使用此标记:
        ipvsadm -A -f 666 -s rr
        ipvsadm -a -f 666 -r 192.168.0.101 -g
         ipvsadm -a -f 666 -r 192.168.0.102 -g

LVS持久连接

LVS解决持久连接的问题,sh调度算法容易导致负载失衡

所以这里使用[-p second] 选项来解决持久连接的问题

ipvsadm -A -f 666 -s rr -p 360

最后的最后

        如果你看到了这里,恭喜你,你可以白嫖网卡配置脚本了

#!/bin/bash
#在修改之前,先把之前存在的给删掉
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection

#修改网卡文件配置
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1

[ipv4]
address1=$2/24,192.168.220.2
method=manual
dns=114.114.114.114;
EOF

#设定网卡文件权限,并重置网卡
chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1

#设定主机名称
hostnamectl hostname $3

#将主机名写入本机域名解析文件
cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$2	$3
EOF
        
  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值