负载均衡集群介绍及NAT模式LVS搭建

1.负载均衡集群介绍

      目前,负载均衡集群主流的开源软件有LVS、keepalived、haproxy、nginx等,其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用。

     lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种相比较来说,LVS这种4层的更稳定,能承受更多的请求,keepalived的负载均衡功能其实就是lvs。而nginx这种7层的更加灵活,能实现更多的个性化需求。

      商业的负载均衡解决方案稳定性比较好,但是成本非常昂贵,所以以开源的LVS为主。

2.LVS介绍

       LVS(Linux Virtual Server)是由国内大牛章文嵩开发的,它是基于Linux2.6内核的,已经有很多年没有更新了。LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)。

      LVS有三种常见的模式:NAT模式、IP Tunnel(IP隧道)模式、DR模式。

2.1 NAT模式

1)这种模式借助iptables的nat表来实现;

2)用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去;

3)rs需要设定网关为分发器的内网ip;

4)用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈;

5)在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源;

负载均衡集群介绍及NAT模式LVS搭建_第1张图片

2.2 IP Tunnel模式

1)这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip;

2)客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上;

3)rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己;

负载均衡集群介绍及NAT模式LVS搭建_第2张图片

       调度器(Load Balancer)将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给真实服务器。真实服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所有就处理这个请求,然后根据路由表将响应报文直接返回给客户。这种模式下,需要给调度器和所有的真实服务器全部分配公网IP,所有比较浪费公网IP。

2.3 DR模式

1)这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip;

2)和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址;

3)rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己;

负载均衡集群介绍及NAT模式LVS搭建_第3张图片

       

       NAT模式适合小型的集群,机器数量不多,它的优势是节省公网IP。而TUN和DR相差不大,都能支撑较大规模的集群,但缺点是浪费公网IP。

3.LVS的调度算法

      调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种;

3.1 轮询调度(Round-Robin-rr)

      非常简单的一种调度算法,就是按顺序把请求一次发送给后端的服务器,它不管后端服务器的处理速度和相应时间怎样。但当后端服务器性能不一致时,用这种调度算法就不合适了;

3.2 加权轮询(Weight Round-Robin-wrr)

       比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重;

3.3 最小连接(Least-Connection-lc)

      这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数越少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理;

3.4 加权最小连接(Weight Least-Connection-wlc)

      在最小连接调度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务器上多分配请求,哪些少分配请求;

3.5 基于局部性的最小连接(Locality-Based Least Connections-lblc)

       是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址使变化的。算法设计的穆鸟是在服务器的负载在基本平衡的情况下,将相同目标IP的请求调度到同一台服务器,来提高各台服务器的访问局部性和贮存Cache命中率;

3.6 带复制的基于局部性最小连接(Locality-Based Least Connections with Replication-lblcr)

       也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护一个目标IP地址到一台服务器的映射。LBLCR算法先更换请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度;

3.7 目标地址散列调度(Destination Hashing-dh)

       该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数讲一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列建(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

3.8 源地址散列调度(Source Hashing-sh)

       该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它的算法流程与目标地址散列调度算法基本类似,只不过请求的目标IP地址换成请求的源IP地址。

4.NAT模式搭建

准备三台机器,且三台机器上的防火墙和selinux都处于关闭状态。

128机器做分发器,也叫调度器,简写为dir。

负载均衡集群介绍及NAT模式LVS搭建_第4张图片

在128的虚拟机设置里将第二块网卡设置为仅主机模式,设置第二块网卡的IP;

[root@yuioplvlinux-128 ~]# ifconfig 
ens33: flags=4163  mtu 1500
        inet 192.168.30.128  netmask 255.255.255.0  broadcast 192.168.30.255
        inet6 fe80::9c36:c384:f224:23f4  prefixlen 64  scopeid 0x20
        ether 00:0c:29:96:17:9a  txqueuelen 1000  (Ethernet)
        RX packets 115  bytes 15066 (14.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 131  bytes 13467 (13.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163  mtu 1500
        inet 192.168.30.136  netmask 255.255.255.0  broadcast 192.168.30.255
        ether 00:0c:29:96:17:9a  txqueuelen 1000  (Ethernet)

ens37: flags=4163  mtu 1500
        inet 192.168.169.128  netmask 255.255.255.0  broadcast 192.168.169.255
        inet6 fe80::5c27:9948:9b95:afdf  prefixlen 64  scopeid 0x20
        ether 00:0c:29:96:17:a4  txqueuelen 1000  (Ethernet)
        RX packets 3  bytes 746 (746.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 1308 (1.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

dir设置的内网IP为192.168.30.128,外网为192.168.168.128;

rs1设置的内网IP为192.168.30.129,网关为dir的内网IP地址;

rs2设置的内网IP为192.168.30.130,网关为dir的内网IP地址。


在dir使用命令“yum install -y ipvsadm”安装ipvsadm,这是实现LVS的核心工具。

在dir上编写一个脚本,保存成功后执行该脚本;

[root@yuioplvlinux-128 ~]# vim /usr/local/sbin/lvs_nat.sh

# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,阿铭的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.30.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.169.128:80 -s rr
$IPVSADM -a -t 192.168.169.128:80 -r 192.168.30.129:80 -m -w 1
$IPVSADM -a -t 192.168.169.128:80 -r 192.168.30.130:80 -m -w 1

[root@yuioplvlinux-128 ~]# sh /usr/local/sbin/lvs_nat.sh

执行脚本后,使用命令查看结果,有输出则表示正常,使用curl测试。

[root@yuioplvlinux-128 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.169.128:80 rr
  -> 192.168.30.129:80            Masq    1      0          18        
  -> 192.168.30.130:80            Masq    1      0          4         
[root@yuioplvlinux-128 ~]# curl 192.168.169.128
linux 130
[root@yuioplvlinux-128 ~]# curl 192.168.169.128
linux 129
[root@yuioplvlinux-128 ~]# curl 192.168.169.128
linux 130
[root@yuioplvlinux-128 ~]# curl 192.168.169.128
linux 129


你可能感兴趣的:(Linux)