首页
学习
活动
专区
工具
TVP
发布

LVS详解

1.引言

lvs是4层负载均衡机制的实现,直接通过对fileter的修改实现请求之间的转发,多用在较大型集群环境中,是在内核级别实现的,其具有以下特点:

1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,保证了均衡器IO的性能不会受到大流量的影响;

2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;

3、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;

4、应用范围比较广,可以对所有应用做负载均衡,不管是http还是ssh协议都可以使用lvs;

5、软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。

6、如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。

7、性能非常卓越,已经在多个公司使用可靠性也非常不错,并且是开源项目,可以修改源代码定制自己的需求

2.专用术语

VS:Virtual Server,Director,Dispatcher

RS:Real server

CIP:客户端IP

VIP:用于接受客户端通信的IP

DIP:用于调度器与Realserver通信的IP

RIP:用于提供真正服务的IP

3.ipvsadm/ipvs

ipvsadm是用户空间的命令行工具,用于管理集群服务及集群服务的RS

ipvs:工作在内核上的netfilter的INPUT钩子上的程序,可根据用户需要进行转发

在进入INPUT的时候强行修改,转到POSTROUTING,通过POSTROUTING送出去

4.lvs集群的类型

lvs-nat

lvs-dr

lvs-tun

lvs-fullnat

4.1lvs-nat:

多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现(通过ipvsadm实现);

(1) RIP和DIP应该使用私网地址,RS的网关应该指向DIP;

(2)请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;

(3)支持端口映射;用户请求的端口,可以与RS响应的端口不一样;

(4) VS节点必须为Linux,RS节点可以是任意的OS,因为lvs是linux上专用的;

(5) RS的RIP与Director的DIP必须在同一IP网络;

流程图:

4.2lvs-dr:Direct Routing

lvs默认的类型,功能非常强大

通过修改请求报文的MAC地址进行转发;IP首部不会发生变化(源IP为CIP,目标IP始终为VIP);

(1)确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;

解决方案有多种:

1.arp静态绑定;

2.禁止RS响应VIP的ARP请求;

(a)使用arptables;

(b)修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;

(2) RS的RIP可以使用私有地址,也可以使用公网地址;

(3) RS跟Director必须在同一物理网络中;

(4)请求报文必须由Director调度,但响应报文必须不能经由Director;

(5)不支持端口映射;

(6)各RS可以使用大多数的OS;

流程图:

4.2.1 ipvs-dr模型过程描述及其实现

在各主机均需要配置VIP,因此要解决地址冲突的问题,目标是让各RS的VIP不可见,仅用于接收目标地址为VIP的报文,同时可作为响应报文的源地址:

(1)在前端的网关静态绑定,但是一旦director宕机,那么就完蛋了

(2)在各RS上使用ARPtables;

(3)在各RS上修改内核参数,限制ARP的响应和通报(推荐的一种方式,lvs-dr模型就是使用这个方式)

限制响应级别:arp_ignore

:使用本地所有接口的地址进行响应

1:仅在请求的目标IP配置在本地主机的接受报文的接口上时,才进行响应

限制通过级别:arp_announce

:默认,把本机所有端口信息向每个端口进行通报

1:尽量避免向非本网络通告

2:严禁向非本网络通告

4.2.2简述lvs-dr实现过程

Director和两个RS同时配置有VIP

1、客户端经过层层路由,到达Director和两个RS网络中,两个RS和一个Director是由本地交换机互联的;

2、Director和RS同时收到客户端发来的请求,为了只让Director去响应,我们需要修改两个RS的内核参数,来限制不能接受客户端请求;

3、Director一看是自己的MAC开始拆封报文首部,之后一看是自己的IP继续拆;

4、之后送到Director的INPUT链上,但是由于已经设定了lvs规则(lvs是内核级别的实现),经过lvs的判断,Director需要想办法把报文转出到两个RS端;

5、Director确定使用哪种调度算法,也即确定好了送给哪个RS;

6、Director封装好MAC地址和IP扔给本地交换机,交换机选择好给哪个RS;

7、RS收到请求报文,一看mac和IP都是自己的拆开;

8、RS收到之后,由于已经设置好了路由因此使用VIP去响应,之后送出去,最终实现源地址VIP目标地址CIP

4.2.3构建ipvs-dr模型

(1)环境介绍

