简介
在各种互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要 求越来越高,单台服务器已经无法满足负载均衡及高可用的要求。除了使用价格昂贵的大型 机、专用负载分流设备以外,企业还有另外一种选择来解决难题,那就是构建群集服务器— —通过整合多台服务器,使用 LVS 来达到服务器的高可用和负载均衡,并以同一个 IP 地址对外提供相同的服务。
一、 群集概述
群集的称呼来自于英文单词“Cluster”,表示一群、一串的意思,用在服务器领域则表示大量服务器的集合,以区分于单个服务器。
1.1 群集的类型
- 负载均衡群集(Load Balance Cluster):以提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载的整体性能。例如, “DNS轮询”“应用层交换”“反向代理”等都可用作负载均衡群集。LB 的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载压力。
- 高可用群集(High Availability Cluster) :以提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果。
HA 的工作方式包括双工和主从两种模式。双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。
- 高性能运算群集(High Performance Computer Cluster) :以提高应用系统的 CPU 运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力。
高性能运算群集的高性能依赖于“分布式运算” “并行计算”,通过专用硬件和软件将多个服务器的 CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。 不同类型的群集在必要时可以合并,如高可用的负载均衡群集。
1.2 负载均衡的分层结构
负载均衡的结构分为三层:
- 第一层,负载调度器:这是访问整个群集系统的唯一入口,对外使用所有服务器共 有的 VIP(Virtual IP,虚拟 IP)地址,也称为群集 IP 地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高
可用性。 - 第二层,服务器池:群集所提供的应用服务(如 HTTP、FTP)由服务器池承担,其 中每个节点具有独立的 RIP(Real IP,真实 IP)地址,只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
- 第三层,共享存储:为服务器池中的所有节点提供稳定、一致的文件存取服务,确 保整个群集的统一性。在 Linux/UNIX 环境中,共享存储可以使用 NAS 设备,或者提供 NFS(Network File System,网络文件系统)共享服务的专用服务器。
1.3 负载均衡的工作模式
群集的负载调度技术,可以基于 IP、端口、内容等进行分发,其中基于 IP 的负载调度是效率最高的。基于 IP 的负载均衡模式中,常见的有地址转换、IP 隧道和直接路 由三种工作模式.
地址转换
地址转换(Network Address Translation) :简称 NAT 模式,类似于防火墙的私有 网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口。服务器节点使用私有 IP 地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
IP 隧道
IP 隧道(IP Tunnel):简称 TUN 模式,采用开放式的网络结构,负载调度器仅作 为客户机的访问入口,各节点通过各自的 Internet 连接直接回应客户机,而不再经过负载调度器。服务器节点分散在互联网中的不同位置,具有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。
直接路由
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。
二、LVS虚拟服务器
Linux Virtual Server 是针对 Linux 内核开发的一个负载均衡项目,由我国的章文嵩博士在 1998 年 5 月创建,官方站点位于http://www.linuxvirtualserver.org/。
LVS 实际 上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了一种高效的解决方法。 LVS 现在已成为 Linux 内核的一部分,默认编译为 ip_vs 模块, 在 CentOS 7 系统安装后就自带。
2.1 LVS调度算法
LVS最常用的四种算法是轮询、加权轮询、最少连接和加权最少连接。
- 轮询(Round Robin):将收到的访问请求按照顺序轮流分配给群集中的各节点,均 等地对待每台服务器,而不管服务器实际的连接数和系统负载。
- 加权轮询(Weighted Round Robin) :根据调度器设置的权重值来分发请求,权重 值高的节点优先获得任务并且分配的请求越多,这样可以保证性能高的节点承担更多请求。
- 最少连接(Least Connections):根据真实服务器已建立的连接数进行分配,将收 到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地均衡负载。
- 加权最少连接(Weighted Least Connections) :在服务器节点的性能差异较大的 情况下,调度器可以根据节点服务器负载自动调整权重,权重较高的节点将承担更大比例的活动连接负载。
2.2 ipvsadm 管理命令
ipvsadm 是在负载调度器上使用的 LVS 群集管理工具,通过调用 ip_vs 模块来添加、删 除服务器节点,以及查看群集的运行状态。在 CentOS 7 系统中,需要手动安装 ipvsadm.x86_64 0:1.27-7.el7 软件包。
LVS 群集的管理工作主要包括创建虚拟服务器、添加服务器节点、查看群集节点状态、 删除服务器节点和保存负载分配策略。
ipvsadm命令
-A, --add-service:为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。
-E, --edit-service:修改一个虚拟服务。
-D, --delete-service:删除一个虚拟服务。
-C, --clear:清除所有虚拟服务。
-R, --restore:从标准输入获取ipvsadm命令。一般结合下边的-S使用。
-S, --save:从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。
-a, --add-server:为虚拟服务添加一个real server(RS)
-e, --edit-server:修改RS
-d, --delete-server:删除
-L, -l, --list:列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。
-Z, --zero:将所有数据相关的记录清零。这些记录一般用于调度策略。
--set tcp tcpfin udp:修改协议的超时时间。
--start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)
--stop-daemon:停止备服务器。
-h, --help:帮助。
ipvsadm命令参数
-t, --tcp-service service-address:指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。
-u, --udp-service service-address:使用udp服务,其他同上。
-f, --fwmark-service integer:用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同地址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。
-s, --scheduler scheduling-method:指定调度算法。调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)
-p, --persistent [timeout]:设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。
-M, --netmask netmask:指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。
-r, --real-server server-address:为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。
[packet-forwarding-method]:此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。
-g, --gatewaying:使用网关(即直接路由),此模式是默认模式。
-i, --ipip:使用ipip隧道模式。
-m, --masquerading:使用NAT模式。
-w, --weight weight:设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。
-x, --u-threshold uthreshold:设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。
-y, --l-threshold lthreshold:设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS:笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换)
--mcast-interface interface:指定使用备服务器时候的广播接口。
--syncid syncid:指定syncid,同样用于主备服务器的同步。
三、 NFS 共享存储服务
NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。通过使用 NFS 协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡 群集来说,使用 NFS 协议来共享数据存储是比较常见的做法,NFS 也是 NAS 存储设备必然支持的一种协议。
3.1 NFS 共享服务的基本配置和访问方法
3.1.1 使用 NFS 发布共享资源
NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持。
1. 安装 nfs-utils、rpcbind 软件包
提供 RPC 支持的服务为 rpcbind,提供 NFS 共享的服务为 nfs,手动加载 NFS 共享服务时,应该先 启动 rpcbind,再启动 nfs。
2. 设置共享目录
NFS 的配置文件为/etc/exports,文件内容默认为空(无任何共享)。在 exports 文件中设置共享资源时,记录格式为“目录位置 客户机地址(权限选项)”。
3. 启动 NFS 服务程序
4. 查看本机发布的 NFS 共享目录
使用命令 showmount -e
3.2 在客户机中访问 NFS 共享资源
NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来 进行挂载,对应的文件系统类型为 nfs。既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载。
(1)安装 rpcbind 软件包,并启动 rpcbind 服务。 若要正常访问 NFS 共享资源,客户机中也需要安装 rpcbind 软件包,并启动 rpcbind 系统服务。另外,为了使用 showmount 查询工具,建议将 nfs-utils 软件包也一并装上。
(2)手动挂载 NFS 共享目录。 以 root 用户身份执行 mount 操作,将 NFS 服务器共享的目录挂载到本地 目录/var/www/html。完成挂载以后,访问客户机的/var/www/html 文件夹,实际上就相当于访问 NFS 服务器中的文件夹。
(3)fstab 自动挂载设置。 修改/etc/fstab 配置文件,加入 NFS 共享目录的挂载设置。
四、 地址转换模式(LVS-NAT)部署
实验拓扑图如下(图片来源于网络)
实验目的
实现LVS-NAT 群集架构,通过浏览器正常访问到内容
实验环境
实际实验对拓扑图进行简化,将web服务器池的节点减少为2个,LVS 调度器具有两块网卡,分别连接内外网。
实验参数
实验过程
1. 安装群集所需软件包
先在调度服务器及各个几点服务器上联网下载一些软件包(需联网)。
调度服务器
yum -y install ipvsadm
节点1
yum -y install httpd
节点2
yum -y install ipvsadm
NFS服务器
yum install nfs-utils -y
yum -y install rpcbind
2. 规划各个服务器、节点IP
调度服务器配置双网卡(都使用仅主机模式)。
[root@localhost network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# vim ifcfg-ens33
[root@localhost network-scripts]# vim ifcfg-ens36
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
规划两个节点服务器的IP(都设置为仅主机模式)。
配置完节点服务器后,分别用节点服务器去ping调度服务器的网关192.168.100.1,测试连通性。
最后配置NFS服务器IP地址
3. 设置NFS共享(在共享服务器上)
[root@localhost ~]# cd /opt
[root@localhost opt]# mkdir test/ it/
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 9月 1 00:09 it
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
drwxr-xr-x. 2 root root 6 9月 1 00:09 test
[root@localhost opt]# chmod 777 test/ it/
[root@localhost opt]# ll
总用量 0
drwxrwxrwx. 2 root root 6 9月 1 00:09 it
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
drwxrwxrwx. 2 root root 6 9月 1 00:09 test
把需要共享的文件系统直接编辑到/etc/exports文件中,这样当NFS服务器重新启动时系统就会自动读取/etc/exports 文件,从而告诉内核要输出的文件系统和相关的存取权限。
[root@localhost opt]# vim /etc/exports
/opt/it 192.168.100.0/24(rw,sync)
/opt/test 192.168.100.0/24(rw,sync)
开启服务,发布共享
[root@localhost opt]# systemctl start rpcbind
[root@localhost opt]# systemctl start nfs
[root@localhost opt]# exportfs -rv ##发布共享文件
exporting 192.168.100.0/24:/opt/test
exporting 192.168.100.0/24:/opt/it
[root@localhost opt]# iptables -F ##关闭防火墙
[root@localhost opt]# setenforce 0 ##关闭核心防护
在任一节点服务器(192.168.100.129)上进行查看共享是否成功
[root@localhost ~]# showmount -e 192.168.100.131
Export list for 192.168.100.131:
/opt/test 192.168.100.0/24
/opt/it 192.168.100.0/24
共享成功
4. 将共享目录挂载到本地
节点1服务器(192.168.100.129)
[root@localhost ~]# vim /etc/fstab ##以下内容写在文件末尾
192.168.100.131:/opt/it /var/www/html nfs defaults 0 0
[root@localhost ~]# mount -a ##加载挂载
节点2服务器(192.168.100.130)
[root@localhost ~]# vim /etc/fstab ##以下内容写在文件末尾
192.168.100.131:/opt/test /var/www/html nfs defaults 0 0
[root@localhost ~]# mount -a
5.为了测试方便在两个节点服务器写不同的网页(理论上两个节点应该写同一个首页)
节点1服务器
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
<h1>this is it web</h1>
[root@localhost html]# iptables -F
[root@localhost html]# setenforce 0
[root@localhost html]# systemctl start httpd
节点2服务器
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
<h1>this is test web</h1>
[root@localhost html]# iptables -F
[root@localhost html]# setenforce 0
[root@localhost html]# systemctl start httpd
在nfs服务器上测试网页
6. 在调度服务器上写入脚本
[root@master network-scripts]# vim nat.sh
#!/bin/bash
echo "1" > /proc/sys/net/ipv4/ip_forward ##开启路由转发功能
ipvsadm -C ##清除缓存
ipvsadm -A -t 12.0.0.1:80 -s rr ##-s启用调度算法;rr代表轮询
ipvsadm -a -t 12.0.0.1:80 -r 192.168.100.129:80 -m
ipvsadm -a -t 12.0.0.1:80 -r 192.168.100.130:80 -m
ipvsadm ##启用ipvsadm功能
[root@master network-scripts]# chmod +x nat.sh
[root@master network-scripts]# ./nat.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP master:http rr
-> 192.168.100.129:http Masq 1 0 0
-> 192.168.100.130:http Masq 1 0 0
[root@master network-scripts]# iptables -F
[root@master network-scripts]# setenforce 0
7. 在win10虚拟客户机中进行验证
设置win10 IP地址
通过访问12.0.0.1网页的内容,采用轮询算法
这里的轮询有一定的等待时间,需要等待一会才会更新另一个界面。