本文索引:
- 负载均衡集群介绍
- 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调度算法来显示不同的效果,注意每次修改完脚本后要立即执行,使配置生效。