LVS实现负载均衡详解

栏目: 服务器 · 发布时间: 5年前

内容简介:LVS是Linux Virtual Server的简称,即Linux虚拟服务器。从Linux内核2.4版本之后,已经将LVS内置于内核中,提供负载均衡技术。1、LVS的优势高并发能力强 LVS基于内核网络层工作,有着超强的并发处理能力,单台LVS可以承受上万的并发连接。

LVS是Linux Virtual Server的简称,即 Linux 虚拟服务器。从Linux内核2.4版本之后,已经将LVS内置于内核中,提供负载均衡技术。

目录

  • LVS理论基础
  • ipvsadm命令
  • DR和NAT实验
  • LVS持久连接
  • LVS健康监测

LVS理论基础

1、LVS的优势

高并发能力强 LVS基于内核网络层工作,有着超强的并发处理能力,单台LVS可以承受上万的并发连接。

稳定性高 LVS是基于4层的负载均衡软件,因此LVS在所有负载均衡软件中性能最强,稳定性最高,消耗CPU和内存少。

应用范围广 LVS是工作在4层,所以它可以对应用层的所有协议作负载均衡,包括http、DNS、ftp等。

2、LVS的组件

ipvsadm LVS已经集成于内核中,用户是无法直接操作内核空间的程序的,因此需要一个用户空间的管理工具,ipvsadm就是一个用户空间的命令行工具,用于管理集群。

ipvs 工作于内核netfilter INIPUT钩子上的一个程序,并且根据ipvsadm定义的规则实现请求的转发。

查看Linux内核是否支持ipvs:

`grep -i -C 10 --color=auto ipvs  /boot/config-2.6.32-696.el6.x86_64`

3、LVS的工作流程

LVS实现负载均衡详解

1、用户请求的数据包到达负载均衡器的内核空间,首先经过的是内核的PREROUTING链,

2、因为请求的数据包的目的地址一定是本机,然后将数据包送到INPUT链,

3、ipvs就工作在INPUT链上,ipvs利用ipvsadm定义的规则工作,ipvs对数据包进行检查,如果目的地址和端口不在规则里边,则将数据包送往用户空间,

4、如果目的地址和端口在规则里边,则将数据包的目的地址和端口修改为后端真实服务器,然后将修改后的数据包送往POSTROUTING链,

5、最后经过POSTROUTING链将数据包转发给后端服务器。

4、LVS的工作模式

NAT ①客户端发送数据包至负载均衡器,数据包的源IP是CIP,目的IP是VIP。数据包首先到达的是内核空间的PREROUTING链,②PREROUTING链判断目的IP是VIP,确定VIP是本地IP,然后将其送往INPUT链。③INPUT链上的ipvs将数据包的目的IP修改为RIP,然后发送给POSTROUTING链。④POSTROUTING链将数据包发送至后端服务器处理。⑤处理完之后,以源IP为RIP,目的IP为CIP的响应数据包返回给负载均衡器,⑥LVS收到之后再次修改数据包的IP地址,将数据包的源IP修改为VIP,目的IP保持不变仍为CIP,然后发往客户端。

LVS实现负载均衡详解

NAT工作模式中,请求的流量和回应的流量都必须经过前端的调度器,一次调度器成为了整个服务器集群的瓶颈,一旦调度器宕机,则整个集群将出去瘫痪状态,因此就出现了DR工作模式。

DR Direct Routing,①客户端发送数据包至负载均衡器,数据包的源IP是CIP,目的IP是VIP。数据包首先到达的是内核空间的PREROUTING链,②PREROUTING链判断目的IP是VIP,确定VIP是本地IP,然后将其送往INPUT链。③ipvs将数据包通过DIP的网卡发送给POSTROUTING链,其中源MAC自动修改为DIP的MAC(因为从DIP的网卡发送出去的),并且将目的MAC修改为RIP的MAC,源IP和目的IP保持不变,④POSTROUTING链将数据包发送给交换机,交换机根据RIP的MAC地址将数据包送往指定的后端服务器,⑤处理外后将数据包通过lo接口转发至eth0接口,由eth0将数据包发送出去,此时数据包的源IP和MAC是VIP:VIP的MAC,目的IP和MAC是CIP:CIP的MAC,⑥响应数据包最终交付给客户端。

LVS实现负载均衡详解

