LVS介绍
LVS 官网:http://www.linuxvirtualserver.org/
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分
LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
集群Cluster
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
Cluster分为三种类型:
- LB:Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
- HA:High Availiablity,高可用,避免单点故障
- MTBF:Mean Time Between Failure 平均无故障时间,正常时间
- MTTR:Mean Time To Restoration( repair)平均恢复前时间
- SLA:服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
- HPC:High-performance computing,高性能 www.top500.org
LVS集群的工作模式
LVS集群的工作模式分为三种,分别是:
- NAT模式(lvs-nat):简单容易实现
- 直接路由模式(lvs-dr):默认的模式也是生产环境首选模式
- 隧道模式(lvs-tun)在原请求IP报文之外新加一个IP首部
本文主要介绍NAT模式和直接路由模式,隧道模式由于IPv6的没有普遍是实施,所以暂时不做介绍
NAT模式(lvs-nat)
nat模式模式配置如下:
#注意,在虚拟机配置此模式为NAT模式,给lvs服务器添加一块网卡
[root@hd1 ~]# cd /etc/sysconfig/network-scripts/
[root@hd1 network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@hd1 network-scripts]# cat ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=ens37
UUID=34cf345f-9a01-40a3-b862-f2fb1684a8a5
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.2.11
NETMASK=255.255.255.0
重新启动服务
[root@hd1 network-scripts]# service network restart
安装ipvs管理工具,本地源中就自带有
[root@hd1 ~]# yum -y install ipvsadm
加载内核模块ip_vs
[root@hd1 ~]# modprobe ip_vs
[root@hd1 ~]# cat /proc/net/ip_vs
ipvsadm的命令参数如下
[root@hd1 ~]# ipvsadm -A -t 192.168.2.11:80 -s rr #rr表示算法中的轮巡算法
[root@hd1 ~]# ipvsadm -a -t 192.168.2.11:80 -r 192.168.1.12:80 -m
[root@hd1 ~]# ipvsadm -a -t 192.168.2.11:80 -r 192.168.1.13:80 -m
开启路由功能
1.临时开启,(写入内存,在内存中开启)
[root@hd1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
2.永久开启
[root@hd1 ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
重新加载配置文件
[root@hd1 ~]# sysctl -p
设置两台web服务器的ip地址和网关
在192.168.1.12上配置
[root@hd2~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 |grep GATEWAY
GATEWAY=192.168.1.11
[root@hd2 ~]# service network restart
安装httpd
[root@hd2 ~]# yum -y install httpd
[root@hd2 ~]# cd /var/www/html
[root@hd2 html]# echo "wo shi 1.12 " >index.html
[root@hd2 html]# systemctl start httpd
[root@hd2 html]# curl 127.0.0.1
wo shi 1.12
在192.168.1.13上配置
[root@hd3 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 |grep GATEWAY
GATEWAY=192.168.1.11
[root@hd3 ~]# service network restart
安装httpd
[root@hd3 ~]# yum -y install httpd
[root@hd3 ~]# cd /var/www/html
[root@hd3 html]# echo "wo shi 1.13 " >index.html
[root@hd3 html]# systemctl start httpd
[root@hd3 html]# curl 127.0.0.1
wo shi 1.13
在另外一台机上上进行测试(是客户端ip地址是2.12)注意访问的地址是:192.168.2.11
查看lvs规则表
[root@lvs]#ipvsadm -Ln
查看lvs调度状态
[root@lvs]#ipvsadm -Lnc
保存:建议保存至/etc/sysconfig/ipvsadm
[root@lvs]#ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs]#systemctl enable ipvsadm.service
删除192.168.1.13服务器
[root@lvs]#ipvsadm -d -t 192.168.2.11:80 -r 192.168.1.13:80
更改调度算法为wrr
[root@lvs]#ipvsadm -E -t 192.168.2.11:80 -s wrr
[root@lvs]#ipvsadm -e -t 192.168.2.11:80 -r 192.168.1.12 -m -w 5
[root@lvs]#ipvsadm -e -t 192.168.2.13:80 -r 192.168.1.13 -m -w 10
测试
[root@lvs]# curl 192.168.2.11
wo shi 1.12
[root@lvs]# curl 192.168.2.11
wo shi 1.13
[root@lvs]# curl 192.168.2.11
wo shi 1.13
[root@lvs]# curl 192.168.2.11
wo shi 1.12
[root@lvs]# curl 192.168.2.11
wo shi 1.13
[root@lvs]# curl 192.168.2.11
wo shi 1.13
LVS的DR模式
DR模式下,Load Balancer和所有的Real Server在物理上有一个网卡通过不分断的局域网相连,调度器和真实服务器必须绑定同一Virtual IP,该VIP在调度器上对外可见,而真实服务器上只需将VIP配置在Non-ARP网络设备上,它对外不可见,只是用于欺骗真实服务器用于处理目标地址为VIP的网络请求。真实服务器将请求处理后,直接返回给用户,不需要在通过调度器返回,所以在VS/DR模式下,真实服务器的网关地址不需要指向调度器。DR模式下,所以虚拟机都在桥接模式下进行。
默认情况下,当一台pc机开机启动的时候,会向网络中发送一个免费arp,用来告诉网络中其他主机本台机器的ip地址和mac地址:
为了避免三台具有相同ip地址的机器互相冲突,一定要禁止两台web服务器发送免费的arp
免费arp协议,当一个设备开机启动的时候,会告知网络上的其他设备,我是谁,我的ip地址、以及mac地址是多少,lvs设备会收到此数据包,把ip和mac地址对应关系加入arp缓存表
实验环境下的拓扑图
为了简化模拟过程,所有的机器全部在一个网段下,客户机的IP是192.168.1.18,Load Balancer同样提供一个对外可见的VIP192.168.1.113,其DIP与真实服务器在一个不分段的局域网中。
在lvs服务器上配置如下
1、在lvs上作如下配置
安装工具包
[root@lvs ~]# yum -y install ipvsadm
[root@lvs ~]# modprobe ip_vs
[root@lvs ~]# cat /proc/net/ip_vs
2. 配置关闭icmp重定向
[root@lvs ~]#echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
[root@lvs ~]#cat /proc/sys/net/ipv4/conf/all/send_redirects
[root@lvs ~]#echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
[root@lvs ~]#echo "1" >/proc/sys/net/ipv4/conf/ens33/send_redirects
3. 在lvs上配置vip(虚拟ip) 地址
[root@lvs ~]# ifconfig ens33:0 192.168.1.113 broadcast 192.168.1.113 netmask 255.255.255.255
4.添加主机路由
[root@lvs ~]# route add -host 192.168.1.113 dev ens33:0
查看主机路由
[root@lvs ~]# netstat -rn
5.配置lb命令
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.1.113:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.1.113:80 -r 192.168.1.12:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.1.113:80 -r 192.168.1.13:80 -g -w 3
[root@lvs ~]# ipvsadm -Ln
#-g表示dr模式,-w表示权重
二、在第一台Real Server 192.168.1.12上配置:
[root@server1 ~]# yum -y install net-tools
1. 在web1上配置vip的ip地址
[root@server1 ~]# ifconfig lo:0 192.168.1.113 broadcast 192.168.1.113 netmask 255.255.255.255 up
2. 配置主机路由
[root@server1 ~]#route add -host 192.168.1.113 dev lo:0
[root@server1 ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.2 0.0.0.0 UG 0 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
192.168.1.113 0.0.0.0 255.255.255.255 UH 0 0 0 lo
3. 在web服务器上配置arp选项
[root@server1 ~]#vi /etc/sysctl.conf
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
#限制响应级别:arp_ignore
- 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
- 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
#限制通告级别:arp_announce
- 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
- 1:尽量避免将接口信息向非直接连接网络进行通告
- 2:必须避免将接口信息向非本网络进行通告
4. 保存退出之后,重新加载配置文件
[root@server1 ~]# sysctl –p
5. 配置apache以及首页内容,在192.168.1.12web 主机上
[root@server1 ~]# yum -y install httpd
[root@server1 ~]# echo "wo shi 192.168.1.12" >/var/www/html/index.html
[root@server1 ~]#systemctl start httpd
三、在第二台Real Server 192.168.1.13上进行如下配置:
1.安装net-tools软件
如果没有此命令ifconfig,则安装net-tools
[root@server2 ~]# yum -y install net-tools
2. 配置web2的虚拟ip地址
[root@server2 ~]#ifconfig lo:0 192.168.1.113 broadcast 192.168.1.113 netmask 255.255.255.255 up
3. 配置vip的主机路由
[root@server2 ~]# route add -host 192.168.1.113 dev lo:0
4. 查看本机路由表
[root@server2 ~]# netstat –rn
5.配置arp选项
[root@server2 ~]#vi /etc/sysctl.conf
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
重新加载配置文件
[root@server2 ~]#sysctl –p
6. 配置apache(首先要配置本地光盘做源),在192.168.1.13web 主机上
[root@server2 ~]# yum -y install httpd
[root@server2 ~]# echo "wo shi 192.168.1.12" >/var/www/html/index.html
[root@server2 ~]# systemctl start httpd
在LVS主机上查看是否启动成功,这里主要指http服务器是否启动
[root@server2 ~]# netstat -naput|grep :80
tcp6 0 0 :::80
四. 在其他主机上进行测试
测试
[root@client]# curl 192.168.1.113
wo shi 1.12
[root@client]# curl 192.168.1.113
wo shi 1.13
[root@client]# curl 192.168.1.113
wo shi 1.13
[root@client]# curl 192.168.1.113
wo shi 1.12
[root@client]# curl 192.168.1.113
wo shi 1.13
[root@client]# curl 192.168.1.113
wo shi 1.13
注意事项:
1、基本上大部分搭载着unix和Microsoft OS的服务器都可以在VS/DR模式下作为真实服务器使用。
2、Load Balancer和所有的Real Server在物理上必须有一个网卡通过不分段的局域网相连。
3、调度器上的VIP地址对外可见;真实服务器必须将VIP绑定到Nor-ARP网卡上,它对内不可见,只是用于欺骗真实服务器用于处理目标地址为VIP的网络请求。
4、在VS/DR模式下,无需使用ip_forward(路由)功能,因此为了安全考虑,关闭了该功能(默认就是关闭的)
5、真实服务器不再使用调度器作为网关,因此关闭调度器的ICMP重定向。
4、你的真实服务器上必须已部署好http服务器,并为缺省主页写入不同的内容以测试调度器调度结果。
lvs的缺陷:缺少健康检查功能
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态分为两种:静态方法和动态方法
***** 静态方法****
1、RR:roundrobin,轮询,较常用
2、WRR:Weighted RR,加权轮询,较常用
3、sh:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、sh:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存
-
动态方法
主要根据每RS当前的负载状态及调度算法进行调度Overhead(开销)=value 较小的RS将被调度
1、LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
2、WLC:Weighted LC,默认调度方法,较常用
Overhead=(activeconns*256+inactiveconns)/weight
3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED(最短期望延时)
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现WebCache等
“基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
“带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
-
内核版本 4.15 版本后新增调度算法:FO和OVF
- FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度
- OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
- 真实服务器当前的活动连接数量小于其权重值