1、群集概述
1.1 群集的含义
群集别名集群(Cluster)
由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机。
1.2 群集的类型
1.2.1 负载均衡群集
定义
提高系统响应效率,处理更多的访问请求,减少延迟,实现高并发、高负载的能力。
代表软件和硬件
软件类:LVS Nginx HAProxy 等
硬件类:F5 绿盟
1.2.2 高可用群集
定义
提高系统可靠性,减少中断时间,确保服务的连续性(通常使用 N 个 9 来代表高可用的指标)。
代表软件
Keepalived
heartbeat
1.2.3 高性能运输群集
通过云计算或分布式计算获取高性能的CPU、内存等资源,来提高整体运算能力。
1.3 负载均衡集群的结构
负载调度器(Load Balancer或Director)
负载均衡层
- 访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP地址。
- 通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。
服务器池(Server Pool)
- 群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。
- 当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
共享存储(Share Storage)
为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。
共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。
2、LVS概述
2.1 简介
LVS(Linux Virtual Server)是基于Linux系统实现的负载均衡解决方案。
它利用Linux的IP负载均衡(IPVS)内核模块来实现负载均衡功能。
IPVS在内核空间中拦截并分发进入的网络流量,将流量按照一定的负载均衡算法分发给后端多台服务器,实现负载均衡的目的。
这样可以提高系统的性能、可伸缩性和高可用性。
LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自己调用。
modprobe ip_vs
cat /proc/net/ip_vs
2.2 LVS工作原理
- 当用户向负载均衡器(Director Server)发起请求,调度器将请求发送至内核空间;
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发送到INPUT链;
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已经定义好的集群服务进行对比,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发送到POSTROUTING链;
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送到后端的服务器
2.3 LVS 的三种工作模式简介
- NAT模式:地址转换
- 通过网络地址转换实现的虚拟服务器,大并发访问时,调度器的性能成为瓶颈;
- TUN模式:IP隧道
- 使用路由技术实现虚拟服务器,节点服务器需要配置VIP,注意MAC地址广播;
- DR模式:直接路由
- 通过隧道方式实现虚拟服务器。
2.4 LVS 调度算法
-
rr 轮询
- wrr 加权轮询
- sh 源地址哈希
- dh 目的地址哈希
- lc 最小连接
- wlc 加权最小连接
- lblc 基于地址的最小连接0
固定调度算法:rr、wrr、dh、sh
- rr:轮询算法,将请求依次分配给不同的rs节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
- wrr:加权轮询调度,一句不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多,相同权值的RS得到相同数目的连接数。
- dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得所需RS。
- sh:源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。
动态调度算法:wlc、lc、lblc
- wlc:加权最小连接数调度,架设各台RS的权值依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS。
- lc:最小连接数调度(least-connection),ipvs表存储了所有活动的连接。LB会比较连接请求
放到当前连接最少的RS。 - lblc:基于地址的最小连接数(locality-based least-connection),将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。
2.5 ipvsadm工具的功能
LVS群集创建与管理:
- 创建虚拟服务器
- 添加、删除服务器节点
- 查看群集及节点情况
- 保存负载分配策略
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
3、LVS-NAT模式详解
3.1 LVS-NAT模式配置思路
- 配置 NFS 共享存储;
- 节点服务器安装 Web 服务,注意:默认网关要指向 调度器的IP地址,测试的时候关闭连接保持;
- 调度服务器要开启 IP路由转发 功能和设置 SNAT 等 iptables 规则,安装 ipvsadm 工具,配置虚拟服务器和真实节点服务器相关配置;
- 客户端测试的时候网关要指向 调度器的IP地址。
3.2 部署实例
- 调度器:内网关 ens33:172.16.88.7;外网关ens36:12.0.0.10
- Web节点服务器1:172.16.88.8(网关设置为172.16.88.7)
- Web节点服务器2:172.16.88.9(网关设置为172.16.88.7)
- NFS服务器:172.16.88.88
- 客户端:12.0.0.88
配置 NFS 共享存储
systemctl disable firewalld.service --now setenforce 0 yum install -y nfs-utils rpcbind systemctl start rpcbind nfs mkdir /opt/test1 /opt/test2 chmod 777 /opt/test1 /opt/test2 echo "This is web1" > /opt/test1/index.html echo "This is web2" > /opt/test2/index.html #nfs vim /etc/exports /usr/share *(ro,sync) /opt/test1 172.16.88.0/24(rw,sync) /opt/test2 172.16.88.0/24(rw,sync) exportfs -rv #发布共享 showmount -e
配置节点服务器
以节点服务器1为例,节点服务器2的配置类似。
web-1
systemctl disable firewalld setenforce 0 yum install -y httpd systemctl start httpd yum install -y nfs-utils rpcbind systemctl start rpcbind mount.nfs 172.16.88.88:/opt/test1 /var/www/html [root@web_server1 ~]# vim /etc/fstab #末行写入,设置自动挂载 172.16.88.88:/opt/test1 /var/www/html nfs defaults,netdev 0 0
web2
mount.nfs 172.16.88.88:/opt/test2 /var/www/html vim /etc/fstab #末行写入,设置自动挂载 172.16.88.88:/opt/test2 /var/www/html nfs defaults,netdev 0 0
配置负载调度器
systemctl disable firewalld setenforce 0
配置SNAT转发规则
#开启路由转发 vim /etc/sysctl.conf #末行写入 net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -A POSTROUTING -s 172.16.88.0/24 -o ens36 -j SNAT --to-source 12.0.0.10
加载LVS内核模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs | grep -o "^[^.]*");do echo $1; /sbin/modinfo -F filename $1 > /dev/null 2>&1 && /sbin/modprobe $1;done
安装ipvsadm管理工具
yum install -y ipvsadm #启动服务前需保存负载分配策略 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm
配置负载分配策略(NAT模式只要在服务器上配置,节点服务器不需要特殊配置)
ipvsadm -C #清除原有策略 #添加策略 ipvsadm -A -t 12.0.0.10:80 -s rr ipvsadm -a -t 12.0.0.10:80 -r 172.16.88.8:80 -m -w 1 ipvsadm -a -t 12.0.0.10:80 -r 172.16.88.9:80 -m -w 1 ipvsadm #启用策略 ipvsadm -ln #查看节点状态,Masq代表NAT模式 ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
访问测试
浏览器访问 http://12.0.0.10/
通过多次刷新查看网页内容是否交替出现
4、LVS-DR模式详解
4.1 数据包流向分析
- 客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间;
- Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输;
- 内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server;
- 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源 IP 地址为 VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出;
- Real Server 直接将响应报文传送到客户端。
4.2 IP包头及数据帧头信息的变化
- Client向目标VIP发出请求,Director(负载均衡器)接收
- Director根据负载均衡算法选择Real Sever_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为Real Server_1的MAC地址,然后在局域网上发送
- Real Server_1收到这个数据帧,解封装后发现目标IP与本机匹配(Real Server事先绑定了VIP),于是处理这个报文。随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出
- Client将收到回复报文。Client认为得到正常的服务,而不会知道是哪一台服务器处理的。
注意:如果跨网段,则报文通过路由器经由Internet返回给用户。
4.3 DR模式的特点
- Director Server和Real Server必须在同一个物理网络中;
- Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问;
- Director Server作为群集的访问入口,但不作为网关使用;
- 所有的请求报文经由Real Server,但回复响应报文不能经过Director Server;
- Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server;
- Real Server上的lo接口配置VIP的IP地址。
4.4 LVS-DR模式部署实例
- DR服务器:172.16.88.10
- Web服务器1:172.16.88.100
- Web服务器2:172.16.88.101
- VIP服务器:172.16.88.188
- nfs服务器:172.16.88.88
配置负载调度器
#关闭防火墙和selinux systemctl stop firewalld setenforce 0 #安装 ipvsadm yum install -y ipvsadm
配置虚拟IP地址
cd /etc/sysconfig/network-scripts cp ifcfg-ens33 ifcfg-ens33:0 #若是隧道模式,复制为ifcfg-tun10 vim ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=172.16.88.188 NETMASK=255.255.255.255 [root@director network-scripts]# ifconfig ens33:0 ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.88.188 netmask 255.255.255.255 broadcast 172.16.88.188 ether 00:0c:28:68:be:b9 txqueuelen 1000 (Ethernet)
调整proc响应系统
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-save >/etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -C #添加策略,若隧道模式,-g替换为-i ipvsadm -A -t 172.16.88.188:80 -s rr ipvsadm -a -t 172.16.88.188:80 -r 172.16.88.8:80 -g ipvsadm -a -t 172.16.88.188:80 -r 172.16.88.9:80 -g #保存策略并查看 ipvsadm ipvsadm -ln
部署NFS共享存储
#关闭防火墙和selinux systemctl stop firewalld setenforce 0 yum install -y nfs-utils rpcbind mkdir /opt/test1 /opt/test2 chmod 777 /opt/test1 /opt/test2 echo "This is web1" > /opt/test1/index.html echo "This is web2" > /opt/test2/index.html #编辑共享目录 vim /etc/exports /usr/share *(ro,sync) /opt/test1 172.16.88.0/24(rw,sync) /opt/test2 172.16.88.0/24(rw,sync) #启动服务 systemctl start rpcbind systemctl start nfs #查看目录 showmount -e
配置节点服务器
web1(172.16.88.8)
配置虚拟IP地址(VIP:172.16.88.188)
cd /etc/sysconfig/network-scripts #配置lo:0 cp ifcfg-lo ifcfg-lo:0 vim ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=172.16.88.188 NETMASK=255.255.255.255 #注意:子网掩码必须全为1 ifup lo:0 ifconfig lo:0 route add -host 172.16.88.188 dev lo:0 #临时添加 vim /etc/rc.local #末行添加,加入开机自启动 /sbin/route add -host 172.16.88.188 dev lo:0 chmod +x /etc/rc.d/rc.local
调整内核的ARP响应参数以组织更新VIP的MAC地址,避免发生冲突
vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求 net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 sysctl -p
安装服务,进行nfs挂载
#服务安装 yum install -y nfs-utils rpcbind httpd #启动服务 systemctl start rpcbind systemctl start nfs systemctl start httpd #将共享目录挂载到本机 mount.nfs 172.16.88.8:/opt/test1 /var/www/html
web2(172.16.88.9)
Web1与web2配置相同
mount.nfs 172.16.88.8:/opt/test2 /var/www/html
浏览器访问测试
在客户端使用浏览器重复访问 http://172.16.88.188