LVS负载均衡集群
1.负载均衡群集的原理
(1)群集的含义
Cluster,集群、群集;由多个主机构成,都干相同的一件事,对外展现为一个整体,只提供-访问入口(域名或IP地址),相当于一台大型计算机。
解决方法:
使用价格昂贵的小型机、大型机;使用多台相对廉价的普通服务器构建服务群集;
通过整合多台服务器,使用 LVS来达到服务器的高可用和负载均衡,并以同一个IP地址对外提供相同的服务。
在企业中常用的一种群集技术--LVS(Linux Virtual Server,Linux虚拟服务器)
(2)群集的类型
负载均衡群集 LB
提高系统的响应效率,处理更多的访问请求,减少延迟,实现高并发、高负载的能力
典型代表:软件类(Nginx LVS HAProxy SLB) 硬件类(F5 绿盟)
高可用群集 HA
提高系统的可靠性,减少服务中断时间,确保服务的连续性(通过使用 N 个 9 来代表高可用的指标)
典型代表:keepalived、heartbeat
高性能计算群集 HPC
将多台服务器的硬件资源整合成资源池以获取高性能的CPU、内存等资源,来提高整体运算能力
典型代表:云计算、分布式计算
(3)LVS负载均衡的三种工作模式
(1)NAT————地址转换
调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会成为整个群集的性能瓶颈。
由于节点服务器都会处于内网环境并使用私网IP,所以NAT模式具有一定的安全性。
(2)TUN————IP隧道————IP Tunnel
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。
由于节点服务器需要部署在互联网环境中,所以需要有独立的公网IP。
调度器与节点服务器是通过专用的IP隧道相互通信。
因此IP隧道模式的成本较高、网络安全性较低密,且数据在IP隧道传输的过程中需要额外的封装和解封装过程,性能也会受到一定的影响。
(3)DR————直接路由————Direct Rounting
调度器也是仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NAT模式的区别)
节点服务器与调度器是部署在同一个物理网络中,因此不需要专用的IP隧道。(与IP隧道模式的区别)
DR模式是企业首选的LVS模式。
(4)LVS调度算法
rr(轮询)
wrr(加权轮询)
lc(最小连接)
sh(源地址哈希)
dh(目的地址哈希)
wlc(加权最小连接):优先分配请求给 <连接数>/<权重> 的值最小的节点服务器
lblc(基于地址的最小连接):如果服务器末超载且可用,则针对相同的目的地址的流量被发送到同一后端服务器;否则,流量被发送到连接数较少的服务器
sed(最短预期延迟)
nq(永不排队)
2.LVS-NAT模式部署
ipvsadm 工具选项说明 | |
---|---|
-A | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法(轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc) |
-a | 表示添加真实服务器(节点服务器) |
-d | 删除某一个节点 |
-t | 指定 VIP地址及 TCP端口 |
-r | 指定 RIP地址及 TCP端口 |
-m | 表示使用 NAT群集模式 |
-g | 表示使用 DR模式 |
-i | 表示使用 TUN模式 |
-w | 设置权重(权重为 0 时表示暂停节点) |
-p 60 | 表示保持长连接60秒(默认关闭连接保持) |
-l | 列表查看 LVS 虚拟服务器(默认为查看所有) |
-n | 以数字形式显示地址、端口等信息,常与“-l”选项组合使用。ipvsadm -ln [-t VIP:PORT] |
1.部署共享存储(NFS服务器:20.0.0.140)
yum install -y nfs-utils rpcbind
mkdir /share #共享目录
mkdir /share2
vim /etc/exports
/share 20.0.0.0/24(ro)
/share2 20.0.0.0/24(ro)
systemctl enable --now rpcbind nfs
showmount -e
echo 'this is nginx web1 test page' > /share/test.html
echo 'this is nginx web2 test page' > /share2/test.html
exportfs -avr
2.配置节点服务器(20.0.0.110/20.0.0.130)
cd /etc/yum.repos.d/
ls
rz -E 上传 nginx.repo
yum install -y nginx
##查看路径
cd /etc/nginx/
ls
cd conf.d/
vim default.conf(查看路径)
mkdir /usr/share/nginx/html/xlb666
vim /etc/fstab
20.0.0.140:/share /usr/share/nginx/html/xlb666 nfs defaults 0 0
20.0.0.140:/share2 /usr/share/nginx/html/xlb666 nfs defaults 0 0 ##20.0.0.130
mount -a
df -hT
ls xlb666/
vim /etc/nginx/nginx.conf
keepalive_timeout 0;
systemctl start nginx
systemctl enable nginx
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33
网关20.0.0.30
#DNS1
systemctl restart network
20.0.0.130,其余一样
网关
3.配置负载调度器(20.0.0.100内网关 ens33:20.0.0.30,外网关 ens36:12.0.0.30)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens33
20.0.0.30
#GATEWAY
#DNS1
vim ifcfg-ens36
IPADDR=12.0.0.30
#GATEWAY
#DNS1
systemctl restart network
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
##配置SNAT转发规则
iptables -F && iptables -t nat -F
iptables -nL
iptables -nL -t nat
iptables -t nat -A POSTROUTING -s 20.0.0.0/24 -o ens36 -j SNAT --to 12.0.0.30
iptables -nL -t nat
##加载LVS内核模块
cd /usr/lib/modules/$(uname -r)
ls
cd kernel/
ls
cd net/
ls
cd netfilter/
ls
cd ipvs/
ls
pwd ##/usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs
for i in $(ls | awk -F. '{print $1}')
do
modprobe $i
done
##for i in $(ls | awk -F. '{print $1}');do;modprobe $i;done
lsmod
##安装ipvsadm 管理工具
yum install -y ipvsadm
rpm -q ipvsadm
systemctl start ipvsadm
journalctl -u ipvsadm
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl status ipvsadm
systemctl enable ipvsadm
##配置负载分配策略(NAT模式只要在服务器上配置,节点服务器不需要特殊配置)
ipvsadm -C #清除原有策略
ls
ipvsadm -A -t 12.0.0.30:80 -s rr
ipvsadm -a -t 12.0.0.30:80 -r 20.0.0.110:80 -m
ipvsadm -a -t 12.0.0.30:80 -r 20.0.0.130:80 -m
ipvsadm
ipvsadm -ln
ipvsadm-save > /opt/ipvs.txt #保存策略
ipvsadm-restore < /opt/ipvs.txt #恢复 LVS策略
配置SNAT转发规则
加载LVS内核模块
安装ipvsadm 管理工具
验证
3.理解LVS-DR工作原理
(1)LVS-DR数据包流向分析
为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4
Client向目标VIP发出请求,Director(负载均衡器)接收
IP包头及数据帧头信息
Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送
IP包头及数据帧头信息
RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,将响应报文通过l0 接口传送给物理网卡然后向外发出。
IP包头及数据帧头信息
Client将收到回复报文。Client认为得到正常的服务而不会知道是哪一台服务器处理的
注意:如果跨网段,则报文通过路由器经由Internet返回给用户
(2)LVS-DR中的ARP问题
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的素乱。
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播;只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播
对节点服务器进行处理,使其不响应针对VIP的ARP请求。
使用虚接口lo:0承载VIP地址;设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
4.LVS-DR模式部署
1)部署NFS共享存储
2)部署Web服务器,注意:配置lo:0虚接口承载VIP;修改内核参数 arp_ignore=1、arp_announce=2防止网关ARP紊乱问题;添加路由 route add -host
3)部署调度器,注意:配置ensXX:0虚接口承载VIP;修改内核参数ip_forward=0、send_redirects=0关闭IP转发和重定向功能;安装ipvsadm工具,添加虚拟服务器和真实服务器的配置,使用-g选项选择LVS-DR模式
4)客户端访问VIP进行测试,注意:如何客户端跨网段,则调度器和节点服务器的默认网关要指向网关路由器的地址
配置负载调度器20.0.0.100
yum install -y ipvsadm
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl status ipvsadm
systemctl enable ipvsadm
modprobe ip_vs
lsmod
cat /proc/net/ip_vs
ls
ifconfig
##配置虚拟 IP 地址
cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-lo ifcfg-ens33:0
ls
vim ifcfg-ens33:0
DEVICE=ens33:0
IPADDR=20.0.0.88
NETMASK=255.255.255.255
ONBOOT=yes
systemctl restart network
ifconfig
##调整 proc 响应参数
#由于 LVS 负载调度器和各节点需要共用 VIP 地址,需要关闭 icmp 的重定向,不充当路由器。
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
##配置负载分配策略
sysctl -p
ipvsadm -ln #查看节点状态,Route代表 DR模式
ipvsadm -C #清空
ipvsadm -A -t 20.0.0.88:80 -s rr
ipvsadm -a -t 20.0.0.88:80 -r 20.0.0.110:80 -g
ipvsadm -a -t 20.0.0.88:80 -r 20.0.0.130:80 -g
ipvsadm
ipvsadm-save -n > /opt/ipvsadm.bak
cat !$
部署共享存储 20.0.0.140
yum -y install nfs-utils rpcbind
mkdir /share/{xlb666,xlb888} -p
ls /share/
echo '<hl>this is xlb666 test web page!</h1>' > /share/xlb666/test.html
echo '<hl>this is xlb888 test web page!</h1>' > /share/xlb888/test.html
vim /etc/exports
/share/xlb666 20.0.0.0/24(ro)
/share/xlb888 20.0.0.0/24(ro)
systemctl restart rpcbind nfs
systemctl enable --now rpcbind nfs
showmount -e
配置节点服务器nginx (两个)20.0.0.110/20.0.0.130
##此地址仅用作发送 Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口 lo∶0 来承载 VIP 地址,并为本机添加一条路由记录,将访问 VIP 的数据限制在本地,以避免通信紊乱。
systemctl start rpcbind
showmount -e 20.0.0.140
cd /etc/yum.repos.d/
ls
rz -E 上传 nginx.repo
yum install -y nginx
systemctl start nginx
ls
mount 20.0.0.140:/share/xlb666 /usr/share/nginx/html/
mount 20.0.0.140:/share/xlb888 /usr/share/nginx/html/
ls !$
cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-lo ifcfg-lo:0
ls
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=20.0.0.88
NETMASK=255.255.255.255
ONBOOT=yes
systemctl restart network
systemctl restart nginx
systemctl enable nginx
ifconfig
##调整内核的 ARP 响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突
vim /etc/sysctl.conf #解决网关路由器ARP紊乱的问题
net.ipv4.conf.lo.arp_ignore = 1 #节点服务器只响应目的IP为物理网卡接口IP的ARP请求
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2 #节点服务器不使用IP包的源IP作为ARP请求报文的源IP,而采用发送接口的IP来作为ARP请求报文的源IP
net.ipv4.conf.all.arp_announce = 2
sysctl -p #加载
route -n #查看路由
route add -host 20.0.0.88 lo:0 #添加路由
route -n
vim /etc/nginx/nginx.conf
keepalive_timeout 0;
systemctl restart nginx
http://20.0.0.88/test.html
节点服务器20.0.0.130 挂载目录不同,其余相同
5.LVS的优缺点
(1)LVS的优点
●抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
●LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案。
●无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
●应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等。
(2)LVS的缺点
●软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势。
●如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了。