在各种互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要 求越来越高,单台服务器已经无法满足负载均衡及高可用的要求。除了使用价格昂贵的大型 机、专用负载分流设备以外,企业还有另外一种选择来解决难题,那就是构建群集服务器— —通过整合多台服务器,使用 LVS 来达到服务器的高可用和负载均衡,并以同一个 IP 地址对外提供相同的服务。群集技术——LVS(Linux Virtual Server,Linux 虚拟服务器)
群集的称呼来自于英文单词“Cluster”,表示一群、一串的意思,用在服务器领域则表 示大量服务器的集合体,以区分于单个服务器
无论是哪种群集,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访 问入口。根据群集所针对的目标差异,可分为以下三种类型:
在典型的负载均衡群集中,包括三个层次的组件,如图 1.1 所示。前端至少有一个负载 调度器(Load Balancer,或称为 Director)负责响应并分发来自客户机的访问请求;后端 由大量真实服务器(Real Server)构成服务器池(Server Pool),提供实际的应用服务, 整个群集的伸缩性通过增加、删除服务器节点来完成,而这些过程对客户机是透明的;为了 保持服务的一致性,所有节点使用共享存储设备
关于群集的负载调度技术,可以基于 IP、端口、内容等进行分发,其中基于 IP 的负载调度是效率最高的。基于 IP 的负载均衡模式中,常见的有地址转换、IP 隧道和直接路由三种工作模式
以上三种工作模式中,NAT 方式只需要一个公网 IP 地址,从而成为最易用的一种负载均衡模式,安全性也比较好,许多硬件负载均衡设备就采用这种方式。相比较而言,DR 模 式和 TUN 模式的负载能力更加强大,适用范围更广,但节点的安全性要稍差一些。
Linux Virtual Server 是针对 Linux 内核开发的一个负载均衡项目,由我国的章文嵩博士在 1998 年 5 月创建,官方站点位于 http://www.linuxvirtualserver.org/。LVS 实际上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了一种 高效的解决方法。 LVS 现在已成为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够自动调用
针对不同的网络服务和配置需要,LVS 调度器提供多种不同的负载调度算法,其中最常 用的四种算法是轮询、加权轮询、最少连接和加权最少连接。
ipvsadm 是在负载调度器上使用的 LVS 群集管理工具,通过调用 ip_vs 模块来添加、删 除服务器节点 ,以 及 查 看 群集 的 运 行状 态 。 在 CentOS 7 系 统 中 , 需要手动安装 ipvsadm.x86_64 0:1.27-7.el7 软件包
角色 | 系统 | ip地址 | 环境准备 |
---|---|---|---|
客户机 | win7 | 12.0.0.128 | 绑定vm2网卡 |
nfs服务器 | centos 7.6 | 192.168.192.207 | 绑定wm1网卡,安装启动nfs服务 |
web服务器 | centos 7.6 | 192.168.192.205 | 绑定wm1网卡,安装启动apache |
web服务器 | centos 7.6 | 192.168.192.206 | 绑定wm1网卡,安装启动apache |
lvs服务器 | centos 7.6 | ens33:192.168.192.2 ens36:12.0.0.2 | 安装启动ipvsadm |
NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。通过使用 NFS 协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡 群集来说,使用 NFS 协议来共享数据存储是比较常见的做法,NFS 也是 NAS 存储设备必然支持的一种协议。
NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程 到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持
新建2块硬盘,重启机器,分区格式化磁盘
[root@nfs ~]#fdisk /dev/sdb
[root@nfs ~]#fdisk /dev/sdc
[root@nfs ~]# mkfs.xfs /dev/sdb1
[root@nfs ~]# mkfs.xfs /dev/sdc1
新建2个挂载目录,挂载磁盘
[root@nfs ~]# mkdir /opt/yjs /opt/cloud
[root@nfs ~]# vim /etc/fstab
/dev/sdb1 /opt/yjs xfs defaults 0 0
/dev/sdc1 /opt/cloud xfs defaults 0 0
[root@nfs ~]# mount -a
[root@nfs ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
……
/dev/sdb1 xfs 20G 33M 20G 1% /opt/yjs
/dev/sdc1 xfs 20G 33M 20G 1% /opt/cloud
安装nfs-util、rpcbind软件包
[root@nfs ~]# yum -y install nfs-utils rpcbind
NFS的配置文件为/etc/exports,文件内容默认为空(无任何共享)。在 exports 文件中设置共享资源时,记录格式为“目录位置 客户机地址(权限选项)”,其中客户机地址可以是主机名、IP 地址、网段地址,允许使用*、?通配符;权限选项 中的 rw 表示允许读写(ro 为只读),sync 表示同步写入,no_root_squash 表示当客户机以 root 身份访问时赋予本地 root 权限,以下是将两个存储目录共享给两台web服务器使用
[root@nfs ~]# vim /etc/exports
/opt/yjs 192.168.192.0/24(rw,sync,no_root_squash)
/opt/cloud 192.168.192.0/24(rw,sync,no_root_squash)
开启nfs、rpcbind服务并查看本机发布的 NFS 共享目录
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# showmount -e
Export list for nfs:
/opt/cloud 192.168.192.0/24
/opt/yjs 192.168.192.0/24
安装apache
[root@web1 ~]# yum -y install httpd
查看 NFS 服务器端共享了哪些目录
[root@web1 ~]# showmount -e 192.168.192.207
Export list for 192.168.192.207:
/opt/cloud 192.168.192.0/24
/opt/yjs 192.168.192.0/24
挂载nfs共享目录到/var/www/html下,因为这是站点目录,访问的主页要写在里面
注意将文件系统类型设为 nfs,挂载参数建议添加_netdev(设备需要网络)
[root@web1 ~]# vim /etc/fstab
192.168.192.207:/opt/yjs /var/www/html nfs defaults,_netdev 0 0
[root@web1 ~]# mount -a
[root@web1 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
……
192.168.192.207:/opt/yjs nfs4 20G 32M 20G 1% /var/www/html
因为是轮询模式,为了能够验证,要为2台服务器创建不同的主页,为第一台web服务器创建主页,显示为this is yjs web
[root@web1 ~]# vim /var/www/html/index.html
<h1>this is yjs web</h1>
启动apache
[root@web1 ~]# systemctl start httpd
安装apache
[root@web2 ~]# yum -y install httpd
查看 NFS 服务器端共享了哪些目录
[root@web2 ~]# showmount -e 192.168.192.207
Export list for 192.168.192.207:
/opt/cloud 192.168.192.0/24
/opt/yjs 192.168.192.0/24
挂载nfs共享目录到/var/www/html下
[root@web2 ~]# vim /etc/fstab
192.168.192.207:/opt/cloud /var/www/html nfs defaults,_netdev 0 0
[root@web2 ~]# mount -a
[root@web2 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
……
192.168.192.207:/opt/cloud nfs4 20G 32M 20G 1% /var/www/html
为第二台web服务器新建自己的主页,显示为this is cloud web
[root@web2 ~]# vim /var/www/html/index.html
<h1>this is cloud web</h1>
启动apache
[root@web2 ~]# systemctl start httpd
安装ipvsadm
[root@lvs ~]# yum -y install ipvsadm
新建一块网卡作为外网卡,绑定vm2
配置网卡,网卡名称ens36,重启网卡
对于 LVS 负载调度器来说,需开启路由转发规则,以便节点服务器能够访问 Internet。 所有的节点服务器、共享存储均位于私有网络内,其默认网关设为 LVS 负载调度器的内网地址
开启路由转发功能
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
配置防火墙,进行地址转换
[root@lvs ~]#iptables -F
[root@lvs ~]#iptables -t nat -F
[root@lvs ~]#iptables -t nat -A POSTROUTING -o ens36 -s 192.168.192.0/24 -j SNAT --to-source 12.0.0.2
加载lvs内核模块,然后查看结果
[root@lvs ~]# modprobe ip_vs
[root@lvs ~]# 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
配置负载分配策略,群集的 VIP 地址为 12.0.0.2,针对 TCP 80 端口提供负载分流服务,使用的调度算法为轮询
[root@lvs ~]#vim /opt/nat.sh
#!/bin/bash
ipvsadm -C <----清除原有配置
ipvsadm -A -t 12.0.0.2:80 -s rr
ipvsadm -a -t 12.0.0.2:80 -r 192.168.192.205 -m
ipvsadm -a -t 12.0.0.2:80 -r 192.168.192.206 -m
ipvsadm
上述操作中
[root@lvs ~]# chmod +x /opt/nat.sh
[root@lvs ~]# cd /opt
[root@lvs opt]# ./nat.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP lvs:http rr
-> 192.168.192.205:http Masq 1 0 0
-> 192.168.192.206:http Masq 1 0 0
[root@lvs ~]# ipvsadm --save > /etc/sysconfig/ipvsadm <------使用导出/导入工具 ipvsadm-save/ipvsadm-restore 保存策略
启动ipvsadm
[root@lvs ~]# systemctl start ipvsadm