小阿轩yx-LVS负载均衡群集
- 构建群集服务器—通过整合多台服务器
- 使用 LVS 达到服务器的高可用和负载均衡
- 并以同一个 IP 地址对外提供相同的服务
LVS 群集应用基础
- 群集称呼来自英文单词“Cluster”
- 在服务器领域则表示大量服务器的集合体,区分单个服务器
Cluster
- 表示一群、一串的意思
LVS 群集技术概述
- 根据企业环境不同
- 群集提供的功能也不同
- 采用的技术细节也不同
群集的三种类型
每种群集都至少包含两台服务器,对外表现为一个整体,只提供一个访问入口
负载均衡群集(Load Balance Cluster)
- 提高应用系统的响应能力
- 尽可能处理更多的访问请求
- 减少延迟为目标
- 获得高并发、高负载的整体性能
高可用群集(High Availability Cluster)
- 提高应用系统的可靠性
- 尽可能地减少中断时间为目标
- 确保服务的连续性
- 达到高可用(HA)的容错效果
高性能运算群集(High Performance Computer Cluster)
- 提高应用系统的 CPU运算速度、扩展硬件资源和分析能力为目标
- 获得相当于大型、超级计算机的高性能运算(HPC)能力
不同类型的群集在必要时可以合并,如高可用的负载均衡群集
负载均衡的分层结构
典型的负载均衡群集中包括三个层次的组件
- 前端至少有一个负载调度器(Load Balancer,或称为 Director)负责响应并分发来自客户机的访问请求
- 后端由大量真实服务器(Real Server)构成服务器池(Server Poo1),提供实际的应用服务,整个群集的伸缩性通过增加、删除服务器节点来完成
第一层,负载调度器
- 这是访问整个群集系统的唯一入口
- 对外使用所有服务器共有的 VIP(Virtual IP,虚拟 IP)地址,也称为群集 IP 地址
第二层,服务器池
- 群集所提供的应用服务(如HTTP、FTP)由服务器池承担,每个节点具有独立的RIP(Real IP,真实 IP)地址,只处理调度器分发过来的客户机请求
- 当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池
第三层,共享存储
- 为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。
- Linux/UNIX 环境中,共享存储可以使用 NAS 设备,或者提供 NFS(Network File System,网络文件系统)共享服务的专用服务器
负载均衡的工作模式
- 群集的负载调度技术,可以基于 IP、端口、内容等进行分发
- 其中基于 IP 的负载调度是效率最高的
基于IP的负载均衡模式中,常见的三种工作模式有
- 地址转换
- IP 隧道
- 直接路由
地址转换(Network Address Translation)
- 简称 NAT 模式
- 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口。
- 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
IP 隧道(IP Tunnel)
- 简称 TUN 模式
- 采用开放式的网络结构,
- 负载调度器仅作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应客户机,而不再经过负载调度器。
- 服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用 IP隧道与负载调度器相互通信。
直接路由(Direct Routing)
- 简称 DR 模式
- 采用半开放式的网络结构,与 TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。
- 负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。
NAT方式只需要一个公网 IP地址,从而成为最易用的一种负载均衡模式,许多硬件负载均衡设备就采用这种方式
优势
- 安全性也比较好
相比较而言DR 模式和 TUN 模式
优势
- 负载能力更加强大
- 适用范围更广
缺点
- 节点的安全性稍差一些
LVS 虚拟服务器
Linux Virtual Server
- 是针对Linux 内核开发的一个负载均衡项目
- 由我国的章文嵩博士在 1998年5月创建
- 官方站点位于 http://www.linuxvirtualserver.org/
- LVS 实际上相当于基于 IP地址的虚拟化应用
- 为基于 IP地址和内容请求分发的负载均衡提出了一种高效的解决方法
- LVS 现在已成为 Linux 内核的一部分
- 默认编译为 ip_vs 模块
- 必要时能够自动调用
LVS 的负载调度算法
- 针对不同网络服务和配置,LVS 调度器提供多种不同的负载调度算法
最常用的四种算法
- 轮询
- 加权轮询
- 最少连接
- 加权最少连接
轮询(RoundRobin)
- 将收到的访问请求按照顺序轮流分配给群集中的各节点,均等地对待每台服务器,而不管服务器实际的连接数和系统负载。
加权轮询(Weighted Round Robin)
- 根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务并且分配的请求越多,这样可以保证性能高的节点承担更多请求。
最少连接(Least Connections)
- 根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地均衡负载。
加权最少连接(Weighted Least Connections)
- 在服务器节点的性能差异较大的情况下,调度器可以根据节点服务器负载自动调整权重,权重较高的节点将承担更大比例的活动连接负载。
使用 ipvsadm 管理工具
ipvsadm 是在负载调度器上使用的 LVS 群集管理工具,通过调用 ip_vs 模块来添加、删除服务器节点,以及查看群集的运行状态。
构建 LVS 负载均衡群集
地址转换模式(LVS-NAT)
实验环境
各web节点需要设置网关,NFS不需要
CentOS 系统,手动加载 ip_vs 模块并查看信息
//加载 ip_vs模块
[root@localhost ~]# modprobe ip_vs
//查看 ip_vs 版本信息
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:Port Scheduler Flags
->RemoteAddress:Port Forward Weight ActiveConn InActConn
配置负载调度器
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
安装 ipvsadm
[root@localhost ~]# yum -y install ipvsadm
查看 ipvsadm 版本
[root@localhost ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
添加配置文件
[root@localhost ~]# vim /etc/sysctl.conf
## 添加下面代码
net.ipv4.ip_forward = 1
语句生效
[root@localhost ~]# sysctl -p
配置新策略
[root@localhost ~]# ipvsadm -C
创建虚拟服务器
[root@localhost ~]# ipvsadm -A -t 172.16.16.172:80 -s rr
添加服务器节点
[root@localhost ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.10.102:80 -m -w 1
[root@localhost ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.10.103:80 -m -w 1
查看当前策略信息
[root@localhost ~]# ipvsadm-save
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.10.102:http -m -w 1
-a -t localhost.localdomain:http -r 192.168.10.103:http -m -w 1
-s:指定调度算法
-
rr:轮询
-
wrr:加权轮询
-
lc:最小链接数
-
wlc:加权最小连接数
(
-
-A 添加一个新的集群服务;
-
-E 修改一个己有的集群服务;
-
-D 删除指定的集群服务;
-
-a 向指定的集群服务中添加RS及属性;
-
-e 修改RS属性;
-
-t 指定为tcp协议;
-
-u 指定为udp协议;
-
-s 调度方法,默认为wlc;
-
-w 指定权重,默认为1;
-
-g Gateway, DR模型;
-
-i ipip, TUN模型;
-
-m masquerade, NAT模型;
-
-S 保存ipvsadm设定的规则策略,默认保存在/etc/sysconfig/ipvsadm中;
-
-R 载入己保存的规则策略,默认加载/etc/sysconfig/ipvsadm;
-
-C 清除所有集群服务;
-
-Z 清除所有记数器;
-
-L 显示当前己有集群服务,能通过相应的options查看不同状态信息;
-
-r 指定真实服务器的地址)
启动 ipvsadm
[root@localhost ~]# systemctl enable ipvsadm
配置 web 节点服务器
在两个 web 节点上安装 httpd
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install nfs-utils
创建测试页
[root@localhost ~]# vim /var/www/html/index.html
LVS test1
启动 httpd 服务
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
客户端测试 LVS 群集
[root@localhost ~]# curl 172.16.16.172
在 LVS 上产看调度信息
[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 rr
-> 192.168.10.102:80 Masq 1 0 0
-> 192.168.10.103:80 Masq 1 0 0
-
ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED
-
InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接
linux 做客户端时可以用以下代码进行测试
[root@localhost ~]# for i in $(seq 10);do curl 172.16.16.172;done
NFS 共享存储服务
NFS
- 是一种基于 TCP/IP 传输的网络文件系统协议
- 最初由 Sun 公司开发
- 通过使用 NFS协议,客户机可以访问远程服务器中的共享资源
- 对于大多数负载均衡群集来说,使用 NFS协议来共享数据存储是比较常见的做法
- NFS也是NAS存储设备必然支持的一种协议
使用 NFS 发布共享资源
- NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制
- 以完成远程到本地的映射过程
CentOS7系统中,需要安装软件包提供 NFS共享服务
- nfs-utils
- rpcbind
前者用于 NFS 共享发布和访问
后者用于RPC支持
安装 nfs-utils、rpcbind 软件包
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# systemctl enable nfs
[root@localhost ~]# systemctl enable rpcbind
设置共享目录
[root@localhost ~]# mkdir -p /opt/wwwroot
[root@localhost ~]# vi /etc/exports
/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)
可以同时发布多个目录,并且可以为不同的客户端设置不同的访问权限
- rw 可读写的权限
- ro 只读的权限
- no_root_squash 登入NFS主机,使用该共享目录时相当于该目录的拥有者,如果是root的话,那么对于这个共享的目录来说,他就具有root的权限,这个参数极不安全,不建议使用
- root_squash 登入NFS主机,使用该共享目录时相当于该目录的拥有者。但是如果是以root身份使用这个共享目录的时候,那么这个使用者(root)的权限将被压缩成为匿名使用者,即通常他的UID与GID都会变成nobody那个身份
- all_squash 不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody
- sync 资料同步写入到内存与硬盘当中
- async 资料会先暂存于内存当中,而非直接写入硬盘
- insecure 允许从这台机器过来的非授权访问
启动 NFS 服务程序
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# netstat -anpt | grep rpc
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 44153/rpc.mountd
tcp 0 0 0.0.0.0:50661 0.0.0.0:* LISTEN 7511/rpc.statd
tcp6 0 0 :::20048 :::* LISTEN 44153/rpc.mountd
tcp6 0 0 :::54742 :::* LISTEN 7511/rpc.statd
查看本机发布的 NFS 共享目录
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/opt/wwwroot 192.168.7.0/24
/var/ftp/pub 192.168.10.173,192.168.7.172
在客户机中访问 NFS 共享资源
- NFS 协议的目标是提供一种网络文件系统
- 对 NFS 共享的访问使用 mount 命令来进行挂载,对应的文件系统类型为nfs
- 既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载
- 考虑到群集系统中的网络稳定性,NFS服务器与客户机之间最好使用专有网络进行连接
安装 rpcbind 软件包,并启动 rpcbind 服务
[root@localhost ~]# yum -y install rpcbind nfs-utils
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl start rpcbind
手动在 web 节点挂载 nfs
[root@localhost ~]# mount -t nfs 192.168.10.105:/opt/wwwroot /var/www/html
在 nfs 上创建测试网页
[root@localhost ~]# vim /var/www/html/index.html
LVS test
linux做客户端时可以用一下代码进行测试
[root@localhost ~]# for i in $(seq 10);do curl 172.16.16.172;done
小阿轩yx-LVS负载均衡群集