目录
集群
集群的含义
集群分类
类型
负载均衡集群(Load Balance Cluster)
高可用集群(High Availability Cluster)
高性能运算集群(High Performance Computer Cluster)
负载均衡集群架构
第一层,负载调度器(Load Balancer或Director)
第二层,服务器池(Server Pool)
结构
LVS集群的工作模式
NAT模式
源地址和目标地址转换的过程
DR模式(直接路由)
源地址和目标地址转换的过程
TUN模式(IP隧道)
源地址和目标地址转换的过程
LVS
示例步骤
集群环境
基本环境设置
调度器
客户端
网站服务
测试
修改网关
安装LVS
基于NAT模式设置LVS
添加调度策略
调度算法
轮询(Round Robin)
加权轮询(Weighted Round Robin)
查看LVS策略
导出LVS策略
删除条目
删除群集
删除后端服务器
LVS常用选项
测试
共享存储
安装并配置NFS
启动NFS服务
在Web服务器挂载共享目录
测试
集群
在互联网应用中,随着站点对硬件的性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器越来越力不从心
集群的含义
- Cluster,集群也叫群集
- 由多台主机构成,但对外只表现为一个整体
集群分类
类型
- 负载均衡集群(高并发)
- 高可用集群(避免单点故障)
- 高性能运算集群
负载均衡集群(Load Balance Cluster)
- 提高应用系统的响应能力,因可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
- LB的负载均衡依赖于主节点的分流算法
高可用集群(High Availability Cluster)
- 以提高系统的可靠性,尽可能地减少中断时间为目标,确保服务的连续性,达到高可用的容错效果
- HA的工作方式包括双工和主从两种模式
高性能运算集群(High Performance Computer Cluster)
- 以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
- 高性能依赖于"分布式运算"、"并行计算",通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力
负载均衡集群架构
第一层,负载调度器(Load Balancer或Director)
- 当用户向服务器发送一个访问请求时,不让用户直接访问服务器,而是访问一个独立的调度器服务器,它的任务是接收用户的访问请求,把请求按照调度策略分配给后端的服务器
- 调度器不负责数据的解析,只是一个中转站,因此调度器的并发能力很强
第二层,服务器池(Server Pool)
- 调度器分配请求的目的地就是服务器池,负责向用户提供服务
- 在集群中,服务器池内的任意一个单台服务器,都可以单独运行业务产品,只是压力比负载均衡的环境更大而已
第三层,共享存储(Share Storage)
- 让服务器池中的每个Web服务器都挂载同一个存储池,假如网站内容更新,不需要在每个Web服务器上都更新一遍
结构
LVS集群的工作模式
本次只演示地址转换的示例步骤
- 负载均衡集群是目前企业用的最多的集群类型
- 集群的负载调度技术有三种工作模式
- 地址转换
- IP隧道
- 直接路由
NAT模式
- Network Address Translation,简称NAT模式
- 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,作为外网的访问入口,内网的应答出口
- 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
- 外网的请求和内网的响应都需要经过调度器,所以内网服务器的网关地址应该是调度器
- 针对中小型的集群环境
源地址和目标地址转换的过程
- 当外网客户端访问业务而发送请求时,调度器根据策略选择一个可用的后端服务器来处理请求
- 然后调度器通过DNAT把目标地址转换为后端服务器的地址,并传递给该服务器
- 后端服务器收到请求后,生成响应,然后返回给调度器,此时响应的源地址是后端服务器的IP地址
- 调度器收到响应后,通过SNAT把源地址修改为自己与外网通信的公有IP地址
- 然后返回给客户端
DR模式(直接路由)
- Direct Routing,简称DR模式
- 采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络
- 负载调度器与内网服务器通过本地网络连接,不需要建立专用的IP隧道
- 因为调度器只接收外网的请求,内网服务器的响应则是直接由网关路由出去,所以减轻了调度器的压力
- 针对大规模集群
源地址和目标地址转换的过程
- 当外网客户端需要访问业务而发送请求时
- 通过DNAT修改目标地址为调度器的地址,然后传递给内网调度器
- 调度器收到请求后,根据调度策略选择一个可用的后端服务器,再通过DNAT把目标地址转换为内网服务器的地址,然后把请求传递给内网服务器
- 内网服务器收到请求后,生成响应直接返回给网关,此时的源地址是内网服务器的IP地址
- 网关收到后端服务器的响应后,进行SNAT地址转换,把源地址转换为网关的公有IP地址,然后返回给客户端
TUN模式(IP隧道)
- IP Tunnel,简称TUN模式
- 采用开放式的网络结构,调度器和内网设备不在同一物理网络
- 负载调度器仅作为外网的访问入口,内网服务器通过各自的Internet连接直接回应外网请求,而不再经过调度器
- 服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信
- 由于调度器和服务器都部署在公网,所以它们之间的通信都通过ip-ip的加密算法来加密通信
源地址和目标地址转换的过程
- 外网请求首先到达调度器的外网接口
- 调度器收到这些请求后,根据预设的路由规则将请求打包封装进IP隧道中,然后发送到内网
- 数据在IP隧道中传输时,隧道设备会将原始数据包头部封装,这个头部包含的是隧道设备的公共IP地址和内网目标服务器的私有IP地址
- 当内网服务器收到请求后,生成响应,响应首先到达隧道设备。
- 隧道设备会解析响应,去除隧道头部,然后根据记录的信息将响应返回到发起请求的外网客户端
- 外网客户端最终接收到的响应来自调度器,因为调度器会将来自内网服务器的响应经过隧道的IP地址转换,使得外网客户端看到的是调度器的公共IP地址作为源地址。
LVS
本章学习常见的一种集群技术 —— LVS(Linux Virtual Server;Linux虚拟服务器)
LVS是针对Linux内核开发的一个负载均衡的项目,由我国的章文嵩博士在1998年5月创建
LVS实际上是相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决办法
LVS现在已经成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。
示例步骤
集群环境
本次的集群案例是一个使用NAT模式来实现集群的案例
主机 | 操作系统 | IP 地址 | 角色 |
服务器 | CentOS7.9 | 192.168.10.101 | 调度器 |
服务器 | CentOS7.9 | 192.168.10.102 | Web服务器 |
服务器 | CentOS7.9 | 192.168.10.103 | Web服务器 |
服务器 | CentOS7.9 | 192.168.10.104 | NFS共享存储 |
测试机 | CentOS7.9 带桌面端 | 172.16.16.200 | 客户端,测试机 |
实验终端除了带桌面的客户端,其他最小安装的虚拟机统一使用XShell连接
基本环境设置
调度器
因为调度器需要有两个网卡接口,一个连外网一个连内网,所以先为101主机添加一块网卡
把调度器新加的网卡和客户端的网卡都设为VMnet1模式,模拟外网通信
先进入存放网卡配置文件的目录,使用ip a命令查看新加网卡的标识,然后为该网卡配置对应文件
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
拷贝配置文件,修改以下内容
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# vim ifcfg-ens36
IPADDR=172.16.16.172
NETMASK=255.255.255.0
#GATEWAY=192.168.10.254 # 连接外网的网卡不需要网关,这里注释掉
NAME=ens36
DEVICE=ens36
保存并退出,重启网络服务,使用ip a命令查看ens36网卡的IP是否被改变
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
3: ens36:
inet 172.16.16.172/24
客户端
修改客户端的IP为集群环境示例图中的IP
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens33
IPADDR=172.16.16.200
PREFIX=24
#GATEWAY=192.168.10.254
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
2: ens33:
inet 172.16.16.200/24
在101(调度器)操作
然后在调度器主机尝试ping外网的客户端,要确保能ping通
[root@localhost network-scripts]# ping 172.16.16.200
PING 172.16.16.200 (172.16.16.200) 56(84) bytes of data.
64 bytes from 172.16.16.200: icmp_seq=1 ttl=64 time=0.434 ms
64 bytes from 172.16.16.200: icmp_seq=2 ttl=64 time=0.217 ms
64 bytes from 172.16.16.200: icmp_seq=3 ttl=64 time=0.268 ms
网站服务
右键XShell终端空白处,为两个内网服务器开启会话同步(102、103),其他的都单独关闭会话同步,准备快速部署网站服务
101、104都关闭会话同步
在102(Web服务器①)操作
安装Apache,为了方便实验关闭防火墙,关闭内核安全机制,开启Apache服务
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd
关闭会话同步
为了区分两个Web服务器,所以修改两个Web服务器的网页内容,因此也需要关闭全部的会话同步
在102(Web服务器①)操作
创建网页文件,添加下方内容
[root@localhost ~]# vim /var/www/html/index.html
Test Web 01
在103(Web服务器②)操作
创建网页文件,添加下方内容
[root@localhost ~]# vim /var/www/html/index.html
Test Web 02
测试
使用调度器进行测试,确保能够访问到网页内容
在101(调度器)操作
[root@localhost ~]# curl 192.168.10.102
Test Web 01
[root@localhost ~]# curl 192.168.10.103
Test Web 02
修改网关
根据刚才的集群图,102和103两个Web服务器的应答应该都是经过调度器服务器的,所以调度器就是这两个Web服务器的网关
这里修改两个Web服务器的网管为调度器
在102(Web服务器①)操作
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.10.101
[root@localhost ~]# systemctl restart network
在103(Web服务器②)操作
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.10.101
[root@localhost ~]# systemctl restart network
安装LVS
在101(调度器)操作
为了方便实验,先关闭防火墙和内核安全机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
实际上LVS已经被集成到内核里了,所以这里安装的其实是LVS的管理工具
[root@localhost ~]# yum -y install ipvsadm
基于NAT模式设置LVS
本次案例我们使用NAT模式来管理LVS,那么调度器就需要有一个IP转发功能,既作为网关又作为调度器
修改内核配置文件,添加以下内容
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
使用sysctl -p命令,在不重启系统的情况下,使内核配置文件中新加的参数生效
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
LVS并没有配置文件,但是可以使用ipvsadm-save命令来查看当前的策略信息
还可以加上-C选项来清理当前策略
[root@localhost ~]# ipvsadm-save
[root@localhost ~]# ipvsadm -C
添加调度策略
使用-A选项添加群集服务,再指定虚拟服务器的IP和端口,然后指定调度算法为权重轮询
然后使用-a选项向指定的虚拟服务器中添加一个后端服务器(192.168.10.102和103),启用地址伪装,指定权重为2
- -m:启用地址伪装模式:对后端服务器的响应进行SNAT(源地址转换)
- -w:指定后端服务器的权重值
w:权重,分发请求时根据权重的值来分发请求数量
rr:轮询(请求依次轮流)
[root@localhost ~]# ipvsadm -A -t 172.16.16.172:80 -s wrr
[root@localhost ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.10.102:80 -m -w 2
[root@localhost ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.10.103:80 -m -w 1
调度算法
-
轮询(Round Robin)
- 将受到的访问请求按照顺序轮流分配给群集中的各节点,(真实服务器),均等的对待每一台服务器,而不管服务器实际的连接数和系统负载
-
加权轮询(Weighted Round Robin)
- 根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,分配的请求书越多
- 保证性能强的服务器承担更多的请求数量
查看LVS策略
添加过策略后,可以使用ipvsadm-save命令来查看现有的策略
[root@localhost ~]# ipvsadm-save
-A -t localhost.localdomain:http -s wrr
-a -t localhost.localdomain:http -r 192.168.10.102:http -m -w 2
-a -t localhost.localdomain:http -r 192.168.10.103:http -m -w 1
或者还可以使用ipvsadm -ln也可以查看现有策略
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.16.172:80 wrr
-> 192.168.10.102:80 Masq 2 0 0
-> 192.168.10.103:80 Masq 1 0 0
- Masq:NAT模式
- ActiveConn:活跃的连接数(正在连接)
- InActConn:不活跃的连接数(断开连接)
导出LVS策略
通过重定向,导出策略内容到文本中,可以实现策略的保存
[root@localhost ~]# ipvsadm-save > /opt/save.txt
删除条目
删除群集
如果要删除一个群集服务,可以使用-D选项来删除
[root@localhost ~]# ipvsadm -D -t 172.16.16.172:80
删除后端服务器
如果要删除一个群集中的后端服务器,可以使用-d选项来删除群集中的指定后端服务器
[root@localhost ~]# ipvsadm -d -t 192.168.10.172:80 -r 192.168.10.103
LVS常用选项
选项 | 说明 |
-s | 指定调度算法 rr:轮询 wrr:加权轮询 lc:最小链接数 wlc:加权最小连接数 |
-A | 添加一个新的集群服务 |
-E | 修改一个己有的集群服务 |
-D | 删除指定的集群服务 |
-S | 保存ipvsadm设定的规则策略,默认保存在/etc/sysconfig/ipvsadm中 |
-R | 载入己保存的规则策略,默认加载/etc/sysconfig/ipvsadm |
-C | 清除所有集群服务 |
-Z | 清除所有记数器 |
-L | 显示当前己有集群服务,能通过相应的options查看不同状态信息 |
-a | 向指定的集群服务中添加RS及属性 |
-e | 修改RS属性 |
-t | 指定为tcp协议 |
-u | 指定为udp协议 |
-s | 调度方法,默认为wlc |
-w | 指定权重,默认为1 |
-g | Gateway, DR模型 |
-i | ipip, TUN模型 |
-m | masquerade, NAT模型 |
-r | 指定后端服务器的地址 |
测试
在172.16.16.200(外网客户端)操作
通过for循环使用curl访问内网的Web服务,由于我们刚才指定了权重轮询的算法,所以每3次请求会有2个请求分发给102,1个请求分发给103
[root@localhost ~]# for i in $(seq 1000);do curl 172.16.16.172;done
在101(调度器)操作
此时如果在调度器查看策略信息和状态,可以看到:断开连接的数量,根据客户端的访问次数发生了变化
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.16.172:80 wrr
-> 192.168.10.102:80 Masq 2 0 674
-> 192.168.10.103:80 Masq 1 0 336
共享存储
作为共享存储的服务器不需要连接到外网中(不需要上网),这里使用NFS作为共享存储的技术
NFS服务器是存储内网服务器网页文件或者数据,如果能够上网,那么安全性也有所降低。
所以NFS服务器不需要设置网关
在104(共享存储服务器)操作
安装并配置NFS
为了方便实验关闭防火墙和内核安全机制
安装NFS共享存储所需的两个软件包
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install nfs-utils rpcbind
打开NFS的配置文件,指定共享目录的路径,和能够挂载该目录的网络范围,然后指定读写权、同步等选项
并创建出在配置文件中指定用于共享的目录
[root@localhost ~]# vim /etc/exports
/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)
[root@localhost ~]# mkdir /opt/wwwroot
- rw:可读写的权限
- ro:只读的权限
- no_root_squash:使用该共享目录时相当于该目录的拥有者,如果是root使用这个共享的目录来说,他就具有root的权限,这个参数不安全,谨慎使用
- root_squash:使用该共享目录时相当于该目录的拥有者。如果以root身份使用这个共享目录的时候,那么这个使用者(root)的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成nobody
- all_squash:不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,也就是nobody
- sync:资料同步写入到内存与硬盘当中(同步)
- async:资料会先暂存于内存当中,而非直接写入硬盘,减少了硬盘IO(异步)
- insecure:允许从这台机器过来的非授权访问
启动NFS服务
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl start rpcbind
在Web服务器挂载共享目录
在102(Web服务器①)操作
Linux 系统需要安装nfs-utils软件包来支持NFS文件系统,所以需要先安装所需软件包
然后使用mount命令挂载指定IP的指定目录,再指定挂载位置
最后使用df命令查看挂载是否成功
[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# mount -t nfs 192.168.10.104:/opt/wwwroot /var/www/html/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
192.168.10.104:/opt/wwwroot 195G 1.9G 194G 1% /var/www/html
在103(Web服务器②)操作
步骤同上,确保挂载成功
[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# mount -t nfs 192.168.10.104:/opt/wwwroot /var/www/html/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
192.168.10.104:/opt/wwwroot 195G 1.9G 194G 1% /var/www/html
cd进入挂载的位置,因为/var/www/html目录下之前是有网页文件的,挂载上共享目录后,共享目录会覆盖该目录,所以该目录目前是空的
因此我们创建一个网页文件用于测试
网页内容如下(代码块内最后一行)
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
NFS Test
测试
在172.16.16.200(外网客户端)操作
还是使用for循环多次访问Web服务测试
[root@localhost ~]# for i in $(seq 100);do curl 172.16.16.172;done
NFS Test
NFS Test
NFS Test
...
至此,LVS基于NAT模式的集群部署完成