LVS负载均衡介绍和配置

负载均衡群集介绍    

开源的负载均衡软件LVS、keepalived、haproxy和nginx等
keepalived除了可以实现高可用外,也可以拿来做负载均衡功能
LVS是基于4层负载均衡,网络OSI7层模型中的第四层。nginx属于第七层,haproxy既可以在4层工作,也可以在7层工作
lvs支持tcp数据转发,除了实现80的web端口转发外,也支持其他端口数据通信转发的,lvs只做协议上的通信端口数据转发,对数据内容不做监听:如域名头、主机报文头部信息
nginx只支持http、https、mail的转发,nginx可以针对网站的目录进行负载均衡,nginx在7层可以对后端区分目录,针对不同的网站目录来解析到不同的主机,haproxy也支持mysql负载均衡
比较lvs和nginx来说,lvs这种负载均衡在转发4层协议数据上更加稳定,能够处理更多的数据请求,而nginx这种负载均衡的方式更加灵活,可以针对不同级别的域名访问分配到不同的主机以及目录上,能够实现更多特定的需求

LVS介绍

LVS有三种常见模式:NAT、DR和IP Tunnel模式
LVS中有一个核心角色叫做分发器(Load balance),主要用于分发用户请求,还有诸多用户请求的服务器(Real Server,简称RS)

LVS-NAT模式:
LVS-nat模式借助iptables规则来实现,用户请求到达分发器后,通过预设的iptables规则,会把数据转发到后端的RS上去
rs需要设定网关为分发器的内网ip,用户请求和返回的数据包全部经过分发器,所以这里的分发器会造成一个瓶颈
在nat模式中,只需要分发器拥有公网ip即可,所以比较节省公网ip资源
但是这种模式不能承受较大的请求量,访问量较大的请求可能会无法正常处理,因为数据接收和发送到客户端都需要经过Load balance。因此LB角色的服务器处理请求的压力很大

LVS负载均衡介绍和配置
LVS IP Tunnel模式
需要有一个公共ip配置在分发器和所有rs角色上,公用的ip称做为VIP
客户端请求目标IP为vip,分发器接收请求数据包后,会对数据包的ip报头进行再次封装,会把目标ip的报头外再加上一层rs的ip报头(根据算法来选择封装成的rs的IP报头),这样用户请求的数据包就会被发送到rs角色上
rs接收数据包后,会解包数据包,所有报头解开后,原始IP报头为VIP,因为所有的rs上都配置有VIP,所以tcp协议会认为数据传输正确,然后交给rs处理。而每个rs又都配有公网ip,当数据请求完成后,rs会直接通过自己的IP+封装VIP报头把数据直接返回给客户端,这样数据返回给客户端时不需要经过Load Balancer了,减小了分发器的处理压力
LVS负载均衡介绍和配置

LVS DR模式
需要一个公共公用的IP设置为VIP,同样所有的rs上都配置这个VIP
和IP Tunnel不同的是,它会把数据包的MAC地址修改为RS的MAC地址,rs接收到数据包后,会处理数据包,解析出原始的ip报头得出原始的IP,因为rs上配置了这个VIP,所以rs会处理该数据包的请求
LVS负载均衡介绍和配置

LVS算法

轮询分发  Round-Robin  rr
加权轮询 Weight Round-Robin wrr
最小链接 Least-Connection lc
加权最小链接 Weight Least-Connection wlc
基于局部性的最小连接  Locality-Based Least Connection lblc
带复制的基于局部性最小链接 Locality-Based Least Connection with Replication lblcr
目标地址散列调度 Destination Hashing dh
原地址散列调度 Source Hashing  sh
最常用的是前面四种,根据服务器实际情况,加权分配可以对配置高处理请求能力强的服务器分配更多的请求数,这样可以充分利用服务器的资源,避免资源空闲

LVS NAT模式