DR工作模式的特点:因为DR工作模式是根据MAC进行数据包转发,因此RS跟负载均衡器必须在同一个局域网(广播域)中;所有的请求报文都经过负载均衡器,所有的响应报文不经过负载均衡器;因为DR工作模式的响应报文是RS直接回应的,因此负载均衡器和RS必须都配置同一个VIP地址,RS的lo接口配置VIP,这样一来同一个局域网会有多个相同的IP,在进行ARP广播的时候会出现紊乱,这时需要通过修改RS的内核参数从而阻止RS对ARP广播进行回应,这样只有负载均衡器对VIP的ARP请求进行回应;由于DR工作模式仅需要分析数据包的MAC首部,因此DR的处理能力特别高,拥有和硬件负载均衡设备相媲美的网络吞吐和负载均衡能力。

TUN ①客户端发送请求至负载均衡器,该数据包的源IP是CIP,目的IP是VIP,②LVS收到数据包后,将该数据包的首部再封装一层IP首部,其中源IP为DIP,目的IP为RIP,将重整后的数据包送往后端服务器,③RS两次处理该数据包,将响应数据包通过lo接口送往eth0接口,然后直接发送给客户端。

LVS实现负载均衡详解

其中NAT和DR调度算法必须保证调度器和RS在同一个局域网中,也就是他们无法跨网段通信,而TUN调度算法则可以使得调度器和RS在不同的局域网中。

另外,通过对NAT工作模式进行改进,可以使得其跨网段通信,改进之后的工作模式为 fullnat 模式。工作流程和原理如图所示,

LVS实现负载均衡详解

5、LVS的调度算法

1、轮询(rr)

请求按顺序轮流分配到后端服务器上,后端每台服务器接受请求的概率是一样的。

2、加权轮询(wrr)

LVS根据后端服务器的处理能力给后端每台服务器设置权值。LVS可以自动询问真实服务器的负载情况,然后动态的调整权值,权值大的收到请求的概率大。

3、目标地址散列(dh)

根据请求的目标IP地址,得出hash值,进而找出对应的服务器,这种调度算法适用于缓存服务器的负载均衡。

4、源地址散列(sh)

根据请求的源IP地址,得出hash值,进而找出对应的服务器,这种调度算法适用于session共享的情况。

5、最少连接(lc)

动态地将请求调度到后端连接数最少的服务器上。这种调度算法适用于后端每台服务器性能相近的情况下。

6、加权最少连接(默认)(wlc)

LVS动态调整后端服务器的权值,权值大的将承受较大比例的活动连接负载。

7、最短延迟调度(sed)

8、永不排队/最少队列调度(nq)

ipvsadm命令

ipvs是集成与内核空间的,用户无法直接操作,因此需要借助管理工具ipvsadm,通过定义规则使得ipvs工作,类似于iptables。同样该 工具 可以借助yum安装和源码安装。

常用选项:

-A --add-server 新加一条虚拟服务器记录

-E --edit-server 编辑虚拟服务器记录

-D --delete-server 删除一条虚拟服务器记录

-C --clear 清空所有的虚拟服务器记录

-S --save 保存虚拟服务器规则

-R --restore 恢复虚拟服务器规则,从-S保存的规则中恢复

-t --tcp-service 表示tcp服务,指虚拟服务器

-u --udp-service 表示udp服务,指虚拟服务器

-s --schedule 使用的调度算法

rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq the default scheduler is wlc

-p 代表持久连接

-f 代表防火墙的标记

例子:

ipvsadm -A -t 192.168.239.129:80 -s wlc

ipvsadm -E -t 192.168.239.129:80 -s rr

ipvsadm -S > /etc/sysconfig/ipvsadm

ipvsadm -R < /etc/sysconfig/ipvsadm

-a 添加一条新的真实主机记录

-r 添加真实主机的地址

-m 指定LVS的工作模式为NAT

-w 指定真实服务器的权值

-g 指定LVS的工作模式为DR(默认)

-i 指定LVS的工作模式为TUN

例子:

ipvsadm -a -t 192.168.239.129:80 -r 192.168.239.130 -m -w 1

-e 编辑一条虚拟服务器记录中的某条真实服务器

-d 删除一条虚拟服务器记录中的某条真实服务器

-L|-l 列出所有的虚拟服务器记录

-Z 清空当前的连接数(-l会显示虚拟服务器中连接数量)

例子:

ipvsadm -e -t 192.168.239.129:80 -r 192.168.239.130 -g -w 3

ipvsadm -d -t 192.168.239.129:80 -r 192.168.239.230

实验

LVS-DR模型

环境拓扑:

主机 IP 功能
LVS 192.168.239.250 调度器
Web1 192.168.239.129 RS
Web2 192.168.239.133 RS

