LVS-负载均衡集群
LVS(Linux Virtual Server)是一款四层负载均衡软件,针对TCP/IP做的转发和路由。
LVS架构中有一个核心的角色叫做调度器(load blancer)用来分发用户的请求,还有诸多的真实服务器(real Server)也就是处理用户请求的服务器。
LVS根据实现方式不同主要分为三种模式:NAT模式、IP Tunnel(IP隧道)模式、DR模式。
以下图片均来源于网络
NAT模式LVS搭建
在NAT模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP。
此架构需要三台机器,IP分配如下:
调度器dir:192.168.153.134(内网IP),192.168.32.129(公网IP,vmware仅主机模式模拟)
真实服务器rs1:192.168.153.135(内网IP)
真实服务器rs2:192.168.153.136(内网IP)
首先真实服务器rs1:135/rs2:136上需要把内网网管设置为dir的内网IP.
把三台服务器的iptables规则清空并保存
iptables -F; iptables -t nat -F; serviceiptables save
在dir上安装ipvsadm,这是实现LVS的核心工具
yum install -y ipvsadm
在dir上编写脚本
vim /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
# 注意区分网卡名字,我的两个网卡分别为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 -s192.168.153.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.32.129:80 -s wlc -p300
$IPVSADM -a -t 192.168.32.129:80 -r192.168.153.135:80 -m -w 1
$IPVSADM -a -t 192.168.32.129:80 -r192.168.153.136:80 -m -w 1
脚本参数说明:
ipvsadm的-C选项可以清空规则,防止之前的规则有影响。
-A增加Virtual Server
-t 为TCP
-s 选项指定调度算法 wlc为带权重的最小连接算法
-p指定超时时间,表示在指定的秒内相同用户的请求会一直被调度到同一台rs上(测试时不要加这个参数)
-a 增加rs
-r 指定rs的IP
-m 表示LVS的模式为NAT
-g表示LVS的模式为DR
-I 表示LVS的模式为IP Tunnel
-w 指定权重
编辑完脚本后直接执行就完成了LVS的配置
bash /usr/local/sbin/lvs_nat.sh
把dir上的nginx服务器关闭
为了容易区分,分别给135和136设置一个主页:
echo "rs1" >/usr/share/nginx/html/index.html 153.135
echo "rs2" >/usr/share/nginx/html/index.html 153.136
因为是测试我是yum安装的nginx,所以默认主页路径是在usr/share下
在dir上分别访问rs1和rs2
# curl 192.168.153.135
rs1
# curl 192.168.153.136
rs2
然后在dir上直接访问dir的外网IP(192.168. 32.129):
# curl 192.168.32.129
rs2
# curl 192.168.32.129
rs1
# curl 192.168.32.129
rs2
# curl 192.168.32.129
rs1
# curl 192.168.32.129
rs2
# curl 192.168.32.129
rs1
# curl 192.168.32.129
rs2
]# curl 192.168.32.129
rs1
这样就做到了均衡访问DR模式LVS搭建
DR模式下同样三台虚拟机,三台机器只需要公网IP
在这种模式下又多了一个VIP(VIP概念请参考之前关于高可用的文章)
此架构同样需要三台服务器,如下
调度器dir :192.168.153.134
真实服务器rs1:192.168.153.135
真实服务器rs2::192.168.153.136
VIP:192.168.153.110
在dir下配置shell脚本如下:
vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.153.110
rs1=192.168.153.135
rs2=192.168.153.136
#注意这里的网卡名字
ifconfig ens33:2 $vip broadcast $vipnetmask 255.255.255.255 up
route add -host $vip dev ens33: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上也需要编写脚本(rs上脚本内容一样)
vim /usr/local/sbin/lvs_dr_rs.sh
#/bin/bash
vip=192.168.153.110
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
编辑好脚本后分别在三台机器上执行各自脚本
为了容易区分,分别给135和136设置一个主页:
echo "rs1" >/usr/share/nginx/html/index.html 153.135
echo "rs2" >/usr/share/nginx/html/index.html 153.136
在浏览器输入vip地址刷新就会发现rs1rs2 会交替出现,成功做到了均衡访问。