LVS三种模式介绍:
-
一.DR模式(路由模式)
原理:
- 首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
- 然后负载均衡器就把客户端发送的请求数据包的目标MAC地址改成后端真实服务器的MAC地址(R-MAC)
- 真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:
需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局城网环境。
项目架构

项目规划
|
IP |
节点 |
网卡 |
用途 |
|
192.168.143.130 |
dir |
nat |
分发器 |
|
192.168.143.131 |
rs1 |
nat |
服务器 |
|
192.168.143.132 |
rs2 |
nat |
服务器 |
|
192.168.143.133 |
rs3 |
nat |
服务器 |
|
192.168.143.110 |
|
|
Vip |
项目实施
1.搭建基础环境
给所有节点关闭防火墙,selinux:
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
Iptables规则清空并保存:
需要先yum安装 iptables-sevices
# iptables -F; iptables -t nat -F; service iptables save //三台机器上都要执行
在dir节点安装LVS核心工具ipvsadm:
[root@dir ~]# yum install -y ipvsadm
给三个服务器都安装nginx:
[root@rs3 ~]# yum install -y epel-release
[root@rs3 ~]# yum install -y nginx
2.配置脚本
2.1给分发器配置脚本
[root@dir ~]# vi /usr/local/sbin/lvs_dr.sh
$ipv -a -t $vip:80 -r $rs2$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
$ipv -C
#! /bin/bash
# dir分发器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.143.110
rs1=192.168.143.131
rs2=192.168.143.132
rs3=192.168.143.133
#代理服务器是真正要响应客户机的,所以虚拟ip 配在网卡,真实服务器要把虚拟ip配置搭配lo回环网卡上
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
# 清空策略
$ipv -C
# 指定代理服务器的虚拟ip,并设置调度算法为加权轮询算法
$ipv -A -t $vip:80 -s wrr
# 加真实服务器-a,指定VIP地址及TCP端口-t,指定RIP地址及TCP端口-r,指定DR模式-g
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
$ipv -a -t $vip:80 -r $rs3:80 -g -w 1
2.2 给服务器配置脚本
三个服务器都要进行配置
操作相同,只进行其中一个
[root@rs3 ~]# vi /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.143.110
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
#1只回答目标IP地址是来访网络接口本地地址的ARP查询请求
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
#2对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
#1仅在请求的目标IP配置在本地主机的接收到请求报文的接口上,才给予回应
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
#2必须避免将接口信息向非本网络进行通告
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
3.对服务器页面进行区分
[root@rs3 ~]# echo "<h1 align=center>rs3</h1>" >/usr/share/nginx/html/index.html
[root@rs3 ~]# systemctl start nginx
[root@rs3 ~]# curl 192.168.143.133
rs3
其他两台服务器操作相似
4.测试
分别在四台机器上执行各自脚本;
执行脚本前要先yum 安装net-tools,因为ifconfig和route工具本身没有
[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@rs3 ~]# bash /usr/local/sbin/lvs_rs.sh
查看策略是否生效:
[root@dir ~]# 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.143.110:80 wrr
-> 192.168.143.131:80 Route 1 0 0
-> 192.168.143.132:80 Route 1 0 0
-> 192.168.143.133:80 Route 1 0 0
直接使用浏览器测试




LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。
所以这时候扩展出keepalived+LVS
-
二.keepalived+LVS
项目架构

