上一章我们说了keepalived,keepalived是避免负载均衡设备的单点故障的,即负载均衡设备的高可用。截止到目前为止,负载均衡我们只说到了Nginx(四层,七层负载),接下来的我们介绍的LVS也是用来做负载均衡的,只是LVS只支持四层负载(ip:port)。下面我们就具体介绍下LVS的功能和原理。
LVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
(1)高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
(2)成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
(3)配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
(4)支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用。
(5)支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
(6)应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
(7)缺点:工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。
LVS工作原理:lvs根据客户端的请求报文的目的ip和目标协议及端口将其调度至后端的real server,同时根据调度算法来挑选real server
(1)当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
(2)当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
(3)LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
(4)如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
(5)最后经由POSTROUTING链发往后端服务器。
备注:LVS涉及到iptables的相关内容,后续我们专门说说iptables
Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器,导致调度器压力过大。
数据包流转的过程如上图所示:
(1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
(3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
(4) POSTROUTING链通过选路,将数据包发送给Real Server。
(5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
(6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
补充:
(1)lvs-nat的本质是多目标ip的DNAT,通过将请求报文中的目标地址和目标端口修改为后端real server的ip和port
(2)DIP和Rip建议在同一网段(也可以不在),
(3)请求报文和相应报文必须经过lvs服务器,因此lvs就会成为该架构的瓶颈
(4)支持端口映射可以更改请求报文的目标端口
(5)lvs服务器必须是linux系统,real server可以为任意os系统
操纵封装新的MAC地址!!
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
如上图所示,Director和REAL SERVER都配置同一个IP(VIP),Director将该IP配置到对外的网卡上,Real server将该IP配置到lo网卡上。配置arp_ignore为1(目的是让数据包发出apr请求时,只有Director会响应该arp请求),所有REAL SERVER对本身这个IP的ARP请求保持静默。而Director收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER通过网卡eth0收到这个数据包,由于Real Server上的lo网卡配置的也有VIP,所以RS接收该数据包。处理后直接返回给客户端(这里要配置arp_announce,目的是修改返回数据包的源ip地址。)。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
1. 用户请求目标网站时,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接。当数据包到达VIP所在的局域网时,在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,因此需要将IP地址转换为MAC地址,因此会发出apr请求,查询VIP对应的mac地址。==Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求。==我们在Real Server的lo网卡上配置了VIP,但是我们只想让Director上的网卡来响应我们的这个arp请求。因此就需要更改下我们的一些内核参数,具体含义见后文。这时,数据包就得到了二层的Director的传输地址。
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
2. 当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
3. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链.
4. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
5. 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
6. client的请求被Director转发并经过链路层寻址到达Realserver后,由于Realserver的lo接口配置了VIP(请求中的目标IP正是VIP),所以接收请求并处理。处理完成之后,将响应报文通过lo接口传送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)然后向外发出。此时的源IP地址为VIP,目标IP为CIP。==如果将源地址为VIP将数据包发送出去,那么最终交换机上会产生两条VIP对应的mac地址记录,一条是Director的mac地址记录,还有一条是Real server的mac地址记录,这将会导致真正的VIP无法接收到请求。==因此,此处要配置arp_announce,目的是为了修改源ip的目的地址。
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
配置arp_announce=2,选择该主机发送网卡上最合适的本地地址作为arp请求的源IP地址。
DR模式的特性:
1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
3、RS跟Director Server必须在同一个物理网络中
4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
5、不支持地址转换,也不支持端口映射
6、RS可以是大多数常见的操作系统
7、RS的网关绝不允许指向DIP
8、RS上的lo接口配置VIP的IP地址
在原请求报文之外新加一个ip首部!!
1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
3.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现。
LVS有两种类型:
(1)静态的调度算法:这种算法一经实现,后续就不会发生变化,是既定的规则,后续数据包的流转都会按照这种规则进行按部就班的流转;
(2)动态的调度算法:这种算法是基于网络状况,或者后端服务器的状况,连接的状况等来进行实时的调整,算法的规则会根据实际情况而发生一定的变化。
RR:轮叫调度(Round Robin):
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
WRR:加权轮叫(Weight RR):
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
DH:目标地址散列调度(Destination Hash ):
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
SH:源地址 hash(Source Hash):
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
LC:最少链接(Least Connections):
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections):
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
SED:最短延迟调度(Shortest Expected Delay ):
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
NQ永不排队/最少队列调度(Never Queue Scheduling NQ):
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
命令选项 | 含义 |
---|---|
ipvsadm -A | 添加虚拟服务器 |
ipvsadm -E | 修改虚拟服务器 |
i pvsadm -D | 删除虚拟服务器 |
ipvsadm -C | 清空所有 |
ipvsadm -a | 添加真实服务器 |
ipvsadm -e | 修改真实服务器 |
ipvsadm -d | 删除真实服务器 |
ipvsadm -L | 查看LVS规则表 |
-s [rr|wrr|lc|wlc|sh] | 指定集群算法 |
配置实例
##添加虚拟服务器,协议为tcp(-t)或者udp(-u)
ipvsadm -A -t|u 192.168.19.10:80 -s [算法]
##修改虚拟服务器,协议为tcp(-t)或者udp(-u)
ipvsadm -E -t|u 192.168.19.10:80 -s [算法]
##删除虚拟服务器,协议为tcp(-t)或者udp(-u)
ipvsadm -D -t|u 192.168.19.10:80
ipvsadm -C 清空所有
##添加真实服务器-g(DR模式)-i(隧道模式)-m(NAT模式)
ipvsadm -a -t|u 192.168.19.10:80 -r 192.168.20.10 [-g|i|m] [-w 权重]
##修改真实服务器
ipvsadm -e -t|u 192.168.19.10:80 -r 192.168.20.10 [-g|i|m] [-w 权重]
##删除真实服务器
ipvsadm -d -t|u 192.168.19.10:80 -r 192.168.20.10
ipvsadm -Ln 查看LVS的规则表
配置实例
apt -y install ipvsadm #先安装相应的软件包
ipvsadm -A -t 192.168.19.130:80 -s wrr
ipvsadm -L
ipvsadm -Ln #以数字显示
## 添加Real Server
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.10 -w 1
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.20 -w 1
ipvsadm -Ln
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.30 -w 1 -m #使用nat模式
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.40 -w 1 -i #使用隧道模式
#默认为dr模式
ipvsadm -Ln
#在forward中可以看出类型,router为dr模式,masq为nat模式,tunnel是隧道模式
#永久保存所有规则
ipvsadm-save -n > /etc/sysconfig/ipvsadm-config
#清空所有规则
ipvsadm -C
上面我们只是介绍了LVS的功能,模型等,后续会通过实验来进一步理解NAT,DR,TRUN模型的工作原理。