Web服务器群集——企业级调度器LVS(LVS-NAT,LVS-DR负载均衡集群配置)

企业级调度器LVS(LVS-NAT,LVS-DR负载均衡集群配置)

  • 一、企业级调度器LVS(Linux Virtual Server)
    • 1.1 集群和分布式
    • 1.2 集群功能分类
    • 1.3 负载均衡
      • 1.3.1 负载均衡的主要方式
      • 1.3.2 四层负载和七层负载
  • 二、LVS概述
    • 2.1 LVS工作模式
      • 2.1.1 NAT转发模式
      • 2.1.2 DR直连路由模式
      • 2.1.3 TUN-IP隧道模式
      • 2.1.4 FULL-NAT
      • 2.1.5 模式对比
  • 三、LVS-NAT部署
    • 3.1 实验环境
    • 3.2 实验步骤
      • 3.2.1 web1配置网站和路由
      • 3.2.2 web2配置网站和路由
      • 3.2.3 LVS-NAT配置路由功能和负载策略
    • 3.3 客户端测试
  • 四、LVS-DR部署
    • 4.1 实验环境
    • 4.2 实验步骤
      • 4.2.1 LVS服务器
      • 4.2.2 LVS准备VIP和路由
      • 4.2.3 设置路由转发
      • 4.2.4 LVS设置负载均衡条目/规则
      • 4.2.5 LVS让配置永久生效
      • 4.2.6 Web集群
      • 4.2.7 两个Web服务器的lo网卡设置子网掩码为32位VIP
      • 4.2.8 为两个Web服务器设置内核参数
      • 4.2.9 客户端测试
  • 五、轮询算法
    • 总结:关于命令

一、企业级调度器LVS(Linux Virtual Server)

  • 集群概念
  • LVS模型
  • LVS调度算法
  • LVS实现

1.1 集群和分布式

系统性能扩展方式:

  • Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
  • Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题

1.2 集群功能分类

  • LB:Load Balancing负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着眼点

在这里插入图片描述

  • HA:High Availability高可用集群(增加服务可用性),高可用集群,是以提升服务的始终在线能力为着眼点,不会因为宕机而导致服务不能用

衡量可用性:在线时间/(在线时间+故障处理时间)
99%:一年有三天不在线
99.9%:一年有0.3天不在线
99.99%:一年有0.03天不在线
99.999%:一年有0.003天不在线
Keepalived能够做到这一点

在这里插入图片描述

HA为LB服务

1.3 负载均衡

  • 负载均衡(Load Banlance),当然这只是一个简单的概括,比如,我有10台机器都提供Web服务,那么我如何进行均衡的利用这10台机器呢,让这10台机器保证高性能、高可用、高并发就是负载均衡要考虑和要做的事情
  • 实现负载均衡一般可以使用顺序、比重、流量、服务类别等进行分配,负载均衡的部署方式也可以分为路由和服务直接返回模式

1.3.1 负载均衡的主要方式

本方式仅限于负载均衡集群可用的方式 其余不做描述

一、网络层负载均衡

  • LVS-NAT

在网络层和传输层(IP和端口)通过修改目标地址进行负载均衡
用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器,
然后将用户请求的目标地址修改成真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再将数据返回回去,类似反向服务器负载均衡

在这里插入图片描述

优点:相应请求时速度较反向服务器负载均衡要快
缺点:无法处理更高级的请求

二、数据链路层负载均衡

  • LVS-DR

在数据链路层修改Mac地址进行负载均衡
负载均衡服务器的IP和它所管理的web服务器集群的虚拟IP一致
负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址
通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问

在这里插入图片描述

优点:不需要负载均衡服务器进行IP地址的转换,数据响应时,不需要经过负载均衡服务器
缺点:负载均衡服务器的网卡带宽要求较高

1.3.2 四层负载和七层负载

所谓四层就是基于IP+端口的负载均衡,主要代表有lvs
七层负载也称内容交换,就是基于URL等应用层信息的负载均衡,主要代表有nginx

在这里插入图片描述

二、LVS概述

  • LVS是Linux Virtual Server,linux虚拟服务器,是一个虚拟的服务器集群系统
  • LVS工作在一台Server上提供Directory(负载均衡器)的功能,本身不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机,)从而实现集群环境中的负载均衡
框架
LB-server负载均衡器
realy-server真实服务器

2.1 LVS工作模式

2.1.1 NAT转发模式

  • NAT Network Address Translation,网络地址转换
    在这里插入图片描述

工作原理

① 客户端将请求发往前端的负载均衡服务器,请求报文源地址是CIP(客户端),后面统称为CIP,目标地址为VIP(负载均衡前端地址,后面统称为VIP)
② 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去
③ 报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS
④ 然后LVS将报文源地址改为本机并发送给客户端
注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端

