LVS负载均衡群集(理论+实验)

前言:

可伸缩网络服务涉及到几种不同的结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。

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"检查挂载状态,重启虚拟机有可能出现挂载无法生效或者无法挂载的问题。

发布了48 篇原创文章 · 获赞 46 · 访问量 6605

猜你喜欢

转载自blog.csdn.net/weixin_45726050/article/details/103993089