前端负载均衡器的配置:

# 配置VIP至网卡别名

[root@LVS ~]# ifconfig eth0:0 192.168.239.250  netmask 255.255.255.0 up

# 定义LVS规则

[root@LVS ~]# ipvsadm -A -t 192.168.239.250:80 -s wrr

[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.129:80 -g -w 1

[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.133:80 -g -w 2

[root@LVS ~]# 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.239.250:80 wrr

-> 192.168.239.129:80          Route  1      0          0       

-> 192.168.239.133:80          Route  2      0          0

后端RS的配置(两台RS的配置过程一样,下面仅以Web1为例):

[root@Web1 web]# ifconfig lo:0 192.168.239.250 broadcast 192.168.239.250 netmask 255.255.255.255 up

[root@Web1 web]# route add -host 192.168.239.250 dev lo:0

# 抑制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绑定至RS的lo回环接口上边,并且广播地址为自身和子网掩码为4个255,这样做是为了防止VIP冲突。

② 关于arp_ignore和arp_announce两个内核参数的意义,请参考ARP抑制

然后在两台RS上边部署Nginx的Web环境,分别往首页写入静态内容

This is Web1

This is Web2

然后在浏览器的地址列中输入VIP--192.168.239.250,刷新页面,页面内容能够实现调转说明负载均衡功能实现。

LVS实现负载均衡详解 LVS实现负载均衡详解

LVS-NAT模型

环境拓扑

主机 IP 功能
LVS VIP:192.168.0.105 调度器
LVS DIP:192.168.239.130 调度器
Web1 192.168.239.129 RS
Web2 192.168.239.133 RS

前端负载均衡配置:

LVS实现负载均衡详解

[root@LVS ~]# ipvsadm -A -t 192.168.0.105:80 -s wrr

[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.129:80 -m -w 1

[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.133:80 -m -w 2

# 这样ipvs的规则已经定义完成

# 因为NAT工作模式涉及到地址转换,因此需要修改内核的ip_forward参数

[root@LVS ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

# 修改完成之后使其生效

[root@LVS ~]# sysctl -p

后端RS的配置:

# 因为NAT的工作模式中,请求数据和回应数据都需要经过调度器,因此需要将后端服务器的默认网关指向调度器的DIP

[root@Web1 ~]# route add default -gw 192.168.239.130

[root@Web2 ~]# route add default -gw 192.168.239.130

测试:

分别配置RS的web服务器,我这里将html文本内容作为后端RS的web内容,

[root@Web1 ~]# curl localhost

This is web1

[root@Web2 ~]# curl localhost

This is web2

然后访问调度的VIP,查看返回的web内容,出现如下图的效果说明负载均衡已经实现。

LVS实现负载均衡详解

LVS持久连接

HTTP协议是一种无状态的协议,即每次发送请求之后就会马上断开连接。假如这种无状态的协议运用在LVS负载均衡中,就会出现这样的情况,以购物网站为例子,用户浏览一商品并加入购物车,这时候请求被送往RS1,然后就断开连接,之后用户又浏览一商品并加入购物车,这时候请求又被送往RS2,这样用户再次访问购物车的时候,反馈给用户的信息是购物车里只有一件商品(假如请求被调度到RS1或RS2的其中一台),这样肯定是不行的。

解决这种问题的办法是可以利用源地址hash调度算法,当然还可以利用LVS的持久连接。

# 基于上面例子中的NAT模型试验,为其增加持久连接

[root@LVS ~]# ipvsadm -E -t 192.168.0.105:80  -s wrr -p

LVS实现负载均衡详解 现在规划这样一个场景,客户通过访问VIP发来http请求,需要将80端口的请求和8080端口的请求在一定时间范围内调度到后端同一台服务器上,就是 端口联姻 。完成这样的需求需要借助 防火墙的标记持久连接 。为了看到测试的效果,规划这样的环境拓扑:

主机 IP 备注(或html页面内容)
LVS VIP:192.168.0.105 调度器(NAT)
LVS DIP:192.168.239.130 调度器(NAT)
Web1 192.168.239.129:80 This is web1 with 80
Web1 192.168.239.129:8080 This is web1 with 8080
Web2 192.168.239.133:80 This is web2 with 80
Web2 192.168.239.133:8080 This is web2 with 8080

前端调度器的配置:

# 在防火墙上将VIP的80端口请求和8080端口请求都标记为100

[root@LVS ~]# iptables -F

[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp --dport 80 -j MARK --set-mark 100

[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp --dport 8080 -j MARK --set-mark 100

# 利用标记添加ipvs规则(借助ipvsadm命令的-f选项)

[root@LVS ~]# ipvsadm -C

[root@LVS ~]# ipvsadm -A -f 100 -s wrr -p

[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.129 -m -w 1

[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.133 -m -w 2

后端RS的配置:

# 开通后端服务器的80端口和8080端口的服务,然后他们各自的访问内容分别如下

[root@Web1 ~]# curl http://localhost:80

This is web1 with 80

[root@Web1 ~]# curl http://localhost:8080

This is web1 with 8080

[root@Web2 ~]# curl http://localhost:80

This is web2 with 80

[root@Web2 ~]# curl http://localhost:8080

This is web2 with 8080

# 因为是NAT的工作模式,因此需要将后端RS的网关指向DIP

[root@Web1 ~]# route add default gw 192.168.239.130

[root@Web2 ~]# route add default gw 192.168.239.130

最后访问VIP的80端口和8080端口,发现请求都会被调度到同一台RS上。

LVS实现负载均衡详解

LVS健康监测

LVS本身是无法监测后端服务器的状态的,即使后端某台服务器宕机,LVS还是会把请求调度到这台宕机的服务器上边,这样用户就会无法得到响应,这对用户的体验是极差的。因此为LVS加入了后端服务器健康状态检测机制,只有后端正常的服务器才会接受请求。

这里引入一个新的软件包ldirectord,这个软件包会为系统开启一个名叫ldirectord的守护进程,该进程专门用来管理ipvs的规则。该软件的rpm包下载地址如下:

ldirectord-3.9.6(CentOS6)下载

下载完成之后完成安装即可。安装命令如下:

[root@LVS ~]# yum -y localinstall ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

ldirectord软件包的主配置文件为

/etc/ha.d/ldirectord.cf

其中软件包中会默认提供一个主配置文件的模板文件供参考,它是

/usr/share/doc/ldirectord-3.9.6/ldirectord.cf

以实验的LVS-DR模型的环境拓扑为例,这里使用ldirectord定义ipvs的规则,而不再使用ipvsadm命令。ldirectord的主配置文件的主要参数与其意义如下:

checktimeout=5      # 超时时间

checkinterval=1      # 两次检查的时间间隔

autoreload=yes      # 如果ldirectord的配置文件更新,是否主动重读配置文件

logfile="/var/log/ldirectord.log"    # 定义日志文件

quiescent=no        # 当后端某台服务器故障的时候,yes表示将节点的权值降为0,no表示将节点剔除ipvs的规则,当恢复正常后自动恢复值ipvs规则中

virtual=192.168.239.250:80  # 虚拟IP:port

real=192.168.239.129:80 gate 1  # RS的IP:port+<工作模式>+[权值]

real=192.168.239.133:80 gate 2

service=http

scheduler=wrr    # 调度算法

#persistent=600

protocol=tcp

# ldirectord实际上是根据下面参数来具体地监控RS是否正常

checktype=negotiate  # ldirectord进程监控RS的方法

checkport=80            # 监控的Port

request="check.html" # 监控的文件

receive="This web is OK" # 监控的文件内容

VIP的设置和后端服务器的ARP抑制的相关操作请参考实验的LVS-DR模型,这里不再重写。

在后端的服务器的web根目录下放入监控的文件

[root@Web1 web]# pwd

/data/web

[root@Web1 web]# cat check.html

This web is OK

[root@Web2 web]# pwd

/data/web

[root@Web2 web]# cat check.html

This web is OK

开启ldirectord进程,ipvsadm查看ipvs规则如下

LVS实现负载均衡详解

现在将后端Web1的监控的页面内容改成其他内容,再次查看ipvs规则,结果如下图。

[root@Web1 web]# pwd

/data/web

[root@Web1 web]# cat check.html

This web is Down

LVS实现负载均衡详解

Linux公社的RSS地址: https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-08/153443.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

文明之光

文明之光

吴军 / 人民邮电出版社 / 2014-12 / 177元

吴军博士从对人类文明产生了重大影响却在过去被忽略的历史故事里,选择了有意思的几十个片段特写,以人文和科技、经济结合的视角,有机地展现了一幅人类文明发展的宏大画卷。 《文明之光》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段,每个章节相对独立,全景式地展现了人类文明发展历程中的多样性。《文明之光》系列首册讲述从人类文明开始到近代大航海这一历史阶段,共八个专题。第二册讲述了从近......一起来看看 《文明之光》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具