基于Linux的负载均衡集群软件
· LVS
全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件
· Nginx
支持四层和七层(应用层)负载均衡
· HAProxy
和Nginx一样,也可同时支持四层和七层(应用层)负载均衡
基于Linux的高可用集群软件
· Keepalived
Keepalived是Linux中一个轻量级高可用集群部署软件,最初是为LVS设计的,后加入了VRRP功能,
可以实现集群的心跳检测、虚拟IP漂移等功能
· Heartbeat
Heartbeat的功能与Keepalived功能类似,但是不控制虚拟IP的漂移,相对Keepalived更擅长对资
源服务的控制,配置也比较复杂
· Pacemaker
Pacemaker是一款在Linux中应用非常广泛的开源集群资源管理器,它本身不具备集群心跳检测
机制,需依赖Corosync或Heartbeat,可同时适用于任何规模的集群
集群中的常见概念-VIP和地址漂移
· VIP:虚拟IP。在高可用集群中,一般使用VIP向外提供服务,可避免集群中某台主机宕机后可能引起的业务访问IP发生变化
· 地址漂移:在高可用集群中,VIP从某一台主机迁移到另外一台主机称为地址漂移(对终端来说是透明的,是无法检测到的,速度很快)
终端直接访问Server A或是Server B都不好,如果发生地址漂移,对终端用户都不好,所以直接访问VIP的IP地址,不论是从11到12,112都能访问。
集群中的常见概念-心跳和脑裂
· 心跳:在高可用集群中,主机之间会相互监控彼此对方的状态,以决定哪台主机提供服务,这一机制称为心跳
· 脑裂:如果节点之间的心跳通信中断或不正常,会导致彼此之间抢夺资源,这种现象称为脑裂(故障现象)
Server A 和Server B是一个整体, 它们会通过串口线缆连接起来,利用其做心跳检测,还有一个千兆接口作为备用路线
集群中的常见概念-代理
代理可分为正向代理和反向代理,一般用于负载均衡集群
正向代理和反向代理是相对于被代理者来说的,正向代理被代理的是客户端,反向代理被代理的是服务端
![](https://i-blog.csdnimg.cn/direct/1d9c4ba6b4e84e4f9441a9cd6e4e98b9.png)
![](https://i-blog.csdnimg.cn/direct/983187fa3c0d44a09e258a0942d8abc4.png)
代理局域网访问互联网 发布内网服务器让公网用户访问(安全性更高)
LVS在企业IT架构中的位置
三层架构(这里最后一层存储层省略了)
最外面是客户端
![](https://i-blog.csdnimg.cn/direct/595ad8c2a5d146ff98ba5470a0dc8680.png)
对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势
DR 模式
* 负载各节点服务器通过本地网络连接,不需要建立专用的IP隧道
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标MAC地址改成后端真实服务器的MAC地址(R-MAC)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器。
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
NAT模式
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP)。真实服务器响应完请求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
优点:集群中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
缺点:扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负载均衡器,因此负载均衡器将成为整个系统的瓶颈。
两者的区别:
DR模式不使用调度器为公司网关,而是路由设备,调度器只是分配访问的请求任务而回应的web页面,不经过调度器,直接通过网络设备回应,不容易造成阻塞而且所有节点都使用VIP地址。
在nat模式群集中,LSV负载均衡调度器是所有节点的访问internet的网关服务器其外网口地址也最为整个群集的VIP地址,调度器是整个公司网关任何请求都要经过调度器,包括回应的。
LVS的工作模式-DR
在DR模式中,所有的RS需要配置两个地址:RIP和VIP
在DR模式中,LVS会通过arp获取到所有RS的IP地址和对应的MAC
地址,因此LVS和RS需处于同一二层网络中
当User发送请求到LVS后,LVS保持源目IP地址和端口号不变,同
时将源MAC地址换成自己的MAC地址,目的MAC地址换成调度到
的RS MAC进行转发
RS在回响应报文时,源地址是VIP地址,源端口号为提供服务的
端口号,源MAC地址为自己的MAC地址,目的地址为客户端地址,
目的端口号为客户端发起连接请求时的随机端口,目的MAC地
址为网关的MAC地址
![](https://i-blog.csdnimg.cn/direct/6af1cdfd4b234070a6ad55ffae116b30.png)
DR简单实验
本实验共使用四台虚拟机,其中一台配置为LVS服务器,两台用于Nginx服务器的搭建,剩
余一台为Client。其中Nginx服务器可以和上一实验复用,LVS仅需要一个网卡即可,删除
10.0.0.10所在的网卡,并将192.168.1.10所在网卡的地址修改为10.0.0.10。两台Nginx服务
器和LVS服务器处于同一子网中,客户端处于另外一个子网。Nginx服务器和LVS服务器配
置dummy类型的接口接口角于承载VIP。
![](https://i-blog.csdnimg.cn/direct/2446aabe101d43c7a3064cad4618bce7.png)
1、后端服务器(1.12、1.13)批量安装nginx
然后提供一个默认主页
![](https://i-blog.csdnimg.cn/direct/e42957dc308344e780ec46a1d2760bc2.png)
在实际中,后端页面要是一模一样的,这里是为了看效果
然后覆盖
![](https://i-blog.csdnimg.cn/direct/02c1cfbd94b942368cde821f75e9c298.png)
设为开机自启动
![](https://i-blog.csdnimg.cn/direct/5fdd35641347428eb89ba9ae96fdf703.png)
![](https://i-blog.csdnimg.cn/direct/1f87adc68c56419f9d1d3ce188df1290.png)
1、绑定vip
网络上需增加VIP的相关配置
![](https://i-blog.csdnimg.cn/direct/97adfecaca634c2d92a550d30efd0a7c.png)
2、修改arp内核配置
vim /etc/sysctl.conf
在最后加上
![](https://i-blog.csdnimg.cn/direct/bb6f492c84d24c72a97776884df6b735.png)
修改后立即生效
sysctl -p
ip a
![](https://i-blog.csdnimg.cn/direct/11cbf34c73594bb4b5c6865f9ed9e623.png)
到这里后端操作就完成了
2、处理代理(1.11)
1、首先绑定VIP
![](https://i-blog.csdnimg.cn/direct/cf1033cf858b415f9a4b62476c06e6b0.png)
2、安装管理工具
![](https://i-blog.csdnimg.cn/direct/7d930aa7db0d4f4cb95885413a48affc.png)
查看是否有配置 (这里是没有的)
![](https://i-blog.csdnimg.cn/direct/2b6764182503418bbfb3e10c3e4bf0d8.png)
3、LVS配置
[相关参数说明]
[root@Directory ~]# ipvsadm -help
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式 :- g、-i分别对应DR、TUN模式
-w 为节点服务器设置权重,默认为1
ipvsadm -At 192.168.1.10:80 -s rr
ipvsadm -at 192.168.1.10:80 -r 192.168.1.12:80 -g 添加后端服务器
ipvsadm -at 192.168.1.10:80 -r 192.168.1.13:80 -g 添加后端服务器
![](https://i-blog.csdnimg.cn/direct/015f462314874e4d8089255ed2a008d4.png)
再次查询
![](https://i-blog.csdnimg.cn/direct/d049dc9534ce4bc683988d9a673b0171.png)
3、(1.14)测试
![](https://i-blog.csdnimg.cn/direct/6ab635bc700c44c484cd962d66f3eb11.png)
比例是1:1
脚本-DR设置
首先把之前的操作都清除一下
![](https://i-blog.csdnimg.cn/direct/caae7a8468ff4672b51c1657f0a0ff9f.png)
删除网络
![](https://i-blog.csdnimg.cn/direct/223b4a61a95442c58214db5388149cc6.png)
编写脚本
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR
LOCK
=
/var/lock/ipvsadm.lock
VIP
=
192
.168.1.10
RIP1
=
192
.168.1.12
RIP2
=
192
.168.1.13
DipName
=
ens160
. /etc/rc.d/init.d/functions
start
() {
PID
=
`ipvsadm -Ln | grep
${VIP}
| wc -l`
if
[
$PID
-gt
0
];
then
echo
"The LVS-DR Server is already running !"
else
#Set the Virtual IP Address
/sbin/ifconfig
${DipName}
:10
$VIP
broadcast
$VIP
netmask
255
.255.255.255 up
/sbin/route add
-host
$VIP
dev
${DipName}
:10
#Clear IPVS Table
/sbin/ipvsadm
-C
#Set Lvs
/sbin/ipvsadm
-At
$VIP
:80
-s
rr
/sbin/ipvsadm
-at
$VIP
:80
-r
$RIP1
:80
-g
/sbin/ipvsadm
-at
$VIP
:80
-r
$RIP2
:80
-g
/bin/touch
$LOCK
#Run Lvs
echo
"starting LVS-DR Server is ok !"
fi
}
stop
() {
#clear Lvs and vip
/sbin/ipvsadm
-C
/sbin/route del
-host
$VIP
dev
${DipName}
:10
/sbin/ifconfig
${DipName}
:10 down >/dev/null
rm
-rf
$LOCK
echo
"stopping LVS-DR server is ok !"
}
status() {
if
[
-e
$LOCK
];
then
echo
"The LVS-DR Server is already running !"
else
echo
"The LVS-DR Server is not running !"
fi
}
case
"
$1
"
in
start
)
start
;;
stop
)
stop
;;
restart
)
stop
start
;;
status)
status
;;
*)
echo
"Usage:
$1
{start|stop|restart|status}"
exit
1
esac
exit
0
设置开机自启
确认是否绑定
测试
![](https://i-blog.csdnimg.cn/direct/aa2cfcf5d8434203a958ade615f44372.png)
后端脚本
如果做了之前的操作,记得删除一下
编写脚本
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK
=
/var/lock/ipvsadm.lock
VIP
=
192
.168.95.10
. /etc/rc.d/init.d/functions
start
() {
PID
=
`ifconfig | grep lo:10 | wc -l`
if
[
$PID
-ne
0
];
then
echo
"The LVS-DR-RIP Server is already running !"
else
/sbin/ifconfig lo:10
$VIP
netmask
255
.255.255.255 broadcast
$VIP
up
/sbin/route add
-host
$VIP
dev lo:10
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/eth0/arp_ignore
echo
"2"
>/proc/sys/net/ipv4/conf/eth0/arp_announce
echo
"1"
>/proc/sys/net/ipv4/conf/all/arp_ignore
echo
"2"
>/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch
$LOCK
echo
"starting LVS-DR-RIP server is ok !"
fi
}
stop
() {
/sbin/route del
-host
$VIP
dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
echo
"0"
>/proc/sys/net/ipv4/conf/lo/arp_ignore
echo
"0"
>/proc/sys/net/ipv4/conf/lo/arp_announce
echo
"0"
>/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo
"0"
>/proc/sys/net/ipv4/conf/eth0/arp_announce
echo
"0"
>/proc/sys/net/ipv4/conf/all/arp_ignore
echo
"0"
>/proc/sys/net/ipv4/conf/all/arp_announce
rm
-rf
$LOCK
echo
"stopping LVS-DR-RIP server is ok !"
}
status() {
if
[
-e
$LOCK
];
then
echo
"The LVS-DR-RIP Server is already running !"
else
echo
"The LVS-DR-RIP Server is not running !"
fi
}
case
"
$1
"
in
start
)
start
;;
stop
)
stop
;;
restart
)
stop
start
;;
status)
status
;;
*)
echo
"Usage:
$1
{start|stop|restart|status}"
exit
1
esac
exit
0
![](https://i-blog.csdnimg.cn/direct/518bbc82df084a81b989b9342a19fe4f.png)
测试
![](https://i-blog.csdnimg.cn/direct/f9c62201a6d14f9c8f8973ff6f82e5f3.png)
arp防火墙设置
首先同样把之前的配置修改回去
下载arp
![](https://i-blog.csdnimg.cn/direct/41b39b5c56334bcdaeaaa4771b7cf7b3.png)
刚下载好的arp里没有任何配置
也可以使用
arptables
实现抑制
arp
![](https://i-blog.csdnimg.cn/direct/86ae115e917a49e8ba237bc5f5d20664.png)