优缺点

优点:节约IP地址,网络隔离更安全
缺点:LVS很可能成为系统性能瓶颈,所有的请求都需要应答

2.1.2 DR直连路由模式

在这里插入图片描述

工作原理

① 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP
② 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS
③ RS发现请求报文中的目的MAC是自己,就会将次报文接受下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端

特点

1、集群节点和director必须在一个物理网络内
2、RIP可以使用公网地址或私有地址
3、director仅处理入站请求,director服务器压力较小
4、集群节点网关不指向director,故出站不经过director
5、不支持端口映射
6、大多数操作系统可以作为真实服务器,要支持隔离arp广播

ARP问题

通常,DR模式需要在Real-Server上配置VIP,配置方法为:
/sbin/ifconfig lo:0 inet VIP netmask 255.255.255.255
1)原因在于,当LVS把客户端的包转发给真实服务器时,因为包的目的IP地址是VIP,那么如果真实服务器收到这个包后,发现包的目的IP不是自己的系统IP,那么就会认为这个包不是发给自己的,就会丢弃这个包,所有需要将这个IP地址绑到卡上,当发送应答包给客户端时,真是服务器就会把包的源和目的地址调换,直接回复客户端
2)关于ARP广播 上面绑定VIP的掩码为“255.255.255.255”,说明广播地址是其本身,那么他就不会将ARP发送到实际的自己该属于的广播域了,这样防止与LVS上VIP冲突,而导致IP冲突
另外在Linux的真是服务器上,需要设置ARP的sysctl选项

2.1.3 TUN-IP隧道模式

在这里插入图片描述工作原理

① 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP
② 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS
③ RS 收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己的lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端

2.1.4 FULL-NAT

在这里插入图片描述

Full解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可以做到多个LVS对应多个RS,解决水平扩容的问题

2.1.5 模式对比

在这里插入图片描述

三、LVS-NAT部署

在这里插入图片描述

3.1 实验环境

基于原有的网卡添加VMnet0和VMnet2
在这里插入图片描述

这里因为我的真实地址是192.168.1网段所以桥接的是192网段
在这里插入图片描述

使用四台主机CentOS Linux release 7.5.1804 (Core)
Client:VMnet0 192.168.1.29/24
LVS:   VMnet0 192.168.1.31/24
       VMnet2 192.168.200.10
Web1:  VMnet2 192.168.200.20
Web2:  VMnet2 192.168.200.30

3.2 实验步骤

3.2.1 web1配置网站和路由

#httpd刚才已安装
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web1 ~]# echo web1 > /var/www/html/index.html               #输入网页内容用于测试
[root@web1 ~]# route add -net 192.168.1.0/24 gw 192.168.200.10    #为客户端添加一条静态路由

3.2.2 web2配置网站和路由

#httpd刚才已安装
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd
[root@web2 ~]# echo web2 > /var/www/html/index.html 
[root@web2 ~]# route add -net 192.168.1.0/24 gw 192.168.200.10

3.2.3 LVS-NAT配置路由功能和负载策略

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward             #启动路由转发功能参数
[root@lvs ~]# yum -y install ipvsadm                             #安装LVS
[root@lvs ~]# ipvsadm -A -t 192.168.1.31:80 -s rr                #-A:对外提供的地址 -t:tcp -s:策略 rr:轮巡
[root@lvs ~]# ipvsadm -a -t 192.168.1.31:80 -r 192.168.200.20:80 -m #-a:对内真实服务器 -r:真实 -m:地址伪装
[root@lvs ~]# ipvsadm -a -t 192.168.1.31:80 -r 192.168.200.30:80 -m

3.3 客户端测试

[root@client ~]# elinks --dump http://192.168.1.31

实现负载均衡,实验完成
在这里插入图片描述

总结一下:本实验主要是解决环境问题,安装完Apache需要关机切换网卡,但是我之前直接点强制关机导致Apache无法启动,后来使用了shutdown -h now 才能够正常启动,不排除是BUG,最后是对于路由下一跳的理解问题,可能长期没有配置过路由的关系,致使理解错误,实验失败,后来经过调整,实验成功!

四、LVS-DR部署

  • Direct routing,直连路由

4.1 实验环境

DR模型要求每一台服务器需要配置一个公网IP地址

虚拟IP的设计,遵循本网段未使用的IP即可

#处于同一网段
Client:192.168.100.9/24
LVS-DR:192.168.100.10/24  虚拟IP地址:192.168.100.123
Web1: 192.168.100.11/24   虚拟IP地址:192.168.100.123
Web2:192.168.100.12/24   虚拟IP地址:192.168.100.123

4.2 实验步骤

4.2.1 LVS服务器

#如没有ifconfig命令需安装
[root@lvs-dr ~]# yum -y install net-tools