项目规划
|
IP |
节点 |
网卡 |
用途 |
|
192.168.143.130 |
dir |
nat |
分发器主 |
|
192.168.143.131 |
rs1 |
nat |
服务器 |
|
192.168.143.132 |
rs2 |
nat |
服务器 |
|
192.168.143.133 |
rs3 |
nat |
服务器 |
|
192.168.143.134 |
backup |
nat |
分发器备 |
|
192.168.143.110 |
|
|
Vip |
项目实施
如果你的机器上还未安装过keepalived,则需要先安装,直接yum install -y keepalived即可。
[root@dir ~]# > /etc/keepalived/keepalived.conf 清空配置文件
1.编辑keepalived的配置文件
备份节点同理
[root@dir ~]# vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.143.110
}
}
virtual_server 192.168.143.110 80 { #VIP
delay_loop 3 #每隔3秒查询realserver状态
lb_algo wlc #lvs算法
lb_kind DR #DR模式
persistence_timeout 5 #(同一IP的连接5秒内被分配到同一台realserver)
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.143.131 80 { #真实服务器ip
weight 100 #权重
TCP_CHECK {
connect_timeout 10 # 10秒无响应超时(连接超时时间)
nb_get_retry 3 #失败重试次数
delay_before_retry 3 #失败重试的间隔时间
connect_port 80 #连接的后端端口
}
}
real_server 192.168.143.132 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.143.133 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
2.清空之前的环境
备份节点同理
由于上一节刚刚执行过LVS的脚本,所以需要做一些操作:
把之前的ipvsadm规则清空
[root@dir ~]# ipvsadm -C
重启网卡,可以把之前设置的VIP删除掉
[root@dir ~]# systemctl restart network
因为我们在keepalived的配置文件中定义的LVS模式为DR模式,所以还需要在两台rs上重新执行lvs_rs.sh脚本,这个脚本就是上一节设置的脚本。
[root@rs1 ~]# sh /usr/local/sbin/lvs_rs.sh
[root@rs2 ~]# sh /usr/local/sbin/lvs_rs.sh
[root@rs3 ~]# sh /usr/local/sbin/lvs_rs.sh
3.在主备上启动keepalived服务:
[root@dir ~]# systemctl start keepalived
检查有无keepalived进程
[root@dir ~]# ps -aux |grep keepalived
root 5395 0.0 0.0 118684 1384 ? Ss 07:29 0:02 /usr/sbin/keepalived -D
root 5396 0.0 0.1 129616 3328 ? S 07:29 0:05 /usr/sbin/keepalived -D
root 5397 0.4 0.1 129484 2620 ? S 07:29 1:25 /usr/sbin/keepalived -D
root 11487 0.0 0.0 112720 988 pts/0 S+ 13:15 0:00 grep --color=auto keepalived
4.测试
4.1 测试是否能够用vip访问到服务器

查看策略是否生效:
[root@dir ~]# 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.143.110:80 wlc persistent 5
-> 192.168.143.131:80 Route 100 0 0
-> 192.168.143.132:80 Route 100 0 0
-> 192.168.143.133:80 Route 100 2 0
4.2 测试把客户端访问的服务器关掉,能否切换其他服务器
[root@rs3 ~]# systemctl stop nginx

查看策略:
[root@dir ~]# 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.143.110:80 wlc persistent 5
-> 192.168.143.131:80 Route 100 0 0
-> 192.168.143.132:80 Route 100 2 0
再次启动rs3服务器
[root@rs3 ~]# systemctl start nginx
查看策略服务器变回了3台
[root@dir ~]# 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.143.110:80 wlc persistent 5
-> 192.168.143.131:80 Route 100 0 0
-> 192.168.143.132:80 Route 100 2 2
-> 192.168.143.133:80 Route 100 0 0
4.3测试主备分发器的高可用性
停掉主节点的keepalived
[root@dir ~]# systemctl stop keepalived
查看vip是否飘移到备节点上了

去浏览器看看能否正常运行

给备节点安装ipvsadm
查看策略:
[root@backup keepalived]# 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.143.110:80 wlc persistent 5
-> 192.168.143.131:80 Route 100 0 0
-> 192.168.143.132:80 Route 100 0 0
-> 192.168.143.133:80 Route 100 2 0
三.Nat模式
原理
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的工P地址(RIP)。
真实服务器响应完请查看默认路由,把响应后的数据包发送给负载均衡器,
负载均衡器在接收到响应包后,把包的源地址改成虚拟地址,(VIP)然后发送回给客户端。
优点
集群中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
缺点
扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负载均衡器,因此负载均衡器将成为整个系统的瓶颈
项目架构

项目规划
|
IP |
网卡 |
节点 |
用途 |
|
192.168.143.130 192.168.117.130 |
nat 仅主机 |
dir |
分发器 |
|
192.168.117.131 |
仅主机 |
rs1 |
服务器 |
|
192.168.117.132 |
仅主机 |
rs2 |
服务器 |
|
192.168.117.133 |
仅主机 |
rs3 |
服务器 |
项目实施
这里需要把服务器的网关设置成192.168.117.130即分发器内网的ip
1.清空之前的规则
iptables -F; iptables -t nat -F; service iptables save
2.编写脚本
继续在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.143.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.143.130:80 -s wlc
$IPVSADM -a -t 192.168.143.130:80 -r 192.168.117.131:80 -m -w 1
$IPVSADM -a -t 192.168.143.130:80 -r 192.168.117.132:80 -m -w 1
$IPVSADM -a -t 192.168.143.130:80 -r 192.168.117.133:80 -m -w 1
直接执行脚本
[root@dir ~]# bash /usr/local/sbin/lvs_nat.sh
在dir上直接访问rs
[root@dir ~]# curl 192.168.117.131
<h1 align=center>rs1</h1>
[root@dir ~]# curl 192.168.117.132
<h1 align=center>rs2</h1>
[root@dir ~]# curl 192.168.117.133
<h1 align=center>rs3</h1>
然后再直接访问dir的外网192.168.143.130
[root@dir ~]# curl 192.168.143.130
<h1 align=center>rs3</h1>
[root@dir ~]# curl 192.168.143.130
<h1 align=center>rs2</h1>
[root@dir ~]# curl 192.168.143.130
<h1 align=center>rs1</h1>
查询策略:

- Tun模式(隧道模式)
原理
首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
然后负载均衡器就把客户端发送的请求报文封装一层IP隧道(T-IP)转发到真实服务器(RS)。
真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均器
优点
负载均衡器只负责将请求包分发给后端节点服务器,而Rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
且负载均衡服务器 和 真实服务器可以不在同一网段(一般用于跨地区的大型企业)
缺点
ip隧道要花钱买 成本高
因为Tun模式并不常见,这里就不做案例了,它能实现的效果和dr大致类似。
2051

被折叠的 条评论
为什么被折叠?



