LVS负载均衡搭建

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在三台机器上都有设置。锁只能用浏览器来测试结果,如下所示:

这样就做到了均衡访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值