本文索引:

  • 负载均衡集群介绍
  • LVS介绍
  • LVS的调度算法
  • LVS NAT模式搭建

负载均衡集群介绍

负载均衡集群主流软件LVS、keepalived、haproxy、nginx等。其中LVS属于4层的负载均衡,nginx属于7层的负载均衡。而haproxy既可以认为是4层负载均衡,也可以当做7层负载均衡使用。

keepalived的负载均衡功能实际上就是内置的LVS实现的。LVS的负载均衡是可以分发除80端口外的其他端口通信的,比如MySQL;nginx仅支持http、https、mail;haproxy也支持MySQL等端口的分发。

相对而言,LVS更稳定,能承受更多的请求;nginx则更灵活,能实现更多的个性化需求。


LVS介绍

LVS是中国人章文嵩开发的一款世界知名的开源软件,流行度不亚于apache的httpd,基于TCP/IP做的路由与转发,稳定性和效率很高。

LVS最新版本基于Linux内核2.6,但是多年未更新了。LVS有三种参见的模式:NAT、DR、IP Tunnel。

LVS架构中有一个核心角色叫做分发器(Load Balance),用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称RS)。

LVS NAT模式

NAT模式是借助iptables的nat表来实现的。

  • 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的RS上去。
  • RS需要设定网关为分发器的内网ip
  • 用户请求的数据包和返回给用户的数据包全部经过分发器,因此分发器容易成为瓶颈(10台以下RS还是可以的);

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

LVS IP Tunnel模式

需要有一个公共的ip配置在分发器和所有的RS上,该公共ip称为vip。

  • 客户端请求的目标ip为vip,分发器接收到请求数据包后,会对数据包做一个处理,把目标ip改为RS的ip,再传送给RS上;
  • RS接收到数据包后,会还原原始数据包,这样目标ip为vip,因为所有的RS上都配置了这个vip,所以它会认为是它自己。
LVS DR模式

DR模式也需要有一个公共的ip -- vip:分发器和所有RS上都需要配置。

  • 客户端请求的目标ip为vip,分发器接收到请求数据包后,会对数据包做一个处理,把数据包的MAC地址改为RS的MAC地址,再传送给RS上;
  • RS接收到数据包后,会还原原始数据包,这样目标ip为vip,因为所有的RS上都配置了这个vip,所以它会认为是它自己。

LVS的调度算法

  • rr(Round Robin)轮询 依次将请求均匀的发送给负载均衡集群内的RS上,其特点是实现简单。轮询算法假设所有的服务器处理请求的能力相同,分发器会将所有的请求平均分配给每个RS。
  • wrr 加权轮询 轮询算法的补充,通过给负载均衡集群内RS设置权重,LVS会通过这个权重来对区别化处理:权重高的处理更多的请求,权重少的处理较少的请求。
  • lc(least connection)最小连接 将新的请求发送给当前连接数最小的服务器(最空闲的RS上)
  • wlc(weight least connection)加权最小连接 将新的请求发送给权重较高,同时处理请求较少的RS上。
  • lblc(locality-based least connection)基于局部性的最小连接 针对请求的目标IP地址寻找最近的该目标ip地址所有使用的服务器,如果这台服务器可用,并可以处理请求,那么分发器将会尽量选择相同的服务器,否则会继续选择其他可行的服务器。
  • lblcr(locality-based least connections withreplication)带复制的基于基本性最小连接,它会维护一个目标ip到一组服务器之间的映射关系,防止某个服务器负载过高。
  • dh(Destination Hashing)目标地址散列调度 将目标ip地址通过散列函数将ip与服务器建立映射关系,当出现服务器不可用或负载过高时,把同一个ip地址的请求,发送给同一个server。
  • sh(Source Hashing)源地址散列调度 与dh(目标地址散列调度)类似,其根据源地址建立映射,同样将同一个ip地址的请求发个同一个服务器。将此前建立的session信息保留。

LVS NAT模式搭建

主要由地址转换(NAT)、直接路由(DR)和隧道(TUN)。用的比较多的是前2种,下面介绍如何搭建NAT/DR方法。

10台机器以内的可以使用NAT模式,其优点在于节省公网ip资源,节约成本。也可以将内网内主机都用来搭建LVS(都配置私有ip),使用一个公网ip进行映射,同样起到节省ip的效果。

实例准备

  • 分发器(调度器dir) 内网:192.168.65.130 外网:192.168.19.128
  • rs1 内网:192.168.65.133 网关:192.168.65.130(分发器内网ip)
  • rs2 内网:192.168.65.134 网关:192.168.65.130(分发器内网ip)

修改rs1/rs2的网关的操作最好在准备阶段的最后再进行操作,否则将导致机器无法联网,后续可能需要的yum安装无法操作。

rs1/2上关闭firewalld,使用iptables

# 分发器、rs1、rs2都执行下列代码
# 关闭firewalld
systemctl disable firewalld
systemctl stop firewalld
# 开启iptables
yum install -y iptables-services
systemctl enable iptables
systemctl start iptables
# 清空规则
iptables -F
service iptables save
# 关闭selinux
vi /etc/selinux/config
SELINUX=disabled

分发器上需要安装ipvsadm

[root@director ~]# yum install -y ipvsadm
[root@director ~]# vi /usr/local/sbin/lvs_nat.sh
#! /bin/bash

# 服务器上开启路由转发功能
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

# 注意区分网卡名字
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects

# 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.65.0/24  -j MASQUERADE

# 设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C

# -A 增加规则
# -s指定LVS调度算法,这里选rr可以均衡分配请求;
# 还可以使用-p参数来指定超时时间,在该时间内将请求分发到一个RS上
$IPVSADM -A -t 192.168.19.128:80 -s rr 
# -r指定rs的ip;-m表示为nat模式;-w指定权重
$IPVSADM -a -t 192.168.19.128:80 -r 192.168.65.133:80 -m -w 1
$IPVSADM -a -t 192.168.19.128:80 -r 192.168.65.134:80 -m -w 1

rs1和rs2上安装nginx

rs1和rs2上编辑默认主机网页进行区分
[root@test1 ~]# yum install nginx
[root@test1 ~]# vim /usr/share/nginx/html/index.html 
this is RS1

[root@test2 ~]# yum install nginx
[root@test2 ~]# vim /usr/share/nginx/html/index.html 
this is RS2

运行脚本,进行测试

[root@director ~]# sh /usr/local/sbin/lvs_nat.sh

# 访问配置的官网ip
[root@director ~]# curl 192.168.19.128:80 
this is RS1

# 2台rs都分发了请求,达到均衡的效果
[root@director ~]# 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.19.128:80 rr
  -> 192.168.65.133:80            Masq    1      0          1         
  -> 192.168.65.134:80            Masq    1      0          1

可以修改lvs_nat.sh内的LVS调度算法来显示不同的效果,注意每次修改完脚本后要立即执行,使配置生效。