4.2.2 LVS准备VIP和路由

[root@lvs-dr ~]# ifconfig ens32:0 192.168.100.123 broadcast 192.168.100.255 netmask 255.255.255.0 up 
#启动子接口  广播地址为192.168.100.255 子网掩码为255.255.255.0 up:启动

在这里插入图片描述

[root@lvs-dr ~]# route add -host 192.168.100.123 dev ens32:0 #添加主机路由,不允许使用真实设备,需使用dev设备ens32接口通信

4.2.3 设置路由转发

[root@lvs-dr ~]# vim /etc/sysctl.conf 
...
net.ipv4.ip_forward = 1                     #开启路由转发功能
net.ipv4.conf.all.send_redirects = 0        #禁止转发重定向报文
net.ipv4.conf.ens32.send_redirects = 0      #禁止ens32转发重定向报文
net.ipv4.conf.default.send_redirects = 0    #禁止转发默认重定向报文

4.2.4 LVS设置负载均衡条目/规则

ipvsadm -C 清除所有LVS规则

[root@lvs-dr ~]# yum -y install ipvsadm
[root@lvs-dr ~]# ipvsadm -A -t 192.168.100.123:80 -s rr #添加VIP规则
[root@lvs-dr ~]# ipvsadm -a -t 192.168.100.123:80 -r 192.168.100.11:80 -g #-g:dr模式 直连路由网关模式
[root@lvs-dr ~]# ipvsadm -a -t 192.168.100.123:80 -r 192.168.100.12:80 -g
参数说明
-A添加Virtual Server
-t指定使用tcp协议
-s指定调度策略/负载算法为rr
-a添加真实服务器
-r指定真实服务器是谁
-gLVS类型DR

4.2.5 LVS让配置永久生效

[root@lvs-dr ~]# ipvsadm-save > /etc/sysconfig/ipvsadm  #-save:保存
[root@lvs-dr ~]# systemctl enable ipvsadm               #开机自启

4.2.6 Web集群

一、两个Web服务器部署Web服务

DR并不会像NAT灵活,有时候因为缓存的问题只显示一台机器

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo web > /var/www/html/index.html      #修改主页内容
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd

