群集/集群的含义:特定:由多个主机构成,都干相同的一件事,对外展现为一个整体,只提供一个访问入口(域名或ip地址),对于客户端来说它就相当于一台大型计算机。
互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器已经无法满足负载均衡及高可用的要求。解决这个问题的方法其一是使用小型机或大型机这种性能更高、应用场景更专业的服务器,但这种价格昂贵;其二是可以使用多台相对普通的服务器构建服务群集,通过整合多台服务器,使用LVS来达到服务器的高可用和负载均衡,并以同一个IP地址对外提供相同的服务,LVS是在企业中常用的一种群集技术。
一、群集的类型
1)负载均衡群集 LB
提高系统的响应效率,处理更多的访问请求,减少延迟,实现高并发、高负载的能力。负载分配依赖于负载均衡器的分流算法(分流算法=调度算法:iphash url哈希),将请求分发给多个服务器节点。
典型代表:软件类(Nginx LVS HAProxy SLB) 硬件类(F5 绿盟)
2)高可用群集 HA
提高系统的可靠性,减少服务中断时间,确保服务的连续性(通过使用 N 个 9 来代表高可用的指标)
典型代表:keepalived、heartbeat
3)高性能计算群集 HPC
将多台服务器的硬件资源整合成资源池以获取高性能的CPU、内存等资源,来提高整体运算能力
典型代表:云计算、分布式计算
补充:你们公司的高可用指标是什么样?生产环境中通过几个9来表示。如999表示百分之九十九点九,即连续工作时间为一年的百分之九十九点九,剩余的百分之零点一表示中断的时间(不超过3万秒左右)。一般公司要求3-5个9,不要太高。金融公司、公共事业要求更高,等有些行业要求更高,99.999%。
二、LVS负载均衡的三种工作模式
1)NAT 地址转换
调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会成为整个群集的性能瓶颈。
由于节点服务器都会处于内网环境并使用私网IP,所以NAT模式具有一定的安全性(最高)。
2)TUN IP隧道 IP Tunnel
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。
由于节点服务器需要部署在互联网环境中,所以需要有独立的公网IP。调度器与节点服务器是通过专用的IP隧道相互通信。因此IP隧道模式的成本较高、网络安全性较低密,且数据在IP隧道传输的过程中需要额外的封装和解封装过程,性能也会受到一定的影响。
3)DR 直接路由 Direct Rounting
调度器也是仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NAT模式的区别)
节点服务器与调度器是部署在同一个物理网络中,因此不需要专用的IP隧道。(与IP隧道模式的区别)
DR模式是企业首选的LVS模式。
三、LVS调度算法
- rr(轮询)
- wrr(加权轮询)
- lc(最小连接)
- sh(源地址哈希)
- dh(目的地址哈希)
- wlc(加权最小连接):优先分配请求给 <连接数>/<权重> 的值最小的节点服务器
- lblc(基于地址的最小连接):如果服务器末超载且可用,则针对相同的目的地址的流量被发送到同一后端服务器;否则,流量被发送到连接数较少的服务器
- sed(最短预期延迟)
- nq(永不排队)
lvs默认编译为ip_vs模块,通过lsmod | grep ip_vs过滤。modprobe ip_vs加载后,即可看到/proc/net/ip_vs
ipvsadm工具选项
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]
ipvsadm -A -t 虚拟IP地址:80 -s rr [-p 60] #添加虚拟服务器的配置 ipvsadm -a -t 虚拟IP地址:80 -r 节点服务器的ip地址:80 -m [-w 1] #添加节点服务器的配置 ipvsadm -D -t 虚拟IP地址:80 -r #删除以上所有服务器的配置 ipvsadm -D -t 虚拟IP地址:80 -r 节点服务器的ip地址:80 #删除一个节点服务器的配置
四、LVS-NAT模式部署
web服务器1 | 192.168.170.200 |
web服务器1 | 192.168.170.100 |
NFS共享存储 | 192.168.170.4 |
LVS负载均衡器 | 192.168.170.5(私网ip) 12.0.0.2(公网ip,也是vip) |
客户机验证 | 12.0.0.10 |
1)部署NFS共享存储
//安装nfs 和 rpcbind yum install -y rpcbind nfs-utils //创建共享目录 mkdir /share/file1 mkdir /share/file2 vim /etc/exports /share 192.168.170.0/24(ro) #共享给170网段所有主机,只读权限 /share2 192.168.170.0/24(ro) #共享给170网段所有主机,只读权限 exportfs -rv #发布共享 showmount -e //开启nfs和rpcbind服务 systemctl enable --now rpcbind nfs //准备好测试页面文件 cd /share/ echo 'this is nginx test web1' > test.html cd /share2 echo 'this is nginx test web2' > test.html
2)部署Web服务器
注意:节点服务器的默认网关要指向调度器的网卡地址,测试时可关闭连接保持
//nignx1和nginx2同时安装nginx并创建空目录 rz -e #上传nginx.repo yum install -y nginx cd /usr/share/nginx/html/ mkdir xy101 //nginx1 挂载目录 vim /etc/fstab 192.168.170.4:/share /usr/share/nginx/html/class nfs defaults,_netdev 0 0 //nginx2 挂载目录 vim /etc/fstab 192.168.170.4:/share2 /usr/share/nginx/html/class nfs defaults,_netdev 0 0 //查看2台web服务器的挂载情况,启动nginx服务 mount -a df -hT vim /etc/nginx/nginx.conf #关闭长连接keepalive_timeout 0; systemctl enable --now nginx //网关地址指向lvs调度器的内网网址,重启网络 vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network
3)部署调度器
配置双网卡,开启IP路由转发,若内外主机要访问外网则需要配置SNAT规则,安装ipvsadm工具,添加虚拟服务器和真实服务器的配置,使用 -m 选项选择LVS-NAT模式
//配置双网卡 ifconfig vim /etc/sysconfig/network-scripts/ifcfg-ens33 cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36 vim /etc/sysconfig/network-scripts/ifcfg-ens36 systemctl restart network //开启路由转发 vim /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p 加载 //清空规则添加snat规则 iptables -F && iptables -t nat -F iptables -nL #查看规则 iptables -t nat -A POSTROUTING -s 192.168.170.0/24 -o ens36 -j SNAT --to 12.0.0.30 iptables -nL -t nat #查看规则 //加载模块 [root@localhost ~]# for i in $(ls /usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs/ | awk -F. '{print $1}') > do > modprobe $i > done [root@localhost ~]# lsmod
//安装ipvsadm工具 rqm -q ipvsadm mount /dev/sr0 /mnt yum install -y ipvsadm //启动ipvsadm时报错 systemctl start ipvsadm.service journalctl -u ipvsadm.service touch /etc/sysconfig/ipvsadm systemctl start ipvsadm.service systemctl enable --now ipvsadm.service //若内外主机要访问外网则需要配置SNAT规则,安装ipvsadm工具,添加虚拟服务器和真实服务器的配置,使用 -m 选项选择LVS-NAT模式 ipvsadm -A -t 12.0.0.30:80 -s rr #添加虚拟服务器地址 ipvsadm -a -t 12.0.0.30:80 -r 192.168.170.200:80 -m #指定rr轮询算法,指定vip地址和真实服务器地址,-m表示nat模式 ipvsadm -a -t 12.0.0.30:80 -r 192.168.170.100:80 -m #指定rr轮询算法,指定vip地址和真实服务器地址,-m表示nat模式 ipvsadm #加载启用策略 ipvsadm -ln #查询当前lvs的调度规则等信息
4)客户端验证
设置默认网关指向调度器的网卡地址,使用浏览器进行测试
【补充】
ipvsadm-save -n > /opt/ipvsadm.txt #导出策略保存 ipvsadm -C #清空规则 ipvsadm-restore < /opt/ipvsadm.txt #导入策略恢复 ipvsadm -d -t 12.0.0.30:80 -r 192.168.170.100:80 #删除一个真实服务器 ipvsadm -D -t 12.0.0.30:80 #删除整个虚拟服务器