此处环境是所有ip处于同一个网络内,如果想让VIP和和两个RS网络不处于同一个网络内,需要重新自己设计一个局域网

一个Director和每一个RS均同时配备两个IP地址,但是一块网卡就够,因为VIP可以全是配备在端口别名上面

Director:DIP:192.168.1.200 VIP:192.168.1.2

RS1:R1IP:192.168.1.103 VIP:192.168.1.2

RS2:R2IP:192.168.1.4 VIP:192.168.1.2

(2)配置Director # 192.168.1.200

使用setup配置好192.168.1.200

# ifconfig eth0:0192.168.1.2 netmask 255.255.255.255 broadcast 192.168.1.2临时生效

(3)配置RS1 IP

配置过程使用脚本实现

#mkdir /cluster

#vim /cluster/setkernel.sh

#!/bin/bash

case $1 in

start)

echo 1>/proc/sys/net/ipv4/conf/all/arp_ignore

echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2>/proc/sys/net/ipv4/conf/all/arp_announce

echo 2>/proc/sys/net/ipv4/conf/lo/arp_announce

;;

stop)

echo 0>/proc/sys/net/ipv4/conf/all/arp_ignore

echo 0>/proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0>/proc/sys/net/ipv4/conf/all/arp_announce

echo 0>/proc/sys/net/ipv4/conf/lo/arp_announce

;;

*)

echo "Parameter 'start' or 'stop'"

;;

esac

#chmod +x/cluster/setkernel.sh

#ifconfig lo:0 192.168.1.2 netmask 255.255.255.255 broadcast 192.168.1.2

#route add -host 192.168.1.2 dev lo:0

如果想让lo:0永久生效,那么复制lo接口配置到lo:0编辑一下配置文件即可

(4)配置RS2 IP

过程同“配置RS1IP”

(5)测试机器连通性

两个real server配置好httpd服务并且能实现正常访问

在Director上编写ipvs规则

# ipvsadm -A -t 192.168.1.2:80 -s rr

# ipvsadm -a -t 192.168.1.2:80 -r192.168.1.103 -g -w 1

# ipvasdm -a -t 192.168.1.2:80 -r192.168.1.4 -g -w 2

(6)测试

使用另外一台主机执行命令

# ping 192.168.1.2

# arp -vn

这两个命令必须同时使用

查看访问192.168.1.2是哪个主机响应的

访问http://192.168.1.2测试即可

注意:不能用浏览器访问,使用curl访问,因为浏览器缓存的原因访问不精确

(7)总结

1、各主机一个端口即可,但是需要在同一物理网络中;

2、rip的网关不能指向dip;rip和dip通常应该在同一网络内,但是二者未必会与vip在同一网络;

3、各rs需要先设置内核参数,再设置vip和路由;

4.3lvs-tun:隧道模型(为了解决VIP和RIP不在同一个地域的问题)

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原有的IP首部这外再次封装一个IP首部(源IP为DIP,目标IP为RIP);

(1) RIP,DIP,VIP全得是公网地址;

(2) RS的网关不能也不可能指向DIP;

(3)请求报文经由Director调度,但响应报文将直接发给CIP;

(4)不支持端口映射;

(5) RS的OS必须支持IP隧道功能;

4.4 lvs-fullnat:(非标准类型)

通过同时修改请求报文的源IP地址(CIP->DIP)和目标IP地址(VIP->RIP)进行转发;

5.负载均衡集群中会话保持的方式

原地址哈希session sticky

由于经过hash算法后落到哪个网页服务器是固定的,因此可以实现会话保持,但是灰度发布的时候会导致所在服务器会话丢失

会话集群session cluster

每台服务器有所有会话信息,比较浪费空间

会话服务器session server

单独一台会话服务器,高可能需要多台,发布的时候,只需等待一个keepalive时长就能下线了。不会丢失会话

6.lvs支持的负载调度算法

轮叫(RoundRobin)

调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

加权轮叫(WeightedRound Robin)

调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

最少链接(LeastConnections)

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

加权最少链接(WeightedLeast Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

基于局部性的最少链接(Locality-BasedLeast Connections)

"基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

带复制的基于局部性最少链接(Locality-BasedLeast Connections with Replication)

"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

目标地址散列(DestinationHashing)

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

源地址散列(SourceHashing)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171215G0CLQ100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券