1、企业群集应用概述
(1)群集的含义
- Cluster,集群(也称群集)
- 由多台主机构成,都做相同的一件事,但对外只表现为一一个整体,只提供一个访问入口(域名或IP地址), 相当于一台大型计算机
对于企业服务的的性能提升两种方式:
- 纵向扩展 :对服务器的CPU 内存 硬盘 等硬件进行升级或者扩容来实现的,性能上限会有瓶颈,成本昂贵,收效比不高等问题
- 横向扩展 :通过增加服务器主机数量来实现
(2)企业群集分类
- 负载均衡群集(LB):提高应用系统的响应能力,处理更多的访问请求,减少延迟,实现高并发、高负载的能力,同时也是如今企业运用最多的群集类型。
- 高可用群集(HA): 提高应用系统的可靠性,减少服务中断时间标,确保服务的连续性,达到高可用(HA)的容错效果。(通常使用n个9来代表高可用的指标)
- 高性能运算群集(HPC):将多台服务器的硬件资源整合成资源池以获取高性能的CPU、内存等资源,来提高整体运算能力
2、LVS负载均衡群集运用理论
(1)负载均衡的架构
第一层:负载调度器:
访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP 地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。
第二层:服务器池:
群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
第三层:共享存储 :
为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。共享存储可以使用 NAS设备,或者提供 NFS共享服务的专用服务器。
(2)LVS负载均衡群集工作的三种模式
地址转换(NAT模式) ,直接路由(DR模式),IP隧道(IP-TUN)。对于商用来说,最常用是NAT模式和DR模式
1)NAT模式
调度器会作为所有节点服务器的默认网关,也是客户端的访间入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会成为整个群集的件能低颈。由于节点服务器都会处于内网环境并使用私网IP,所以NAT模式具有一定的安全性。
2)TUN模式
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。由于节点服务器需要部署在不同的互联网环境中,所以需要有独立的公网IP。调度器与节点服务器是通过专用的IP隧道相五通信因此IP隧道模式的成本较高、网络安全性较低密,且数据在IP隧道传输的过程中需要额外的封装和解封装过程,性能也会受到一定的影响。
3)DR模式
调度器也是仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NBT模式的区别)节点服务器与调度器是部署在同一个物理网络中,因此不需要专用的IP隧道(JIP隧道模式的区别)DR模式是企业首选的IVs模式。
3、LVS虚拟服务器(Linux Virtual Server)
- 针对Linux内核开发的负载均衡
- 1998年5月,由我国的章文嵩博士创建
- 官方网站:www.linuxvirtualserver.org/
- LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出来一种高效的解决方法
(1) ip_vs通用模块
LVS所有相关的调度算法模块
[root@zx1 ~]# ls /usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs
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
[root@zx1 ~]#
LVS现在已成为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够自动调动。
在CentOS 7 系统中,手动加载 ip_vs 模块的命令如下:
modprobe ip_vs 手动加载 ip_vs 模块
cat /proc/net/ip_vs 查看当前系统中ip_vs模块的版本信息
[root@zx1 ~]# cat /proc/net/ip_vs
cat: /proc/net/ip_vs: 没有那个文件或目录
[root@zx1 ~]# modprobe ip_vs
[root@zx1 ~]# 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@zx1 ~]#
(2)LVS调度器用的调度方法
固定调度算法: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,并以它作为下一次分配的首先考虑。
(3)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 [-t VIP:PORT]
4、NAT模式 LVS负载均衡群集部署
准备工具
四台linux虚拟机加一台windows虚拟机
20.0.0.10做LVS调度器
20.0.0.20和20.0.0.30做nginx web服务器
20.0.0.40做NFS共享存储
(1)虚拟机做初始化操作
[root@zx1 ~]# systemctl stop firewalld
[root@zx1 ~]# setenforce 0
(2)配置NFS共享存储
[root@zx4 ~]# yum -y install nfs-untils rpcbind
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
没有可用软件包 nfs-untils。
软件包 rpcbind-0.2.0-49.el7.x86_64 已安装并且是最新版本
[root@zx4 ~]# mkdir /share
[root@zx4 ~]# cd /
[root@zx4 /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin share srv sys tmp usr var
[root@zx4 /]# vim /etc/exports
[root@zx4 /]# systemctl enable --now rpcbind nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@zx4 /]# showmount -e
Export list for zx4:
/share 20.0.0.0/24
[root@zx4 /]#
/share 20.0.0.0/24(ro) ##文件添加内容
(3)nginx服务器部署
1)两台nginx服务器yum安装nginx
上传nginx.repo至/etc/yum.repos.d目录中
[root@zx2 ~]# cd /etc/yum.repos.d/
[root@zx2 yum.repos.d]# ls
local.repo repo.bar
[root@zx2 yum.repos.d]# ls
local.repo nginx.repo repo.bar
[root@zx2 yum.repos.d]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1913504 0 1913504 0% /dev
tmpfs 1930624 0 1930624 0% /dev/shm
tmpfs 1930624 21104 1909520 2% /run
tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
/dev/mapper/centos-root 36805060 5419432 31385628 15% /
/dev/sda1 1038336 191268 847068 19% /boot
tmpfs 386128 40 386088 1% /run/user/0
/dev/sr0 4635056 4635056 0 100% /mnt
[root@zx2 yum.repos.d]# yum install -y nginx
-------------------------------------------------------------------------------------------
[root@zx3 ~]# cd /etc/yum.repos.d/
[root@zx3 yum.repos.d]# ls
local.repo repos.bak
[root@zx3 yum.repos.d]# ls
local.repo nginx.repo repos.bak
[root@zx3 yum.repos.d]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1913628 0 1913628 0% /dev
tmpfs 1930648 0 1930648 0% /dev/shm
tmpfs 1930648 21004 1909644 2% /run
tmpfs 1930648 0 1930648 0% /sys/fs/cgroup
/dev/mapper/centos-root 36805060 5574980 31230080 16% /
/dev/sda1 1038336 189024 849312 19% /boot
tmpfs 386132 60 386072 1% /run/user/0
/dev/sr0 4600876 4600876 0 100% /mnt
[root@zx3 yum.repos.d]# yum install -y nginx
2)NFS虚拟机准备测试界面
[root@zx4 /]# cd /share/
[root@zx4 share]# ls
[root@zx4 share]# echo 'this is nginx web1 test page' > test.html
[root@zx4 share]# cat test.html
this is nginx web1 test page
[root@zx4 share]# cd /
[root@zx4 /]# mkdir share2
[root@zx4 /]# vim /etc/exports
[root@zx4 /]# exportfs -avr
exporting 20.0.0.0/24:/share2
exporting 20.0.0.0/24:/share
[root@zx4 /]# echo 'this is nginx web2 test page' > /share2/test.html
[root@zx4 /]# cd share2
[root@zx4 share2]# ls
test.html
[root@zx4 share2]#
/share 20.0.0.0/24(ro)
/share2 20.0.0.0/24(ro)
3)将测试界面分别挂载到两台nginx虚拟机
20.0.0.20
[root@zx2 yum.repos.d]# cd /usr/share/nginx/html/
[root@zx2 html]# ls
50x.html index.html
[root@zx2 html]# mkdir xy101
[root@zx2 html]# ls
50x.html index.html xy101
[root@zx2 html]# vim /etc/fstab
20.0.0.40:/share /usr/share/nginx/html/xy101 nfs defaults,_netdev 0 0
##在文件末行添加内容
[root@zx2 html]# mount -a
[root@zx2 html]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 21M 1.9G 2% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 36G 5.2G 30G 15% /
/dev/sda1 xfs 1014M 187M 828M 19% /boot
tmpfs tmpfs 378M 40K 378M 1% /run/user/0
/dev/sr0 iso9660 4.5G 4.5G 0 100% /mnt
20.0.0.40:/share nfs4 38G 4.4G 34G 12% /usr/share/nginx/html/xy101
[root@zx2 html]# vim /etc/nginx/nginx.conf
keepalive_timeout 0; ##27行65改成0,关闭长连接
[root@zx2 html]# systemctl start nginx
[root@zx2 html]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@zx2 html]#
20.0.0.30
[root@zx3 yum.repos.d]# cd /usr/share/nginx/html/
[root@zx3 html]# ls
50x.html index.html
[root@zx3 html]# mkdir xy101
[root@zx3 html]# ls
50x.html index.html xy101
[root@zx3 html]# vim /etc/fstab
20.0.0.40:share2 /usr/share/nginx/html/xy101 nfs defaults,_netdev 0 0
[root@zx3 html]# mount -a
[root@zx3 html]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 21M 1.9G 2% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 36G 5.4G 30G 16% /
/dev/sda1 xfs 1014M 185M 830M 19% /boot
tmpfs tmpfs 378M 60K 378M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt
20.0.0.40:/share2 nfs4 38G 4.4G 34G 12% /usr/share/nginx/html/xy101
[root@zx3 html]# cd /usr/share/nginx/html/xy101/
[root@zx3 xy101]# ls
test.html
[root@zx3 xy101]# cat test.html
this is nginx web2 test page
[root@zx3 xy101]# vim /etc/nginx/nginx.conf
keepalive_timeout 0;
[root@zx3 xy101]# systemctl start nginx
[root@zx3 xy101]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@zx3 xy101]#
(4)修改网卡配置
20.0.0.10(LVS调度器)
添加一张新的网卡
[root@zx1 ~]# cd /etc/sysconfig/network-scripts/
[root@zx1 network-scripts]# cp ifcfg-ens33 ifcfg-ens35
[root@zx1 network-scripts]# ls
ifcfg-ens33 ifdown-bnep ifdown-ipv6 ifdown-routes ifdown-tunnel ifup-eth ifup-isdn ifup-ppp ifup-TeamPort network-functions
ifcfg-ens35 ifdown-eth ifdown-isdn ifdown-sit ifup ifup-ib ifup-plip ifup-routes ifup-tunnel network-functions-ipv6
ifcfg-lo ifdown-ib ifdown-post ifdown-Team ifup-aliases ifup-ippp ifup-plusb ifup-sit ifup-wireless
ifdown ifdown-ippp ifdown-ppp ifdown-TeamPort ifup-bnep ifup-ipv6 ifup-post ifup-Team init.ipv6-global
[root@zx1 network-scripts]# vim ifcfg-ens33
[root@zx1 network-scripts]# vim ifcfg-ens35
[root@zx1 network-scripts]# systemctl restart network
ens33网卡文件
ens35网卡配置文件
20.0.0.20
[root@zx2 xy101]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@zx2 xy101]# systemctl restart network
[root@zx2 xy101]#
20.0.0.30
[root@zx3 xy101]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@zx3 xy101]# systemctl restart network
(5)修改LVS服务器
20.0.0.10
开启路由转发功能
[root@zx1 network-scripts]# vim /etc/sysctl.conf
[root@zx1 network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
[root@zx1 network-scripts]#
net.ipv4.ip_forward=1 ##在文件末行添加内容
设置SNAT规则
[root@zx1 network-scripts]# iptables -t nat -A POSTROUTING -s 20.0.0.0/24 -o ens35 -j SNAT --to 12.0.0.30
[root@zx1 network-scripts]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 20.0.0.0/24 0.0.0.0/0 to:12.0.0.30
[root@zx1 network-scripts]#
加载模块
[root@zx1 network-scripts]# cd /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs
[root@zx1 ipvs]# for i in $(ls | awk -F. '{print $1}'); do modprobe $i; done
[root@zx1 ipvs]# lsmod
使用ipvsadm配置LVS-NAT模式转发规则
[root@zx1 ipvs]# yum install -y ipvsadm
[root@zx1 ipvs]# touch /etc/sysconfig/ipvsadm
[root@zx1 sysconfig]# systemctl start ipvsadm
[root@zx1 sysconfig]# systemctl status ipvsadm
[root@zx1 sysconfig]# systemctl enable ipvsadm
[root@zx1 sysconfig]# ipvsadm -A -t 12.0.0.30:80 -s rr
[root@zx1 sysconfig]# ipvsadm -a -t 12.0.0.30:80 -r 20.0.0.20:80 -m
[root@zx1 sysconfig]# ipvsadm -a -t 12.0.0.30:80 -r 20.0.0.30:80 -m
[root@zx1 sysconfig]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP zx1:http rr
-> 20.0.0.20:http Masq 1 0 0
-> 20.0.0.30:http Masq 1 0 0
[root@zx1 sysconfig]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 12.0.0.30:80 rr
-> 20.0.0.20:80 Masq 1 0 0
-> 20.0.0.30:80 Masq 1 0 0
[root@zx1 sysconfig]#
(6)windows测试
网页验证