文章目录
前言:
可伸缩网络服务涉及到几种不同的结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。
LVS原理会贯穿所有负载均衡的服务中,LVS的处理机制主要有:访问请求的唯一入口、根据服务器状态进行调度分配(有调度算法)、对后端所有服务器进行健康检查。
一、企业群集应用概述
1.1 群集的基本概述
-
Cluster,集群,群集
-
由多台主机构成,但对外之表现为一个整体
在互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器力不从心
-
解决方法
使用价格昂贵的小型机、大型机
使用普通服务器构建服务群集
1.2 企业群集分类
-
根据群集所针对的目标差异,可分为三种类型:
负载均衡群集
高可用群集
高性能群集
高可用群集(高可靠) :两个调度器一主一备 ,两台调度器组合成群集 ,两台调度器可不在同一个地方
高性能运算群集 :拥有不止一个CPU/GPU及所有硬件进行运算(算力)存储、带宽、内存、cpu等可以计算的效能叫做算力,具备以上功能的服务器的集合为运算群集
-
负载均衡群集 (Load Balance Cluster)
以提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
LB的负载分配依赖于主节点的分流算法
-
高可用群集(High Availability Cluster)
以提高应用系统的可靠性、尽可能的减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
HA的工作方式包括双工和主从两种模式
-
高性能运算群集 (High Performancd Computer Cluster)
以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当大型、超级计算机的高性能运算(HPC)能力
高性能运算群集的高性能依赖于“分布式运算”、“并行计算”,通过专用硬件的软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力
HA :高可用、
双工: 两台服务器/调度器 为平级状态,业务来的时候两台都可以处理(去中心化机制)群集中服务器之间为平级关系
主从 : 两台服务器一个为主、一个为从或多个从。群集中有主、从关系称为中心化机制
去中心化机制案例:redis群集(典型)
高性能运算群集实例:“云” 逻辑意义上分配,类似LVM组成卷组的方式。
1.3 负载均衡群集工作模式分析
-
负载均衡群集是目前企业用得最多的群集类型
-
群集的负载调度技术有三种工作模式
地址转换 ⭐
IP隧道
直接路由 ⭐
1.3.1 NAT模式
-
地址转换 (Network Address Translation)
简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为索引服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口
服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
中间的服务器是网关(作为软件防火墙)
此服务器对内端口作为内网网关、对外端口作为外网网关,所以需要开启路由功能
从内网传输数据到外网时,需要做IP映射(转换) 映射到公网地址。
同时对内服务器进行调度分配、根据请求分配给后两台服务中的一台
出口进口、调度分配、地址转换、路由功能等、均由LVS服务器完成。
当然对于现网环境,会在此服务器对外的口子加上硬件防火墙增强安全,同时增加一台流量清理服务器。
1.3.2 TUN模式
- IP隧道(IP Tunnel)
简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的internet连接,直接回应客户机,而不再经过负载调度器
服务器节点分散在互联网的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信
服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道(VPN)与负载调度器相互通信
VPN实现了两重加密:
① 隧道加密
② 数据加密
VPN在私网和公网都会应用
IP隧道的所有服务器都在公网模式下
1.3.3 DR模式
-
直接路由 (Direct Routing)
简称DR模式,采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
DR模式存在于私网,所有服务器都使用私有IP
负责调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
补充:阿里使用的负载均衡调度器是SLB
SLB 包含LVS和Tengine(基于nginx功能开发)
LVS 控制的是四层 (传输层)即可控制IP也可以控制端口
Tengine 控制的7层 (应用层例如HTTP HTTPS)
所以SLB集合控制四层和七层,安全性很高
- 小结:三种工作模式的区别
1.4 负载均衡群集架构
-
负载均衡的结构
第一层,负载调度器 (Load Balancer 或Director)
第二次,服务器池 (Server Pool)
第三次,共享存储 (Share Storage)
-
负载均衡的结构
1.53 关于LVS虚拟服务器
1.5.1 LVS的负载调度算法
-
轮询 (Round Robin)
将受到的访问请求按照顺序轮流分配给群集中的各节点(真实服务器)
均等地对待每一台服务器,而不管服务器实际的连接数和系统负载
-
加权轮询 (Weighted Round Robin)
根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重(人工分配)
保证处理能力强的服务器承担更多的访问流量
-
最少连接 (Least Connections)
根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点
-
加权最少连接 (Weighted Least Connections)
在服务器节点的性能差异较大的情况下,可以为真实服务器自动调正权重
权重较高的节点将承担更大比例的活动连接负载
1.5.2 ipvsadm工具
- LVS群集创建与管理
二、LVS负载均衡实验
环境:准备5台虚拟机,其中4台centos 7一台win10(client),此实验均在虚拟机仅主机模式下进行(安装包安装完成后开启仅主机模式
定位:centos 7-4中第一台作为LVS调度器+防火墙 ,centos7-5、centos7-6作为web服务器,centos7-7作为NFS提供存储(添加两块硬盘)
2.1 配置环境
实验拓扑:
2.2 配置NFS服务器
2.2.1 添加磁盘、磁盘分区、格式化
添加磁盘:
磁盘分区:
[root@nfs ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xf6bf2791 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
....省略部分内容
[root@nfs ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xd12fa76d 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
....省略部分内容
格式化:
[root@nfs ~]# mkfs.xfs /dev/sdb1 #格式化sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@nfs ~]# mkfs.xfs /dev/sdc1 #格式化sdc
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
2.2.2 创建挂载点、设置自动挂载
[root@nfs ~]# mkdir /opt/taob /opt/jingd
[root@nfs ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Dec 15 19:55:12 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=ad52e9a7-bcbd-481e-be2d-1cd6177ec542 / xfs defaults 0 0
UUID=fd2b2857-4bac-494d-bdd5-45bd2ca5004d /boot xfs defaults 0 0
UUID=c2f010c9-e20f-4556-a19a-ab2aa5e02ec6 /home xfs defaults 0 0
UUID=f54739b0-771c-41cc-8c95-29831e2ebbf1 swap swap defaults 0 0
/dev/sdb1 /opt/taob xfs defaults 0 0 #将sb1挂载到/opt/taob上
/dev/sdc1 /opt/jingd xfs defaults 0 0 #将sdc1挂载到/opt/jingd上
------->wq
[root@nfs ~]# mount -a #开启挂载
[root@nfs ~]# df -hT #查看挂载点
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 3.3G 17G 17% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.0M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 37M 10G 1% /home
/dev/sda1 xfs 4.0G 174M 3.9G 5% /boot
tmpfs tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs tmpfs 183M 20K 183M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 xfs 20G 33M 20G 1% /opt/taob
/dev/sdc1 xfs 20G 33M 20G 1% /opt/jingd
2.2.3 共享存储空间
[root@nfs ~]# systemctl stop firewalld.service #关闭防火墙
[root@nfs ~]# setenforce 0 #关闭增强性安全功能
[root@nfs ~]# rpm -q nfs-utils #检查环境包
nfs-utils-1.3.0-0.48.el7.x86_64
[root@nfs ~]# rpm -q rpcbind #检查环境包 rpcbind(远程调用)
rpcbind-0.2.0-42.el7.x86_64
[root@nfs ~]# vim /etc/exports #设置共享数据
/opt/taob 192.168.100.0/24(rw,sync,no_root_squash)
/opt/jingd 192.168.100.0/24(rw,sync,no_root_squash)
#将挂载点共享给192.168.100.0/24网段(开启读写功能,开启同步数据写入内存功能,不对访问的root用户做降级处理)
-------》wq
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl start rpcbind
#开启nfs服务及rpcbind远程调用服务
[root@nfs ~]# showmount -e #查询是否可以提供存储路径
Export list for nfs:
/opt/jingd 192.168.100.0/24
/opt/taob 192.168.100.0/24
2.2.4 修改网卡
[root@nfs ~]# cd /etc/sysconfig/network-scripts/
[root@nfs network-scripts]# vim ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" #将dhcp动态获取更改为静态获取static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.100.120 #IP地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.100.1 #网关
-------》wq
[root@nfs network-scripts]# ifconfig
- NFS ip为:
2.3 配置web节点服务器
2.3.1 安装apache
在两台web服务器安装httpd
[root@web1 ~]# yum install httpd -y
.......省略部分内容
[root@web2 ~]# yum install httpd -y
.......省略部分内容
2.3.2 修改两台web网卡
可直接执行:
#web1
cd /etc/sysconfig/network-scripts/
sed -i '4s/dhcp/static/' ifcfg-ens33
sed -i '13d' ifcfg-ens33
cat >> /etc/sysconfig/network-scripts/ifcfg-ens33 <<-EOF
IPADDR=192.168.100.110
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
EOF
#web2
cd /etc/sysconfig/network-scripts/
sed -i '4s/dhcp/static/' ifcfg-ens33
sed -i '13d' ifcfg-ens33
cat >> /etc/sysconfig/network-scripts/ifcfg-ens33 <<-EOF
IPADDR=192.168.100.111
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
EOF
更改完成后开启仅主机模式,重启网卡
[root@web1 ~]# systemctl stop firewalld.service
[root@web1 ~]# setenforce 0
[root@web1 ~]# systemctl restart network
-
web1服务器IP为:
-
web2服务器IP为:
2.2.2 挂载网络设备
- 在两台web节点服务器上查询共享挂载点:
#web1节点服务器
[root@web1 network-scripts]# showmount -e 192.168.100.120
Export list for 192.168.100.120:
/opt/jingd 192.168.100.0/24
/opt/taob 192.168.100.0/24
#web2节点服务器
[root@web2 network-scripts]# showmount -e 192.168.100.120
Export list for 192.168.100.120:
/opt/jingd 192.168.100.0/24
/opt/taob 192.168.100.0/24
- 在两台服务器上挂载网络设备
#web1节点服务器
[root@web1 network-scripts]# echo '192.168.100.120:/opt/taob /var/www/html nfs defaults,_netdev 0 0' >> /etc/fstab
[root@web1 network-scripts]# mount -a #执行生效
#web2节点服务器
[root@web2 network-scripts]# echo '192.168.100.120:/opt/jingd /var/www/html nfs defaults,_netdev 0 0' >> /etc/fstab
[root@web2 network-scripts]# mount -a #执行生效
192.168.100.120:/opt/taob /var/www/html nfs defaults,_netdev 0 0 >> /etc/fstab
挂载信息含义:
192.168.100.120:/opt/taob:指明NFS服务器的地址及其挂载点
/var/www/html :本web服务器的站点首页
nfs:文件类型为nfs
defaults,_netdev :挂载类似为默认和网络设备挂载
0 0 : 备份、容灾
- 在两台节点服务中编辑站点首页内容
#web1节点服务器
[root@web1 network-scripts]# cd /var/www/html/
[root@web1 html]# vim index.html
<h1>this is taob web</h1>
-------》wq
#web2节点服务器
[root@web2 network-scripts]# cd /var/www/html
[root@web2 html]# vim index.html
<h1>this is jingd web</h1>
-------》wq
- 启动apache服务并检查端口状态
#web1节点服务器
[root@web1 html]# systemctl start httpd
[root@web1 html]# netstat -natp | grep 80
tcp6 0 0 :::80 :::* LISTEN 7355/httpd
#web2节点服务器
[root@web2 html]# systemctl start httpd
[root@web2 html]# netstat -natp | grep 80
tcp6 0 0 :::80 :::* LISTEN 6732/httpd
2.4 配置LVS服务器
2.4.1 安装ipvsadm工具、nfs
[root@localhost ~]# yum install ipvsadm -y
....省略部分内容
root@localhost ~]# yum install nfs-utils -y
....省略部分内容
- 开启远程调用服务与nfs服务
[root@localhost ~]# service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service
[root@localhost ~]# service nfs restart
Redirecting to /bin/systemctl restart nfs.service
2.4.2 配置网卡
-
LVS服务器中ens33网卡为外网网关、ens36网卡是内网网关,配置后网卡信息如下:
-
测试连通性:
使用两台web节点服务器ping 192.168.100.1
web1节点服务器:
web2节点服务器:
2.4.3 开启路由转发功能
[root@localhost network-scripts]# cat >> /etc/sysctl.conf <<-EOF
> net.ipv4.ip_forward=1
> EOF
[root@localhost network-scripts]# sysctl -p #让内核参数立即生效
net.ipv4.ip_forward = 1
2.5 设置防火墙
- 实验中我们可以清除防火墙转发表和nat地址转换表
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -t nat -F
- 设置防火墙规则(地址映射/转化)
方式一:
[root@localhost network-scripts]# iptables -t nat -A POSTROUTING -o ens34 -s 192.168.100.0/24 -j SNAT --to-source 12.0.0.1
方式二:
[root@localhost network-scripts]# iptables -t nat -I POSTROUTING -s 192.168.100.110/24 -o ens33 -j SNAT --to-source 12.0.0.1
[root@localhost network-scripts]# iptables -t nat -I POSTROUTING -s 192.168.100.111/24 -o ens33 -j SNAT --to-source 12.0.0.1
2.6 加载LVS调度模块、定义脚本
- 加载LVS调度模块
[root@localhost network-scripts]# modprobe ip_vs
[root@localhost network-scripts]# 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 network-scripts]# ipvsadm --save > /etc/sysconfig/ipvsadm #保存命令
[root@localhost network-scripts]# systemctl start ipvsadm
#开启ipvsadm功能
LVS调度模块是集成在内核中的,所以我们需要进行调用
- 定义脚本
[root@localhost network-scripts]# cd /opt
[root@localhost opt]# vim nat.sh
ipvsadm -C
ipvsadm -A -t 12.0.0.1:80 -s rr
ipvsadm -a -t 12.0.0.1:80 -r 192.168.100.110:80 -m
ipvsadm -a -t 12.0.0.1:80 -r 192.168.100.111:80 -m
ipvsadm
------>wq
[root@localhost opt]# chmod +x nat.sh
[root@localhost opt]# ./nat.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.100.110:http Masq 1 0 0
-> 192.168.100.111:http Masq 1 0 0
其中:
ipvsadm -C:清空ipvs缓存,相当于初始化
ipvsadm -A -t 12.0.0.1:80 -s rr:指定一个访问入口ip 端口为80 指定调度算法 rr(轮询)
ipvsadm -a -t 12.0.0.1:80 -r 192.168.100.110:80 -m:
-a 代表添加真实服务器 建立ip地址映射关系 映射地址是12.0.0.1
-r 代表添加真实IP地址是192.168.100.110
-m 指定开启的轮询机制使用的是NAT的LVS模式
2.7 验证结果
更改IPV4设置,如下:
使用浏览器访问12.0.0.1查看显示页面:
刷新网页查看页面:
实验证明LVS使用轮询的方式响应客户请求,LVS负载均衡NAT模式实验成功
总结:
本篇博客主要介绍了负载均衡群集的理论和LVS nat模式的实验,之后会继续介绍DR模式的配置步骤NAT实验中客户机无法访问内网web服务器的几种情况:1、防火墙规则设置有误 2、内网中防火墙未关闭等等, 若实验中虚拟机进行过重启,则可以先检查防火墙和增强性安全功能是否为关闭状态,然后检查nfs服务器使用 "df -hT"检查挂载状态,重启虚拟机有可能出现挂载无法生效或者无法挂载的问题。