负载群集
群集的含义
由多台主机构成,但对外之表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一个大型计算机
扩展方式
纵向扩展:对服务器的cpu 内存 硬盘 等硬件进行升级或扩容来实现 (性能上限会有瓶颈,成本昂贵,收效比不高等问题)
横向扩展:通过增加服务器主机数量来实现高并发
群集分类
根据群集所针对的目标差异,可分为三种类型
- 负载均衡群集(LB)
- 高可用群集(HA)
- 高性能运算群集(HPC)
- 负载均衡群集(LB):提高应用系统的响应能力,处理更多的访问请求,减少延迟,提高并发和负载能力
- 高可用群集(HA):提高应用系统的可靠性,减少服务中断时间,确保服务的连续性
- 高性能运算群集(HPC) : 将多台主机的硬件计算资源合到一起实现分布式运行
负载均衡群集
负载均衡的结构
- 负载调度器(第一层) :通过VIP接收用户的请求,再通过调度算法确定要转发的节点服务器
- 服务器池中的节点服务器(第二层):通过RTP接受调度器转发来的请求,并处理请求进行响应
- 共享存储(第三层):为各个服务节点服务器提供稳定,一致的文件存取服务,比如NAS+NFS,文件服务器+NFS,分布式对象存储等存储设备
负载均衡群集工作模式
- 地址转换(NAT模式)
- IP隧道(TUN模式)
- 直接路由(DR模式)
地址转换(NAT模式)
- 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口
- 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
- 调度器至少要有2个网卡,一个承载VIP用于接收客户端的请求,另一个用于使用私有IP在同一个局域网中连接节点服务器
缺点:由于NAT的负载均衡器既作为用户的访问请求入口,也作为节点服务器响应请求的出口,承载两个方向的压力,调度器的性能会成为整个集群的瓶颈
直接路由(DR模式)
- 采用半开放式的网络结构,与TUN模式的结构类似,但各个节点并不是分散在各地,而是与调度器位于同一个物理网络
- 负载调整器与各个节点服务器通过本地网络连接,不需要建立专用的IP隧道
- 性能比NAT模式高
- 调度器只负责接受客户端的请求,并根据调度算法转发给节点服务器,节点服务器在处理完请求后直接相应返回给客户端,响应的数据包不经过调度器,调度器和节点服务器使用私有ip在同一个局域网中连接节点服务器
IP隧道(TUN模式)
- 架构与DR相似,但是节点服务器分散在互联网各个位置,都具有独立的公网ip,通过专用ip与调度器相互通信
- 采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的internet连接直接回应客户机,而不再经过负载调度器
LVS虚拟服务器
什么是LVS
- LVS是针对Linux内核开发的负载均衡解决方案
- LVS实际上相当于基于IP地址的虚拟化应用,为基于ip地址和内容请求分发的负载均衡提出了一种高效的解决方法
LVS现在已经成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。在centos7系统中,以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息
常见的LVS调度器算法(均衡策略)
LVS调度器用的调度方法基本为两类:
- 固定调度算法
- 动态调度算法
固定调度算法
rr(轮询算法)
- 将请求依次分配给不同的rs节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
wrr(加权轮询调度)
- 依据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,分配的请求数越多。
- 保证性能强的服务器承担更多的访问流量
dh(目的地址哈希调度)
- 以目的地址为关键字查找一个静态bash表来获得所需的RS节点
sh(源地址哈希调度)
以源地址为关键字查找一个静态bash表来获取所需要的RS节点
动态调度算法
wlc(加权最小连接数调度)
- 假设各台RS节点的权值依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS节点作为下一个分配的RS节点
lc(最小连接数调度)
- IPVS表存储了所有活动的连接。LB会比较将来连接请求发送到当前连接最少的RS节点
lblc(基于地址的最小连接数调度)
- 将来自同一个目的地址的请求分配给同一台RS节点,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS节点,并以它作为下一次分配的首先考虑
ipvsadm 工具选项
- -A:添加虚拟机服务器
- -D:删除整个虚拟服务器
- -s:指定负载调度算法(轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc)
- -a:表示添加真实服务器(节点服务器)
- -d:删除某个节点
- -t:指定VIP(虚拟IP)地址及TCP端口
- -r:指定RIP(真实IP)地址及TCP端口
- -m:表示使用NAT群集模式
- -g:表示使用DR模式
- -i:表示使用TUN模式
- -w:设置权限(权重为0时表示暂停节点)
- -p 60:表示保持长时间连接60秒
- -l:列表查看LVS虚拟服务器(默认为查看所有)
- -n:以数字形式显示地址、端口等信息,常与'-l'选项组合使用(ipvsadm -ln)
- -C:清空设置
- -save:重载
部署实例
实验准备
负载调度器:内网关 ens33:192.168.116.1,外网关 ens36:12.0.0.1 Web节点服务器1:192.168.116.10 Web节点服务器2:192.168.116.20 NFS服务器:192.168.116.50 客户端:12.0.0.12
(1)配置nfs共享存储器
#关闭防火墙和selinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#下载nfs服务
yum install nfs-utils rpcbind -y
systemctl start rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service
systemctl enable rpcbind.service
#创建两个共享目录
cd /opt/
mkdir abc def
chmod 777 abc/ def/
echo 'welcome to abc.com!' > abc/index.html
echo 'welcome to def.com!' > def/index.html
#修改nfs发布策略
vim /etc/exports
/usr/share *(ro,sync)
/opt/abc 192.168.116.0/24(rw,sync)
/opt/def 192.168.116.0/24(rw,sync)
#在线发布
exportfs -rv
(2)配置节点服务器
首先需要节点服务器提供web服务(apache、nginx等都可以)
将网页根目录挂载到共享存储服务器
web服务器1(nginx)
#启动nfs服务并共享
systemctl start rpcbind nfs
mount 192.168.116.50:/opt/abc /usr/local/nginx/html/
web服务器2(apache)
#启动nfs服务并共享
systemctl start rpcbind nfs
mount 192.168.116.50:/opt/def /var/www/html/
(3)配置负载调度服务器
配置网卡
#关闭防火墙和selinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#添加ip转发功能
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
#设置SNAT地址转发
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.116.0/24 -o ens33 -j SNAT --to-source 12.0.0.1
#下载ipvsdam并加载ip_vs通用模块
yum -y install ipvsadm
modprobe ip_vs
#添加并启动ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
systemctl enable ipvsadm.service
#添加lvs策略
ipvsadm -A -t 12.0.0.1:80 -s rr -p 5
ipvsadm -a -t 12.0.0.1:80 -r 192.168.116.10:80 -m -w 1
ipvsadm -a -t 12.0.0.1:80 -r 192.168.116.20:80 -m -w 1
#启用策略
ipvsadm
#保存策略(恢复可使用 ipvsadm-restore < /etc/sysconfig/ipvsadm)
ipvsadm-save > /etc/sysconfig/ipvsadm
使用外网客户端访问测试(等待连接保持失效后刷新,都能访问到则实现负载均衡