LVS负载均衡

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的命令参数如下
在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标志)
      • 真实服务器当前的活动连接数量小于其权重值
  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值