目录
一、负载均衡集群介绍
二、LVS介绍
三、LVS调度算法
四、LVS NAT模式搭建
一、负载均衡集群介绍
负载均衡集群不难理解,简单说就是让多台服务器均衡地去承载压力。
实现负载均衡集群的开源软件有LVS、keepalived、haproxy、Nginx等。
其中LVS属于4层(网络OSI 7层模型传输层),nginx属于7层(应用层),haproxy既可以认为是4层,也可以当做7层使用。
keepalived的负载均衡功能其实就是lvs。
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种。
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求。
二、LVS介绍
LVS(Linux Virtual Server)是由国内大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。
LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)。
LVS根据实现方式的不同,主要分为三种类型:NAT模式、IP Tunnel(IP隧道)模式、DR模式。
- LVS三种模式介绍:
- NAT模式
- 这种模式借助iptables的nat表来实现
- 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
- rs需要设定网关为分发器的内网ip
- 用户请求的数据包和返回给用户的数据包全部经过分发器,分发器的性能和网络的带宽、质量会成为整个集群的瓶颈
- NAT模式下处理请求的机器数量不能太多,相对其他模式能处理的请求数较少
- 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
- IP Tunnel模式
- 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
- 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
- rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
- rs处理完请求后根据路由表将响应报文直接返回给客户端,不再经过分发器,此时分发器不再是集群性能的瓶颈
- 这种模式下,需要给分发器和所有的rs全部分配公网IP,所以比较浪费公网IP
- DR模式
- 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
- 和IP Tunnel不同的是,这种模式下不会封装IP,而是将数据帧的MAC地址改为rs的MAC地址
- rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
三、LVS调度算法
- 轮询 Round-Robin rr //均衡的将用户请求分发到每一个rs上
- 加权轮询 Weight Round-Robin wrr //带权重的轮询,依照指定的权重比来分发请求
- 最小连接 Least-Connection lc //将请求分发到连接数比较少的rs上
- 加权最小连接 Weight Least-Connection wlc //带权重的最小连接
- 基于局部性的最小连接 Locality-Based Least Connections lblc
- 带复制的基于局部性最小连接 Locality-Based Least Connections with
Replication lblcr- 目标地址散列调度 Destination Hashing dh
- 源地址散列调度 Source Hashing sh
- 常用的是前4种
四、LVS NAT模式搭建
- 实验环境
需要3台虚拟机,1台作调度器dir,2台作真实服务器rs。
NAT模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP。
三台机器都关闭firewalld服务,并安装启动iptables-serives,清空iptables规则。
三台机器都关闭SElinux。
分发器dir
主机名:minglinux-03
内网IP 192.168.162.128
公网IP 192.168.150.123 vmware仅主机网络模式
VMware设置内网的网卡设为NAT模式,连接外网的网卡设为仅主机模式
真实服务器rs1
主机名:minglinux-01
内网IP 192.168.162.130
真实服务器rs2
主机名:minglinux-02
内网IP 192.168.162.132
- 分发器虚拟机网络设置
[root@minglinux-03 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens33 //ifcfg-ens33网卡连接内网
[root@minglinux-03 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens37
//ifcfg-ens37网卡连接公网,网段为VMware仅主机网络模式子网网段
[root@minglinux-03 ~] ifup ens37
[root@minglinux-03 ~] ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7a:0f:05 brd ff:ff:ff:ff:ff:ff
inet 192.168.162.128/24 brd 192.168.162.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:f05/64 scope link
valid_lft forever preferred_lft forever
3: ens37: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7a:0f:0f brd ff:ff:ff:ff:ff:ff
inet 192.168.150.123/24 brd 192.168.150.255 scope global ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:f0f/64 scope link
valid_lft forever preferred_lft forever
- rs虚拟机网络设置
两台rs均设置内网网关为dir的内网IP(192.168.162.128)
//rs1网关设置
[root@minglinux-01 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@minglinux-01 ~] ifdown ens33 && ifup ens33
[root@minglinux-01 ~] route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.162.128 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
192.168.162.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
//rs2网关设置
[root@minglinux-02 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@minglinux-02 ~] ifdown ens33 && ifup ens33
[root@minglinux-02 ~] route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.162.128 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
192.168.162.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
- 3台机器防火墙设置
3台机器都执行如下命令:
systemctl stop firewalld
systemctl disable firewalld
yum install -y iptables-services //安装iptables服务
systemctl start iptables //启动服务
systemctl enable iptables //开机启动
iptables -F
service iptables save
setenforce 0 //临时关闭SElinux,修改selinux配置文件/etc/selinux/config可永久生效
//此时两台rs机器由于网关修改无法上网,安装iptables-services操作需先将网关改回
epel源下载安装速度慢的话可以临时将epel源取消,方法如下:
[root@minglinux-01 ~] cd /etc/yum.repos.d
[root@minglinux-01 /etc/yum.repos.d] ls
CentOS7-Base-163.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-Media.repo epel.repo
CentOS-Debuginfo.repo CentOS-Sources.repo epel-testing.repo
[root@minglinux-01 /etc/yum.repos.d] mv epel.repo epel.repo.1
[root@minglinux-01 /etc/yum.repos.d] yum list |grep iptables-service
iptables-services.x86_64 1.4.21-24.1.el7_5 @updates
iptables-services.x86_64 1.4.21-28.el7 base
[root@minglinux-01 /etc/yum.repos.d] yum install -y iptables-services
- 在dir上安装ipvsadm和配置脚本
ipvsadm是实现LVS的核心工具
[root@minglinux-03 ~] yum install -y ipvsadm
[root@minglinux-03 ~] vim /usr/local/sbin/lvs_nat.sh //新建一个脚本
//写入以下内容
#! /bin/bash
# director 调整linux系统内核参数,开启路由转发功能,让数据包能转发到后端rs上
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 //清空nat表的规则
iptables -t nat -X //清空nat表中所有的链
iptables -t nat -A POSTROUTING -s 192.168.162.0/24 -j MASQUERADE
//让同网段的内网可以上网
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C //ipvsadm的-C选项清空规则
$IPVSADM -A -t 192.168.150.123:80 -s lc -p 3
//-A增加Virtual Server,-t为TCP,-s选项指定调度算法,lc为最小连接算法。
//-p指定超时时间,即在一段时间内(3s),来自同一客户端的请求会被分发到相同的rs上
$IPVSADM -a -t 192.168.150.123:80 -r 192.168.162.130:80 -m -w 1
$IPVSADM -a -t 192.168.150.123:80 -r 192.168.162.132:80 -m -w 1
//-a增加rs,-r指定rs的IP,-m表示LVS的模式为NAT(masquerad)
//如果是-g表示LVS模式为DR,-i表示LVS模式为IP Tunnel,-w指定权重。
[root@minglinux-03 ~] sh !$ //执行脚本
sh /usr/local/sbin/lvs_nat.sh
- NAT模式效果测试
两台rs需安装有nginx并启动nginx
设置两台rs不同的主页,做一个区分
[root@minglinux-01 ~] echo "This is rs1" > /data/wwwroot/default/index.html
[root@minglinux-01 ~] curl localhost
This is rs1
[root@minglinux-02 ~] echo "This is rs2" > /usr/share/nginx/html/index.html
[root@minglinux-02 ~] curl localhost
This is rs2
windows浏览器访问测试
脚本中设置了3s的长久连接,此时连续刷新页面并不改变
修改lvs_nat.sh脚本去掉指定超时连接的设定
[root@minglinux-03 ~] vim /usr/local/sbin/lvs_nat.sh
[root@minglinux-03 ~] sh !$
sh /usr/local/sbin/lvs_nat.sh
[root@minglinux-03 ~] 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.150.123:80 lc
-> 192.168.162.130:80 Masq 1 0 0
-> 192.168.162.132:80 Masq 1 0 0
修改lvs_nat.sh脚本中使用的算法为rr
在dir上使用curl测试:
//请求均衡地发送到后端的rs上
[root@minglinux-03 ~] vim /usr/local/sbin/lvs_nat.sh
[root@minglinux-03 ~] sh /usr/local/sbin/lvs_nat.sh
[root@minglinux-03 ~] curl 192.168.150.123
This is rs2
[root@minglinux-03 ~] curl 192.168.150.123
This is rs1
[root@minglinux-03 ~] curl 192.168.150.123
This is rs2
[root@minglinux-03 ~] curl 192.168.150.123
This is rs1
扩展
lvs 三种模式详解 http://www.it165.net/admin/html/201401/2248.html
lvs几种算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html
关于arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
lvs原理相关的 http://blog.csdn.net/pi9nc/article/details/23380589