[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo web > /var/www/html/index.html
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd

4.2.7 两个Web服务器的lo网卡设置子网掩码为32位VIP

[root@web1 ~]# ifconfig lo:0 192.168.100.123/32
[root@web2 ~]# ifconfig lo:0 192.168.100.123/32

4.2.8 为两个Web服务器设置内核参数

[root@web1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore     #忽略arp响应,不允许接受
[root@web1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce   #可以回答,为了让vip包发出去,只允许发
关于arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
0 -(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的ARP请求,而只对设置的唯一和连接地址做出回应
4-7 -保留未使用
[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

4.2.9 客户端测试

[root@client ~]# elinks --dump http://192.168.100.123

在这里插入图片描述

五、轮询算法

轮询算法说明
Fixed Scheduling Method:静态调服算法
RR 轮询Round-Robin:调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数的系统负载
WRR 加权轮询调度器通过“加权轮叫”调度算法,根据真实服务器的不同处理能力,来调度访问请求,这样可以保证处理能力强的服务器处理更多的访问流量,调度器可以自动问询真实服务器的负载情况,并动态地调整其权值
DH 目标地址hash“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表中找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
SH 目标地址hash“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
Dynamic Scheduling Method:动态调服算法
LC 最少连接调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的连接数最少的服务器上,如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地负载均衡
WLC 加权最少连接在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少连接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载,调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

总结:关于命令

ipvsadm

命令说明
-A添加一个虚拟服务,使用ip地址、端口号、协议来唯一定义一个虚拟服务
-E编辑一个虚拟服务,修改算法
-D删除一个虚拟服务
-C清空虚拟服务列表
-a添加一台真实服务器
-e编辑一台真实服务器
-d减少一台真实服务器
-t使用TCP服务,该参数后需加主机与端口信息
-u使用UDP服务,该参数后需加主机与端口信息
-g直连路由模式
-w指定真实服务器权重

查看统计

[root@lvs-dr ~]# ipvsadm -Lnc        #查看当前ipvs模块中记录的连接(可用于观察转发情况)

可以看到用户请求之后是通过11和12服务器进行处理的 证明192.168.100.10lvs-dr服务器正在进行负载均衡
在这里插入图片描述

[root@lvs-dr ~]# ipvsadm -Ln         #查看当前配置的虚拟服务和各个真实服务器的权重

在这里插入图片描述

[root@lvs-dr ~]# ipvsadm -Ln --stats --rate  #查看ipvs模块的转发情况统计

今天是我的生日,此文作为自己的笔记希望对大家有所帮助,也望自己前程似锦,加油!

Pakho 2021年6月11日 3:13

热门文章

暂无图片
编程学习 ·

那些年让我们目瞪口呆的bug

程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高。 1、麻省理工“只能发500英里的邮件” …
暂无图片
编程学习 ·

redis的下载与安装

下载redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz解压redis tar -zxvf redis-5.0.0.tar.gz编译 make安装 make install快链方便进入redis ln -s redis-5.0.0 redis
暂无图片
编程学习 ·

《大话数据结构》第三章学习笔记--线性表(一)

线性表的定义 线性表:零个或多个数据元素的有限序列。 线性表元素的个数n定义为线性表的长度。n为0时,为空表。 在比较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表的存储结构 顺序存储结构 可以用C语言中的一维数组来…
暂无图片
编程学习 ·

对象的扩展

文章目录对象的扩展属性的简洁表示法属性名表达式方法的name属性属性的可枚举性和遍历可枚举性属性的遍历super关键字对象的扩展运算符解构赋值扩展运算符AggregateError错误对象对象的扩展 属性的简洁表示法 const foo bar; const baz {foo}; baz // {foo: "bar"…
暂无图片
编程学习 ·

让程序员最头疼的5种编程语言

世界上的编程语言,按照其应用领域,可以粗略地分成三类。 有的语言是多面手,在很多不同的领域都能派上用场。大家学过的编程语言很多都属于这一类,比如说 C,Java, Python。 有的语言专注于某一特定的领域&…
暂无图片
编程学习 ·

写论文注意事项

参考链接 给研究生修改了一篇论文后,该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情,很多情况下,他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言,首先要用一小句话引…
暂无图片
编程学习 ·

安卓 串口开发

上图: 上码: 在APP grable添加 // 串口 需要配合在项目build.gradle中的repositories添加 maven {url "https://jitpack.io" }implementation com.github.licheedev.Android-SerialPort-API:serialport:1.0.1implementation com.jakewhart…
暂无图片
编程学习 ·

2021-2027年中国铪市场调研与发展趋势分析报告

2021-2027年中国铪市场调研与发展趋势分析报告 本报告研究中国市场铪的生产、消费及进出口情况,重点关注在中国市场扮演重要角色的全球及本土铪生产商,呈现这些厂商在中国市场的铪销量、收入、价格、毛利率、市场份额等关键指标。此外,针对…
暂无图片
编程学习 ·

Aggressive cows题目翻译

描述&#xff1a; Farmer John has built a new long barn, with N (2 < N < 100,000) stalls.&#xff08;John农民已经新建了一个长畜棚带有N&#xff08;2<N<100000&#xff09;个牛棚&#xff09; The stalls are located along a straight line at positions…
暂无图片
编程学习 ·

剖析组建PMO的6个大坑︱PMO深度实践

随着事业环境因素的不断纷繁演进&#xff0c;项目时代正在悄悄来临。设立项目经理转岗、要求PMP等项目管理证书已是基操&#xff0c;越来越多的组织开始组建PMO团队&#xff0c;大有曾经公司纷纷建造中台的气质&#xff08;当然两者的本质并不相同&#xff0c;只是说明这个趋势…
暂无图片
编程学习 ·

Flowable入门系列文章118 - 进程实例 07

1、获取流程实例的变量 GET运行时/进程实例/ {processInstanceId} /变量/ {变量名} 表1.获取流程实例的变量 - URL参数 参数需要值描述processInstanceId是串将流程实例的id添加到变量中。变量名是串要获取的变量的名称。 表2.获取流程实例的变量 - 响应代码 响应码描述200指…
暂无图片
编程学习 ·

微信每天自动给女[男]朋友发早安和土味情话

微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…
暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

项目经理,你有什么优势吗?

大侠被一个问题问住了&#xff1a;你和别人比&#xff0c;你的优势是什么呢? 大侠听到这个问题后&#xff0c;脱口而出道&#xff1a;“项目管理能力和经验啊。” 听者抬头看了一下大侠&#xff0c;显然听者对大侠的这个回答不是很满意&#xff0c;但也没有继续追问。 大侠回家…
暂无图片
编程学习 ·

nginx的负载均衡和故障转移

#注&#xff1a;proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one&#xff0c;内存缓存空间大小为200MB&#xff0c;1天没有被访问的内容自动清除&#xff0c;硬盘缓存空间大小为30GB。 pro…
暂无图片
编程学习 ·

业务逻辑漏洞

身份认证安全 绕过身份认证的几种方法 暴力破解 测试方法∶在没有验证码限制或者一次验证码可以多次使用的地方&#xff0c;可以分为以下几种情况︰ (1)爆破用户名。当输入的用户名不存在时&#xff0c;会显示请输入正确用户名&#xff0c;或者用户名不存在 (2)已知用户名。…