LVS负载均衡群集
一、集群与分布式
1.1 集群的含义
- Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统
- 由多台主机构成,但对外只表现为一个整体
1.2 解决方法
- 使用价格昂贵的小型机、大型机
- 使用多台相对廉价的普通服务器构建服务群集
通过整合多台服务器,使用LVS来达到服务器的高可用和负载均衡,并以同一个IP地址对外提供相同的服务。
在企业中常用的一种群集技术——LVS (Linux Virtual Server,Linux虚拟服务器)
1.3 企业群集分类
- 负载均衡群集
- 高可用群集
- 高性能运算群集。
1.3.1负载均衡群集(Load Balance cluster)
LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
- 提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
- Lb的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载压力.例如,“dns轮询”“反向代理”等“
1.3.2高可用群集
HA: High Availiablity,高可用,避免 SPOF(single Point Of failure)
- 提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
- HA的工作方式包括双工和主从两种模式
1.3.3 高性能运算群集
HPC: High-performance computing,高性能
- 提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
- 高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力
1.4 负载均衡集群架构
- 第一层,负载调度器(Load Balancer或Director)
访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP地址。 通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。
- 第二层,服务器池(Server Pool)
群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。 当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
- 第三层,共享存储(Share Storage)
为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。 共享存储可以使用NAS设备,或者提供NFS共享服务(一种协议)的专用服务器。
二 .LVS工作模式和相关命令
Linux Virtual Server
- 针对Linux内核开发的负载均衡解决方
- 1998年5月,由我国的章文嵩博士创建
- 官方网站: www.linuxvirtualserver.org/
- LVS 实际上相当于基于IP地址的虚拟化应用, 为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决方法
LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。在CentOS 7系统中,以下操作可以手动加载ip_vs模块,并
查看当前系统中ip_vs模块的版本信息。
[root@localhost ~]# modprobe ip_vs #加载ip_vs模块
[root@localhost ~]# cat /proc/net/ip_vs #查看ip_vs信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
如何查看ip_vs模块的子模块呢?
[root@localhost ~]# cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/
[root@localhost ipvs]# ls
ip_vs_dh.ko.xz ip_vs.ko.xz ip_vs_lblcr.ko.xz ip_vs_nq.ko.xz ip_vs_rr.ko.xz ip_vs_sh.ko.xz ip_vs_wrr.ko.xz
ip_vs_ftp.ko.xz ip_vs_lblc.ko.xz ip_vs_lc.ko.xz ip_vs_pe_sip.ko.xz ip_vs_sed.ko.xz ip_vs_wlc.ko.xz
lvs只能做4层代理,也就是ip:端口进行转发
2.1. LVS常用的负载调度算法
①轮询(Round Robin)
- 将收到的访问请求按照顺序轮流分配给群集中的各节点 (真实服务器)
- 均等地对待每台服务器,而不管服务器实际的连接数和系统负载。
②加权轮询(Weighted Round Robin)
- 根据调度器设置的权重值来分发请求
- 权重值高的节点优先获得任务并且分配的请求越多
- 这样可以保证性能高的节点承担更 多请求。
③最少连接(Least Connections)
- 根据真实服务器已建立的连接数进行分配
- 将收到的访问请求优先分配给连接数最少的节点
- 如果所有的服务器节点性能相近,采用这种方式可以更好的均衡负载
④加权最少连接(Weighted Least Connections)
- 在服务器节点的性能差异较大的 情况下,调度器可以根据节点服务器负载自动调整权重
- 权重较高的节点将承担更 大比例的活动连接负载。
⑤IP_Hash
- 根据请求来源的IP地址进行Hash计算,得到后端服务器
- 这样来自同一个IP的请求总是会落到同一台服务器上处理,以致于可以将请求上下文信息存储在这个服务器上
⑥url_hash
- 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器
- 后端服务器为缓存时比较有效
⑦fair
- 采用的不是内建负载均衡使用的轮换的均衡算法
- 而是可以根据页面大小、加载时间长短智能的进行负载均衡
- 也就是根据后端服务器时间来分配用户请求,响应时间短的优先分配
2.2 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 |
2.3 群集的负载调度技术有三种工作模式 地址转换(NAT模式) Network Address Translation,简称NAT模式 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
IP隧道 (TUN模式) IP Tunnel,简称TUN模式: 采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器 服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信
直接路由 (DR模式) Direct Routing,简称DR模式 采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络 负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
三. LVS-net群集部署
LVS调度器作为Web服务器池的网关,LVS两块网卡,分别连接内外网,使用轮询(rr)调度算法
3.1部署步骤
-
1.加载ip_vs模块,安装ipvsadm工
-
2.开启路由转发
-
3.新建LVS虚拟服务器并添加节点服务器
-
4.配置节点服务器建立
- 测试网站
- 挂载NFS共享存储
- 建立测试网页
-
5.保存规则并测试
3.2 部署nfs共享存储
ip:192.168.159.104
3.2.1 关闭防火墙,安装rpc-bind服务
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenfroce 0
[root@localhost ~]# yum install nfs-utils rpcbind -y
3.2.2建立两个文件夹放置两个html测试文件
[root@localhost opt]# cd /opt
[root@localhost opt]# mkdir -p nfs/test
[root@localhost opt]# mkdir -p nfs/test2
[root@localhost nfs]# echo '<h1>This is html test<h1>' >test/index.html #写入文件1
[root@localhost nfs]# echo '<h1>This is html test2<h1>' >test2/index.html #写入文件2
[root@localhost nfs]# chmod 777 accp/ benet/ #赋予其他用户权限
3.3.3 设置nfs共享策略
[root@localhost test2]# vim /etc/exports
#写入以下内容
/opt/nfs/test 192.168.159.0/24(rw,sync,no_root_squash)
/opt/nfs/test2 192.168.159.0/24(rw,sync,no_root_squash)
[root@localhost test2]# systemctl start rpcbind ##一般先开启rpcbind
[root@localhost test2]# systemctl start nfs ##后开启nfs
[root@localhost test2]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@localhost test2]# showmount -e ##查看当前共享目录
Export list for localhost.localdomain:
/opt/nfs/test2 192.168.159.0/24
/opt/nfs/test 192.168.159.0/24
etc/exports写入文件内容
etc/exprot参数说明:
- Rw :该主机对该共享目录有读写权限
- No_root_squash: 客户机用root访问该共享文件夹时,不映射root用户
- Sync: 资料同步写入到内存与硬盘中
3.3 部署节点服务器1
ip:192.168.159.102
#关闭防火墙
systemctl disable --now firewalld.service
setenforce 0
#安装httpd服务
yum install httpd -y
#查看nfs服务
showmount -e 192.168.159.104
#挂载站点
mount 192.168.159.104:/opt/nfs/test /var/www/html/
#开启httpd服务
systemctl start httpd
#指定网关
vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.159.100
DNS1=8.8.8.8
#重启网络服务
systemctl restart network
关闭防火墙和selinux
安装httpd服务
查看nfs共享
挂在并查看是否成功、启动httpd服务
指定网关
重启网卡
3.4 部署节点服务器2
与节点1部署基本一样
可以使用任何web服务共享nfs的网页文件,只需要将nfs共享目录挂载到web服务默认的网页文件夹即可
#关闭防火墙
systemctl disable --now firewalld.service
setenforce 0
#安装httpd服务
yum install httpd -y
#查看nfs服务
showmount -e 192.168.159.104
#挂载站点
mount 192.168.159.104:/opt/nfs/test2 /var/www/html/
#开启httpd服务
systemctl start httpd
#查看是否挂载nfs成功
df -h
#指定网关
vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.159.100
DNS1=8.8.8.8
#重启网络服务
systemctl restart network
或
ifdown ens33 && ifup ens33
关闭防火墙并安装Apache
查看nfs服务并挂载站点
修改网关
重启网卡
3.4 部署负载调度器
1. #关闭防火墙
systemctl stop firewalld
setenforce 0
2. #安装ipvsadm
yum install -y ipvsadm*
3. #添加一块网卡,我这里是ens36,配置网卡,重启网络
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens38
vim ifcfg-ens38
去掉网关、UUID、修改IP
vim ifcfg-ens33
去掉网关
systemctl restart network
4. #打开路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p ##重新加载
5. #防火墙做策略
#查看策略
iptables -nL -t nat
#清空策略
iptables -F
#添加策略做snat
iptables -t nat -A POSTROUTING -s 192.168.159.0/24 -o ens36 -j SNAT --to 12.0.0.254
#查看策略
iptables -nL -t nat
6. #加载LVS内核模块
modprobe ip_vs
cat /proc/net/ip_vs
7. #开启ipvsadm服务
ipvsadm-save >/etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
8. #清空策略
ipvsadm -C
9. #制定策略
#指定IP地址 外网的入口 -s rr 轮询
ipvsadm -A -t 12.0.0.254:80 -s rr
#先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
ipvsadm -a -t 12.0.0.254:80 -r 192.168.159.102:80 -m
ipvsadm -a -t 12.0.0.254:80 -r 192.168.159.105:80 -m
#开启服务
ipvsadm
10. 查看策略
ipvsadm -l
关闭防火墙和selinux
安装ipcsdam服务
添加网卡并配置
修改ens33网卡和ens36网卡
打开路由转发功能并重新加载
做防火墙策略
开启ipvsadm服务
清空策略,以防万一
指定ipcsadm策略并开启策略
查看策略
3.5 设置客户端主机(win7)
关闭防火墙,并设置网卡信息
测试连通性
访问
实验总结:
此实验容易卡在客户端和节点服务器1和节点服务器2的连通性上,在设置两台节点服务器时,网关出口一定要设置为负载调度器的ip地址。以此联通