LVS介绍
LVS(Linux Virtual Server)是由国内大牛章文嵩开发的,这款软件的流行度不亚于Apache,httpd,它是一款四层的负载均衡软件,不过LVS最新的版本是基于Linux2.6内核的,这意味着它已经有多年没有更新了。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被诸多企业应用在核心的架构当中。
在该架构中有一个核心的角色叫作调度器(Load Balancer).用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户请求的服务器。
LVS根据实现方式的不同,主要分为三种类型:NAT模式、IPTunnel(IP隧道)模式、DR模式。
1.NAT模式
这种模式的实现原理很简单,调度器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调度器有两个IP,一个是公网IP,一个是内网IP,而真实服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,它会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,但是调度器会成为一个瓶颈。
2.IP Tunnel模式
IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的VPN技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
3.DR模式
和IPTunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果直接返回给用户。不过,在这种模式下不会封装IP,而是将数据帧的MAC地址改为真实服务器的MAC地址。
LVS的官方网站给出了三种模式的比较,如下表所示:
_ | VS/NAT | VS/TUN | VS/DR |
server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low(10~20) | High(100) | High(100) |
server gateway | load balancer | own router | own router |
通过比较可以看出,NAT模式适合小型的集群,机器数量不多,它的优势是节省公网IP。 TUN和DR相差不大,都能支撑较大规模的集群,但缺点是浪费公网IP。
NAT模式LVS搭建
节点规划
NET模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP。此架构需要准备三台虚拟机。三台虚拟机的IP分配如下:
调度器dir:192.168.63.35(内网IP,vmware为NAT模式),192.168.91.131(公网IP,vmware仅主机模式)。
真实服务器rs1:192.168.63.36(内网IP)
真实服务器rs2:192.168.63.37(内网IP)
其中调度器上有两块网卡,作为内网的这块网卡使用的是NAT的网络,而作为“公网”的网卡使用的是仅主机网络。需要注意,所谓的公网其实仅仅是模拟的,并不是真正意义上的公网。
案例实施
首先,真实服务器rs1(192.168.63.36)和rs2(192.168.63.37)上要把内网的网关(GATEWAY)设置为dir的内网IP(192.168.63.35),否则实验无法成功。
将三台虚拟机分别改名为dir,rs1,rs2。
[root@localhost ~]# hostnamectl set-hostname dir
[root@localhost ~]# bash
[root@dir ~]#
[root@localhost ~]# hostnamectl set-hostname rs1
[root@localhost ~]# bash
[root@rs1 ~]#
[root@localhost ~]# hostnamectl set-hostname rs2
[root@localhost ~]# bash
[root@rs2 ~]#
将三个节点的防火墙和SELinux关闭
[root@rs2 ~]# systemctl stop firewalld
[root@rs2 ~]# setenforce 0
在dir节点安装ipvsdm。rs1和rs2安装nginx。
yum install -y ipvsadm
yum install -y nginx
继续在dir上编写一个脚本:
[root@dir ~]# vi /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# 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
# 注意区分网卡名字
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens36/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.91.131:80 -s wlc -p 300
$IPVSADM -a -t 192.168.91.131:80 -r 192.168.63.36:80 -m -w 1
$IPVSADM -a -t 192.168.91.131:80 -r 192.168.63.37:80 -m -w 1
编写后直接执行
[root@dir ~]# bash /usr/local/sbin/lvs_nat.sh
启动rs1和rs2节点的nginx服务
systemctl start nginx
测试
测试LVS的效果,如果dir节点有Nginx服务器,需要先把它关闭,否则会影响实验效果。为了更容易区分,分别给rs1,rs2设置一个默认主页,命令如下:
[root@rs1 ~]# echo "rs1" > /usr/share/nginx/html/index.html
[root@rs2 ~]# echo "rs2" > /usr/share/nginx/html/index.html
在dir上分别访问两个rs:
[root@dir ~]# curl 192.168.63.36
rs1[root@dir ~]# curl 192.168.63.37
rs2
这样就区分了rs1和rs2,然后直接在dir节点访问dir外网
连续多次访问一直请求在rs2上,是因为脚本中舍友-p参数,理论上在300秒内会一直请求在rs2上。重新编辑脚本把-p参数删除,然后再次测试,测试结果如下:
这就做到了均衡访问。
DR模式LVS搭建
节点规划
DR模式需要三台虚拟机,三台虚拟机只需要有“公网”IP,但在这种模式下又多了一个VIP。对应的机器和IP如下:
调度器dir:192.168.91.131
真实服务器rs1:192.168.91.129
真实服务器rs2:192.168.91.141
VIP:192.168.91.100
案例实施
首先把两台rs的网关改成原始网关,不能继续设置dir的IP地址了。然后我们需要再dir上编写一个shell脚本,脚本内容如下:
[root@dir ~]# vi /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.91.100
rs1=192.168.91.129
rs2=192.168.91.141
#注意这里的网卡名字
ifconfig ens36:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens36:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
两台rs上也需要编写脚本,脚本内容如下:
[root@rs1 ~]# vi /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.91.100
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
分别在三台机器上执行各自脚本:
[root@dir ~]# bash /usr/local/sbin/lvs_dr.sh
[root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh
[root@rs2 ~]# bash /usr/local/sbin/lvs_rs.sh
如果未找到命令的话可以安装一个,命令为:
[root@rs1 ~]# yum install -y net-tools
测试
执行后就可以测试了。但是这次不可以直接在dir上使用curl命令直接测试了,因为VIP在三台机器上都有设置。锁只能用浏览器来测试结果,如下所示:
这样就做到了均衡访问。