LVS负载均衡

Posted shuaiyin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS负载均衡相关的知识,希望对你有一定的参考价值。

  lvs也是一款负载均衡软件,Linux虚拟服务器的简称。工作在os7层模型第4层,它是基于IP地址和端口号做转发的,因为他工作在第4层,所以它不支持正则处理和动静分离,nginx是工作在第7层的,支持这两种。

最早来说防火墙是可以实现负载均衡的,后来就移除掉了,为什么?因为跟lvs一比,就是小巫见大巫了。

LVS Nginx HAProxy对比

LVS:

1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低

2、工作在网络4层,通过vrrp(虚拟路由冗余协议)协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。

3、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)

4、应用范围比较广,可以对所有应用做负载均衡;

5、不支持正则处理,不能做动静分离。

6、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)

7、配置 复杂,对网络依赖比较大,稳定性很高。

Ngnix:并发量上来之后并不怎么消耗资源,因为他利用了异步IO这么一个概念。

1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;

2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;

3、Nginx安装和配置比较简单,测试起来比较方便;

4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;

5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。

6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;

7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。

8、不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,

9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)

10、Nginx还能做Web服务器即Cache功能。

HAProxy的特点是:

1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;

2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作

3、支持url检测后端的服务器出问题的检测会有很好的帮助。

4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现

5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。

6、HAProxy可以对mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。

7、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)

8、不能做Web服务器即Cache。

负载均衡

轮循(rr):挨个点后端节点,除非我后端节点的都点完了,再重头来。

带权轮循(wrr):设置权重,就是weight。

最小连接(lc):哪台机器连接小,我给谁。

权重最小连接(wlc):带权重。

lvs有两部分组成

ipvs(用这个去做策略,调用内核)和ipvsadm(工作在用户空间)

lvs模式

NAT模式:

 技术图片

 

  工作原理:用户发送一个请求,经过调度器,而后调度器通过自身的算法,发到后端真实的主机,而后real server数据返回给调度器,调度器返回给用户,所以真实主机的网关必须指向调度器,调度器必须要有两块网卡,一块通外网,一块通内网,所以这就涉及到了路由转发,还得设置ip_forward。

缺点:因为调度器即负责接收报文又负责发送报文,所以压力很大,性能较低。

优点:配置简单。

路由DR模式:

    工作原理:客户端发送请求给调度器,调度器就收到请求之后,发现请求实在是在规则里面存在的地址,那么它将目标MAC改为了RIP的MAC地址,并将此包发送给real server。real server发现请求报文中的目的MAC是自己,就会将此报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

lvs最常用的算法:

1. 轮叫调度 rr

  这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

2. 加权轮叫 wrr

  这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

3. 最少链接 lc

  这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

4. 加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

NAT模式配置:

调度器(DS):

#两块网卡,一块桥接

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.1.9

GATEWAY=192.168.1.1

NETMASK=255.255.255.0

DNS1=8.8.8.8

DNS2=114.114.114.114

#一块vmnet2(他的ip就是后端机器的网关)

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens37

ONBOOT=yes

IPADDR=172.16.100.1

#安装ipvsadm包

cd /本地挂载点目录/ Packages

rpm -ivh ipvsadm-1.27-7.el7.x86_64.rpm

#开启路由转发功能

echo “1” > /proc/sys/net/ipv4/ip_forward

#添加通外网的ip

ipvsadm –A(添加服务ip的意思) –t(指定tcp协议) 192.168.1.9:80 -s(算法)rr

#添加real server ip

ipvsadm –a –t 192.168.1.9:80 –r 172.16.100.2 –m(指定nat模式)

ipvsadm –a –t 192.168.1.9:80 –r 172.16.100.3 –m(指定nat模式)

#而后两台内网机器启动httpd。

real server1 ip

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=172.16.100.3

GATEWAY=172.16.100.1

NETMASK=255.255.255.0

real server2 ip

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=172.16.100.2

GATEWAY=172.16.100.1

NETMASK=255.255.255.0

#查看配置

ipvsadm –L –n

#使用windows访问调度器外网ip测试即可

DR模式(路由模式)配置:

调度器

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.24.8

GATEWAY=192.168.24.2

NETMASK=255.255.255.0

DNS1=8.8.8.8

DNS2=114.114.114.114

#安装ipvsadm

yum install ipvsadm –y

#添加对外提供服务IP

ipvsadm –A –t 虚拟ip(必须是同一网段,随便写):80  -s rr

#添加2台real server IP

ipvsadm –a –t 虚拟ip:80 –r 内网ip:80 –g(路由模式)

#现在需要在网卡的配置中配置虚拟ip  ifconfig命令需下载net-tools.x86_64

ifconfig ens33:0 虚拟ip地址 broadcast 虚拟ip地址 netmask 255.255.255.255 up

#添加一个静态路由(让访问250这个地址的时候走ens33:0这个网卡)

route add –host 虚拟ip地址 dev ens33:0

#查看网关

route –n

real server1

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.24.9

GATEWAY=192.168.24.2

NETMASK=255.255.255.0

DNS1=8.8.8.8

DNS2=114.114.114.114

#添加vip

ifconfig lo:0 虚拟ip地址 broadcast 虚拟ip地址 netmask 255.255.255.255 up

#而后指定静态路由

route add –host 虚拟ip地址 dev lo:0

real server2

TYPE=Ethernet

BOOTPROTO=static

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.24.10

GATEWAY=192.168.24.2

NETMASK=255.255.255.0

DNS1=8.8.8.8

DNS2=114.114.114.114

#添加vip

ifconfig lo:0 虚拟ip地址 broadcast 虚拟ip地址 netmask 255.255.255.255 up

#而后指定静态路由

route add –host 虚拟ip地址 dev lo:0
#分别给两台后端写入

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

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

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

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce
#设置权重轮循

ipvsadm -C

ipvsadm -A -t 192.168.24.250:80 -s wrr

ipvsadm -a -t 192.168.24.250:80 -r 192.168.24.9:80 -w 1 -g

ipvsadm -a -t 192.168.24.250:80 -r 192.168.24.10:80 -w 2 -g

arp_ignore:定义接收到ARP请求时的响应级别     

0:默认,只用本地配置的有响应地址都给予响应      

1:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应

(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)

arp_announce:定义将自己的地址向外通告时的级别      

0:默认,表示使用配置在任何接口的任何地址向外通告      

1:尽量仅向目标网络通告与其网络匹配的地址      

2:仅向与本地接口上地址匹配的网络进行通告  

以上是关于LVS负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

企业运维之 Lvs 负载均衡和高可用

超详细!一文带你了解 LVS 负载均衡集群!

基于lvs实现4层负载均衡

IPVS(LVS)负载均衡简介及实验测试

负载均衡介绍LVS介绍算法介绍LVS_NAT负载均衡模式配置

LVS负载均衡策略的部署与应用