分发器内网:192.168.1.220  外网192.168.182.130  
rs1内网192.168.1.223
rs2内网192.168.1.234
rs角色设置网卡的网关为192.168.1.220,用于NAT内网通信
所有角色上执行关闭防火墙规则,并保存配置的操作,防止因防火墙规则造成的无法访问站点的问题

[root@Huaching-2 ~]# systemctl stop firewalld
[root@Huaching-2 ~]# systemctl disable firewalld
[root@Huaching-2 ~]# systemctl start iptables
[root@Huaching-2 ~]# iptables -F
[root@Huaching-2 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]

在分发器dir上安装ipvsadm

root@Huaching-2 ~]# yum install -y ipvsadm
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
base | 3.6 kB 00:00:00     
epel | 3.2 kB 00:00:00     
extras       
-----------------省略
Downloading packages:
ipvsadm-1.27-7.el7.x86_64.rpm | 45 kB 00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装 : ipvsadm-1.27-7.el7.x86_64 1/1 
  验证中 : ipvsadm-1.27-7.el7.x86_64 1/1 

已安装:
  ipvsadm.x86_64 0:1.27-7.el7                                                                                                        

完毕!

在dir分发器上编写路由转发的内核配置和iptables配置,内核开启路由转发需要指定对应的网卡,这里需要注意服务器实际的网卡名称

#! /bin/bash
#在系统内核配置中开启路由转发,转发需要注意自己服务器真实网卡名称
echo 1 > /proc/sys/net/ipv4/ip_forward 
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens36/send_redirects
#清空iptables规则,并配置nat表在POSTROUTING链中对192.168.1.0网段进行数据包的转发
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE  
#配置ipvsadm,这里设置的是加权最少链接轮询的方式。ipvsadm配置指定dir外网ip对应内网的rs角色ip,-w并指定被轮询的次数
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C 
$IPVSADM -A -t 192.168.182.130:80 -s wlc -p 3
$IPVSADM -a -t 192.168.182.130:80 -r 192.168.1.223:80 -m -w 1
$IPVSADM -a -t 192.168.182.130:80 -r 192.168.1.234:80 -m -w 1

查看ipvsadm的轮询配置

[root@Huaching-2 src]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.182.130:http wlc persistent 3
  -> 192.168.1.223:http           Masq    1      0          0         
  -> 192.168.1.234:http           Masq    1      0          0    

在rs上将网卡的网关设置为dir的内网ip,这样就能让iptables规则从192.168.249.129把访问请求转发给192.168.1.0网段的80服务器端口
如rs1的修改操作

[root@aaa ~]# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=enp0s3
UUID=bf8adc16-a9c3-494a-b47e-f572fad38639
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.1.234
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.220
DNS2=119.29.29.29

rs的网关设置为dir的ip后,rs不能够链接外部网络了,需要配置iptables转发规则,对内网数据进行转发,dir分发器对内网的数据进行转发处理。处理完的数据发送给dir分发器,再由分发器返回给用户端进行响应

访问测试

先在dir上对后端的两台web服务进行测试访问,dir到后端web是属于一个网段的,这里必须要保证dir到web之间的链路要通信正常

[root@localhost src]# curl -I 192.168.1.223
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 09 Sep 2018 02:52:48 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
​
[root@localhost src]# curl -I 192.168.1.234
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 09 Sep 2018 10:53:10 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes

dir到web间的网络正常后,再测试ipvsadm的负载均衡转发,这里需要保证dir测试的机器和客户端间是可以访问的,可以在浏览器中访问,为了区分负载均衡,这里将1.223和1.234写入不同的网页显示内容,方便区分

[root@localhost src]# curl 192.168.182.130
host2
[root@localhost src]# curl 192.168.182.130
host1
[root@localhost src]# curl 192.168.182.130
host2
[root@localhost src]# curl 192.168.182.130
host1

测试时ipvsadm的-p选项是指定多长时间内同一用户访问分配到同一台服务器进行处理,测试时去掉-p参数,也就是让访问不同web服务器的时候没有等待时间及缓存

猜你喜欢

转载自blog.51cto.com/8844414/2172919