赞
踩
LVS:Linux Virtual Server,负载调度器,由章文嵩博士主导的开源负载均衡项目, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS 的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
IPVS负载均衡机制有三种,分别是NAT、TUN和DR
NAT模式通过将请求报文中的目标IP地址与目标端口修改,来实现报文的传送具体原理如下
特点
RS应该和DIP应该使用私网地址,且RS的网关要指向DIP;
请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
支持端口映射;
RS可以使用任意OS;
RS的RIP和Director的DIP必须在同一IP网络;
缺陷:对Director Server压力会比较大,请求和响应都需经过director server,director往往会成为系统的性能瓶颈
DR模式通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出来处理i请求的RS的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
特点
必须确保前端路由器将目标IP为VIP的请求报文发往Director:
1)在前端网关做静态绑定;
2)在RS上使用arptables,
3)在RS上修改内核参数以限制arp通告及应答级别;修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
RS跟Director要在同一个物理网络;
请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
缺陷:
RS和DS必须在同一机房中,因为它是由二层进行转发的根据MAC地址来进行匹配。
该模式在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
这种该模式需要RS做些工作
特点
DIP, VIP, RIP可以是公网地址
RS的网关一般不能指向DIP
请求报文要经由Director,但响应不经由Director
不支持端口映射
RS的OS须支持隧道功能
调度算法决定了如何在集群节点之间分布工作负荷,当director调度器收到来自客户端访问VIP的集群服务的入栈请求时,director调度器必须决定那个集群节点应该处理请求。
Director调度器用的调度方法分类:
固定调度算法:rr,wrr,dh,sh…
动态调度算法:wlc,lc,lblc,lblcr
算法名称 说明
rr 轮询调度(Round-Robin),将请求一次分配给不同的RS,也就是均摊,适用于处理真是服务器性能相差不大的情况
wrr 加权轮询调度(Weighted Round-Robin),根据不同RS的权值分配任务,权值较高的RS将优先获取任务,分配的连接数比权值低的RS更多,相同权值的RS获得相同数目的连接数
dh 目的哈希调度(Destination Hashing),以目的地址为关键词查找一个静态hash表来获得需要的RS
sh 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。
wlc 加权最小连接数调度(weighted leastconnection),会根据连接数和权值的不比值来算,最小比值的真实服务器将会获取下一个链接。
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),基于wlc算法。动态的wlc算法:若ABC三台服务器的权重分别为1,2,3,此时的连接数也是1,2,3。那么基于wlc算法的话,此时新来一个链接会随机给ABC服务器其中的一台;而SED则是动态的算出最小的比值,即A:(1+1)/1; B:(1+2)/2; C:(1+3)/3,此时可以算出C服务器的比值最小,将会将新的连接交给服务器C。
NQ 最小队列调度(Never Queue Scheduling NQ),即按照目前所有服务器的连接数来比较,最小的连接数将会分配下一个链接
算法选择建议
一般的网络服务,如http,mail,mysql等常用的LVS调度算法为
基本轮询调度rr
加权最小连接调度wlc
加权轮询调度wrr
基于地址的最小连接lblc和基于地址带重复最小连接数调度lblcr主要适用于web cache和DB cache
LVS已经集成到了linux内核模块中,LVS环境又分为内核层和用户层,内核层负责内核算法的实现,用户层需要安装ipsadm工具,通过命令将工作模式与实现算法传递给内核。主流的linux发行版默认集成了ipvs,因此只需要安装一个管理工具ipvsadm即可。
ipvsadm 核心功能:集群服务管理:增、删、改 ;集群服务的RS管理:增、删、改; lvs状态查看
安装
如果提示命令不存在则,执行如下命令安装
[root@localhost ~]# ipvsadm
-bash: ipvsadm: command not found
[root@localhost ~]# yum install ipvsadm -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.bfsu.edu.cn
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.bfsu.edu.cn
ipvsadm定义规则格式
# 服务管理 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] -A: 表示添加一个新的集群服务 -E: 编辑一个集群服务 -t: 表示tcp协议 -u: 表示udp协议 -f: 表示firewall-Mark,防火墙标记 service-address: 集群服务的IP地址,即VIP -s 指定调度算法 -p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态 -M 定义掩码 ipvsadm -D -t|u|f service-address 删除一个集群服务 ipvsadm -C 清空所有的规则 ipvsadm -R 重新载入规则 ipvsadm -S [-n] 保存规则 ipvsadm -a|e -t|u|f service-address -r server-address # realsever管理 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] -a 添加一个新的realserver规则 -e 编辑realserver规则 -g 表示定义为LVS-DR模型 -i 表示定义为LVS-TUN模型 -m 表示定义为LVS-NAT模型 -w 定义权重,后面跟具体的权值 # 配置查看 ipvsadm -L|l [options] 常用选项[options]如下: -n: 数字格式显示主机地址和端口 --stats:统计数据 --rate: 速率 --timeout: 显示tcp、tcpfin和udp的会话超时时长 -c: 显示当前的ipvs连接状况 # 清除所有 ipvsadm -C # 清除清除计数 ipvsadm -Z # 保存规则 --手动保存 ipvsadm -S|--save > /etc/sysconfig/ipvsadm ipvsadm -R < /etc/sysconfig/ipvsadm --修改配置文件 # Unload modules on restart and stop # Value: yes|no, default: yes # This option has to be 'yes' to get to a sane state for a ipvs # restart or stop. Only set to 'no' if there are problems unloading ipvs # modules. IPVS_MODULES_UNLOAD="yes" # Save current ipvs rules on stop. # Value: yes|no, default: no # Saves all ipvs rules to /etc/sysconfig/ipvsadm if ipvsadm gets stopped # (e.g. on system shutdown). # 若ipvsadm服务停止,所有的规则将会保存在/etc/sysconfig/ipvsadm文件内 IPVS_SAVE_ON_STOP="yes" # Save current ipvs rules on restart. # Value: yes|no, default: no # Saves all ipvs rules to /etc/sysconfig/ipvsadm if ipvsadm gets # restarted. # 重启时保存当前规则 IPVS_SAVE_ON_RESTART="yes" # Numeric status output # Value: yes|no, default: yes # Print IP addresses and port numbers in numeric format in the status output. IPVS_STATUS_NUMERIC="yes" 此时重启服务,然后设置的规则将会在重启,停止服务时保存,且在正常开启服务时加载。
环境准备
准备三台Vmware虚拟机
192.168.47.15 LVS服务器 配置VIP为 10.238.105.223
192.168.90.11 web 应用1
192.168.90.12 web应用2
网络配置说明
1、三台虚拟机默认网卡采用 NAT 网络模式, 配置固定IP分别为 192.168.90.15 192.168.90.11 192.168.90.12
2、LVS服务器 增加一个网卡设置为桥接模式。桥接模式自动分配IP10.238.105.223 该ip和Vmware宿主机可以互相访问
3、需要特别指出的是 两台web应用的网关必须指定为 LVS服务器的Ip 192.168.90.15 ,否则测试过过程中会发现只有请求包没有相应包。
LVS虚拟机Vmware网卡设置如下
应用服务器网络卡配置详情如下:
---LVS服务器网络配置 TYPE=Ethernet PROXY_METHOD=none ot@localhost network-scripts]# vi ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.47.15 NETMASK=255.255.255.0 GATEWAY=192.168.47.1 #DNS=192.168.47.2 DNS1=8.8.8.4 DNS2=8.8.8.8 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=b2ce2b85-ee42-4a7a-b3f6-e8690d8201bc DEVICE=ens33 ONBOOT=yes ----web 应用服务器网络配置 [root@host11 network-scripts]# cat ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.47.11 NETMASK=255.255.255.0 GATEWAY=192.168.47.15 #DNS=192.168.47.1 #DNS1=10.238.113.254 DNS1=8.8.8.8 DNS2=8.8.8.4 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=b2ce2b85-ee42-4a7a-b3f6-e8690d8201bc DEVICE=ens33 ONBOOT=yes
web服务
这里使用过一个tomcat 提供 https(443端口) 和 http(80端口) 服务,web 应用提供一个接口地址可返回请求详细信息如下,启动两台应用服务器上的服务并做访问测试如下
通过配置工具 ipvsadm 配置负载及规则,配置完成后通过命令可以看到 服务详情
ipvsadm -A -t 10.238.105.223:80 -s rr
ipvsadm -a -t 10.238.105.223:80 -r 192.168.47.11 -m
ipvsadm -a -t 10.238.105.223:80 -r 192.168.47.12 -m
[root@bogon network-scripts]# ipvsadm -Ln --stats --查看负载详情
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.238.105.223:80 13 79 70 9713 13125
-> 192.168.47.11:80 6 38 34 4377 6081
-> 192.168.47.12:80 7 41 36 5336 7044
访问测试
浏览器访问 http://10.238.105.223/testWeb/getCIPInfo 可以负载到后端的 web服务,并且可以看到由于NAT模式在转发的过程中只是修改了目标IP 因此,后端web服务看到的请求者ip 就是宿主机 (请求发起者)的IP地址,这点和Nginx/haproxy不同
多次刷新 发现请求都负载到了 后端的 12服务器上,负载策略我们明明设置的rr 随机啊?
[root@bogon network-scripts]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.238.105.223:80 3 44 42 11354 17484
-> 192.168.47.11:80 1 4 3 172 132
-> 192.168.47.12:80 2 40 39 11182 17352
通过多次请求访问并观察负载状态 可以看到确实会随机请求后方的服务,只不过不是十分均衡
[root@bogon network-scripts]# watch -n 1 ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.238.105.223:80 31 654 493 164899 187569
-> 192.168.47.11:80 15 169 108 33126 40355
-> 192.168.47.12:80 16 485 385 131773 147214
上述实战测试过程中 VIP使用的是 桥接网卡的IP 测试成功,那么不使用桥接网卡是否可以成功呢?后续进行测试验证。
虚拟机准备
准备三台Vmware虚拟机
192.168.47.15 DirectServer LVS服务器 配置VIP为 192.168.47.100
192.168.90.11 RealServer1 web 应用1
192.168.90.12 RealServer2 web应用2
网络配置:三台虚拟机网络模式都配置为NAT模式,DS server 为一个网卡配置两个IP,默认固定IP为 192.168.47.15,网关指向NAT网关,然后 通过命令添加 192.168.47.100 ,具体见配置详情
ipvs安装
yum install ipvsadm -y
配置DS服务器
配置的具体命令如下
[root@bogon ~]# nmcli conn show NAME UUID TYPE DEVICE Wired connection 1 d1d93c8e-28eb-3e15-8f8e-f228b9b08953 ethernet ens37 --因为我这里配置了另外一张网卡,所以这里两条记录,默认是没有这条记录的, ens33 b2ce2b85-ee42-4a7a-b3f6-e8690d8201bc ethernet ens33 [root@bogon ~]# nmcli conn mod ens33 +ipv4.addr 192.168.47.100/24 ---为网卡 ens33 添加 第二个IP 192.168.47.100 [root@bogon ~]# systemctl restart network --添加完重启网络服务 --配置LVS服务通过VIP 的80 端口 负载到RS服务器 [root@bogon ~]# ipvsadm -A -t 192.168.47.100:80 -s rr [root@bogon ~]# ipvsadm -a -t 192.168.47.100:80 -r 192.168.47.11 -g [root@bogon ~]# ipvsadm -a -t 192.168.47.100:80 -r 192.168.47.12 -g [root@bogon ~]# 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.47.100:80 rr -> 192.168.47.11:80 Route 1 1 0 -> 192.168.47.12:80 Route 1 1 0
配置RS服务器
分别在两台RS服务器上进行配置。
RealServer1 服务器
绑定VIP到回环网卡
[root@host11 network-scripts]# cd /etc/sysconfig/network-scripts/
[root@host11 network-scripts]# cp ifcfg-lo ifcfg-lo:10 --复制一个lo网卡配置
[root@host11 network-scripts]# vi ifcfg-lo:10 --编辑复制出来的lo:10配置信息
[root@host11 network-scripts]# cat ifcfg-lo:10
DEVICE=lo:10 --名字修改为和文件名 ifcfg- 后的部分保持一致
IPADDR=192.168.47.100 --修改IP地址为 VIP
NETMASK=255.255.255.255 --掩码修改为 255.255.255.255
--其他内容按此配置为准
#NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
#BROADCAST=127.255.255.255
ONBOOT=yes
#NAME=loopback
RS1关闭arp响应
[root@host11 network-scripts]# vi /etc/sysctl.conf --修改系统配置
[root@host11 network-scripts]# cat /etc/sysctl.conf --增加如下内容
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@host11 network-scripts]# sysctl -p --使配置生效
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
上述两项配置arp_ignore arp_announce 保证了该方案的可行性,两项配置的具体含义如下
arp_ignore 规定了计算机如何对待收到的arp请求,取值如下:
arp请求包中查询mac地址的目标IP,我们称之为arp目标IP
1:当本机收到arp请求包时,只要本机所有的网卡/网络接口中任何一个网卡上有这个目标ip ,那么就应答这个请求包。
2:当本机收到arp请求包时,只有当收到请求包的网卡/网络接口上,有这个IP时,才相应这个请求包。
3:当本机收到arp请求包时,如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4-7:保留未使用
8:不回应所有的arp查询请求
这样 当用户机器查询VIP mac地址时,因为VIP配置在 lo 网络接口上,所以不会回应。(网上大部分教程一般都没有解释清楚这个)
arp_announce 的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址,
比如系统准备通过网卡发送一个数据包a ,这时数据包a的源IP和目的IP一般都是知道的,而根据目的IP查询路由表,发送网卡也是确定的,故源MAC地址也是知道的,这时就差确定目的MAC地址了。而想要获取目的IP对应的目的MAC地址,就需要发送arp请求。arp请求的目的IP自然就是想要获取其MAC地址的IP,而arp请求的源IP是什么呢? 一般是数据包a的源IP地址,但是不是一定的,arp请求的源IP是可以选择的,控制这个地址如何选择就是arp_announce的作用。
常用的取值有0,1,2。
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。随便选一个,一般是数据包的源IP。LVS DR模式下 也就是 VIP,如果使用了这个 那么arp 响应包 就会到LVS服务器 而到不了 RS
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。 就是尽量使用数据发送网卡所在子网的ip,使用这个大概率 会使用数据发送网卡上的正确IP,但不是一定
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。 必须使用数据发送网卡上最合适的地址来发送arp 请求。 这种配置就选择最合适的来发送,就是最大概率是对的。 保证RS能知道 客户端机器的mac
配置完重启网络服务
systemctl restart network
RS2的配置同RS1 完全一致
访问测试
通过宿主机的浏览器 访问 VIP 的80 端口,可以负载到后端的web服务如下:
通过 ipvsadm -Ln --stats 查看后端服务器的流量分布,可以看到两条服务器都有被负载到,也可以为web服务分别添加各自标识的页面,来区分RS服务。
[root@bogon ~]# watch -n 1 ipvsadm -Ln --stats
Every 1.0s: ipvsadm -Ln --stats Tue Apr 19 02:06:03 2022
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.47.100:80 31 1976 0 279503 0
-> 192.168.47.11:80 15 257 0 64976 0
-> 192.168.47.12:80 16 1719 0 214527 0
lvs高可用配置见 高可用配置
如果对你有帮助请帮忙点个赞,好人一生平安 (●’◡’●)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。