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:仅向与本地接口上地址匹配的网络进行通告