LVS负载均衡+集群+三种工作模式+调度算法及实战案例

一、LVS

1.1简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩主导开发的开源负载均衡项目,目前,LVS已经被集成到Linux内核模块中。该项目实现了在基于IP的数据基础上,请求负载均衡调度方案,LVS支持多种调度算法,如轮询、最少连接、源地址哈希等,用于决定请求的转发方式。

1.2 LVS的集群体系结构及概念

1.2.1 集群结构

1.2.2 LVS的概念
VS Virtual Server
RS Real Server
CIP Client IP
VIP: Virtual serve IP VS 外网的 IP
DIP: Director IP VS 内网的 IP
RIP: Real server IP

1.3 LVS的集群类型

类型内容
lvs-nat
修改请求报文的目标 IP, 多目标 IP DNAT
lvs-dr(直接路由)
操纵封装新的 MAC 地址
lvs-tun(了解)
在原请求 IP 报文之外新加一个 IP 首部
lvs-fullna(了解)
修改请求报文的源和目标 IP

1.3.1 nat模式

①客户机(client)向LVS发送访问请求,请求数据包中包含CIP(来源),VIP(访问目标地址),端口号

②lvs服务器接收到访问请求并且将请求数据包中的目的地由VIP换成web的RIP和相应端口

③web响应请求,发送响应数据包,包中含有响应报文RIP、响应目标CIP、响应端口

④LVS接收到响应数据包,改变数据包中的数据来源(即LVS的VIP),响应目标端口

⑤LVS将修改后的数据包发送给客户机(client)

注意:在实验过程中,为了保证实验正常进行,要将所有的防火墙全部关闭。
1.3.2 dr模式

与nat不同,dr在接收到访问请求后不需要回传给LVS调度器,直接把响应数据发送給客户端client,所以web和LVS都要有VIP

①client发送访问请求给LVS调度器,内容为client的IP+MAC+VIP+VIP的MAC

②LVS调度器接收到数据包后,将VIP的MAC修改为web的MAC,此时数据包种有clientIP+clientMAC+VIP+web的MAC

③web得到②中的数据包并且作出响应数据包,内容有VIP+web的MAC+client IP+clientIP

MAC

1.4 LVS的调度算法

1.4.1 LVS的调度算法的类型
类型
静态方法仅仅根据算法本身进行调度,不考虑RS的负载情况
动态方法主要根据RS当前的负载状态及其调度算法调度较小的RS

1.4.2 静态算法
RR
roundrobin 轮询 RS 分别被调度
WRR
Weighted RR ,加权轮询根据 RS 的配置进行加权调度,性能差的 RS 被调度的次数少
SH
将来自于同一个 IP 地址的请求始终发往第一次挑中的RS ,从而实现会话绑定
DH
第一次轮询调度至 RS ,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡

1.4.3 动态算法
LC
least connections (最少链接发) 适用于长连接应用Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非活 动链接数)
WLC
Weighted LC (权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED
初始连接高权重优先 Overhead=(activeconns+1+inactiveconns) x 256/weight  但是,当node1 的权重为 1 node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接
NQ
Never Queue ,第一轮均匀分配,后续 SED
LBLC
动态的 DH 算法,使用场景:根据负载状态实现正向代理
LBLCR
带复制功能的 LBLC ,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的RS

1.5 LVs部署命令介绍

1.5.1 LVS相关信息
程序包: ipvsadm
Unit File: ipvsadm.service
主程序: /usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
配置文件: /etc/sysconfig/ipvsadm-config
ipvs 调度规则文件: /etc/sysconfig/ipvsadm
1.5.2  lvs集群的增删改
1.5.2.1 常用参数总结
命令解释
-A/-E/-D添加/修改/删除虚拟服务
-C/-R清除/恢复所有虚拟规则
-t/-u

使用tcp/udp服务

-a/-e/-d添加/修改/删除真实服务
-L显示内核中的所有虚拟服务
-n以数字形式显示端口号
-c显示ipvs的连接情况
-w配置真实服务的权重
-s

配置负载均衡算法 rr/wrr/lc

-timeout显示配置的tcp/udp超时时间
-rate显示输出速率信息
-f/-r查看火墙/真实服务地址
-m/-g/-i真实服务使用nat/DR/ipipi模式

1.5.2.2 示例

添加一个虚拟服务 192.168.0.200:80    使用轮询

ipvsadm -A -t 192.168.0.200:80 -s rr

修改上述算法为加权轮询

ipvsadm -E -t 192.168.0.200:80 -s wrr

删除服务

ipvsadm -D -t 192.168.0.200:80 -s wrr

添加一个真实服务 172.25.254.100:80    使用nat模式    权重为2

ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2

修改权重为3  模式为DR

ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -g -w 3

删除服务

ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2

不再一一展示。

二、 负载均衡

2.1 什么是负载均衡

负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理。

2.2 为什么要使用负载均衡

1、动态水平拓展web服务器

2、增加业务并发访问及处理能力(可以解决单服务瓶颈问题)

3、节约公网IP

4、配置简单,功能丰富,性能较强

2.3负载均衡的类型

2.3.1 四层结构(常使用TCP)

2.3.2 七层结构(常使用HTTP)

三、集群和分布式简介

3.1 集群

Cluster:是为了解决某个特定问题将计算机组合起来的单个系统

常见的三种内型:

类型
LB(负载均衡)由多个主机组成,每个主机只承担一部分访问
HA(高可用)A=MTBF/(MTBF+MTTR) 
HPC了解

3.2 分布式

一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。
分布式的每一个节点都在完成不同的业务,一个节点跨了,业务就可能会失败。
分布式常见应用作用
分布式应用按照功能拆分,使用微服务
分布式静态资源静态资源放在不同的存储集群上
分布式数据及储存使用key-value缓存系统
分布式计算

四、实战

4.1 实验环境

nat模式下的集群案例
主机ipvip扮演的角色
lvs192.168.0.100(仅主机)172.25.254.100调度器
web1192.168.0.10(仅主机)null真实服务器(RS)
web2192.168.0.20(仅主机)null真实服务器(RS)

DR模式下的集群案例
主机ipvip扮演的角色
client172.25.254.200(nat)null测试机(VS)
router

nat:172.25.254.100

仅主机:192.168.0.100

null路由器
LVS192.168.0.50(仅主机)192.168.0.200/32调度器
web1192.168.0.10(仅主机)192.168.0.200/32真实服务机(RS)
web2192.168.9.20(仅主机)192.168.0.200/32真实服务机(RS)

4.2 配置实验环境

1、在LVS中启动内核路由功能

查看是否启动,0否1是,我这里没有打开,我们写入一条命令到配置文件 /etc/sysctl.conf 中,将ipv4.ip_forward 打开

安装ipvsadm软件并启动

# 安装
dnf install ipvsadm -y

# 启动
systemctl enable --now ipvsadm

2、在web1、web2下载httpd并启动

yum install httpd -y
# 下载

systemctl enable --now httpd
# 启动

3、在/var/www/html/ 目录下创建一个名为 index.html 的文件,‌并将字符串 "webserver1 - 192.168.0.10" 作为该文件的内容写入。这样当用户访问该服务器时,‌将会看到这个字符串作为欢迎信息或测试信息

/var/www/html是Web服务器上存放网页文件的默认目录,‌index.html 是该目录下的一个重要文件,‌通常是服务器的默认主页。‌

# 在web1中写入:
echo web1 - 192.168.0.10 > /var/www/html/index.html

# 在web2中写入:
echo web2 - 192.168.0.20 > /var/www/html/index.html

4、先测试一下,到这里表示我们前面没有出问题

我在启动的时候失败了,出现下面的报错信息:

# 8月 09 19:46:59 LVS bash[33142]: /bin/bash:行1: /etc/sysconfig/ipvsadm: 没有那个文件或目录

解决方法很简单,我也放在下面了:

[root@LVS ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@LVS ~]# systemctl restart ipvsadm   # 重新启动ipvsadm

我们再次查看ipvsadm的状态,就ok了

5、上述是在nat模式下的集群案例,策略及规则制定参考1.5.2.2,此处展示我的测试结果图(我直接在lvs机子上测试的,效果一样)

6、在nat的基础上,我们要完成DR模式下的集群案例实验,只需要增加 router 和 client 两个主机,修改web1和web2的配置文件,修改LVS的IP即可。具体步骤展示在下图:

client主机环境配置:

router主机环境配置:

LVS调度器环境配置:

web1环境配置:

web2环境配置:

4.3 VIP的响应问题

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore
0:默认值,可使用本地任意接口上配置的任意地址进行响应
1:只有当请求的目标IP配置在本地主机接收到请求报文的接口上时,才会响应

限制通告级别:arp_announce
0:默认值,本机所有接口 所有信息 向所有接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告

4.4 具体配置

要点:

1、每个web都要配VIP并且可以出外网

2、DR服务器要采用双IP桥接网路,VPP/DIP

配置内容如下:

在 LVS、web1、web2  中设置vip

LVS:
[root@LVS ~]# ip a a dev lo 192.168.0.100/32

web1:
[root@web1 ~]# ip a a dev lo 192.168.0.100/32

web2:
[root@web2 ~]# ip a a dev lo 192.168.0.100/32

在web1和web2中解决响应问题

[root@web1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce



[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

在LVS中配置策略

[root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.200:80 wrr
  -> 192.168.0.10:80              Route   1      0          0
  -> 192.168.0.20:80              Route   2      0          0

在主机client中测试,根据我们所制定的策略可以发现以下轮询正确

[root@client ~]# for N in {1..10};do curl 192.168.0.200;done
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20

4.5 问题的解决

问题一:轮询过程遇到的问题

在web1、2下载并安装mod_ssl并且重启httpd

yum install mod_ssl -y
systemctl restart httpd

添加443端口的策略,如图


[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.200:80 wrr
  -> 192.168.0.10:80              Route   1      0          0
  -> 192.168.0.20:80              Route   2      0          0
TCP  192.168.0.200:443 rr
  -> 192.18.0.10:443              Route   1      0          0
  -> 192.18.0.20:443              Route   1      0          0

测试

[root@client ~]#  curl http://192.168.0.200;curl -k https://192.168.0.200
web1 - 192.168.0.10
web1 - 192.168.0.10

问题二:火墙mask标记解决调度问题

在调度器(LVS)设置端口标签,将80,443当作一个整体

[root@LVS ~]# iptables -t mangle -A  PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK  --set-mark 66

查看规则是否制定成功

[root@LVS ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       6    --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (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


[root@LVS ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@LVS ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g

测试结果


[root@client ~]#  curl 192.168.0.200;curl -k https://192.168.0.200
web2 - 192.168.0.20
web1 - 192.168.0.10
[root@client ~]# curl -k https://192.168.0.200
web2 - 192.168.0.20
[root@client ~]# curl -k https://192.168.0.200
web1 - 192.168.0.10
[root@client ~]# curl -k https://192.168.0.200
web2 - 192.168.0.20
[root@client ~]# curl -k https://192.168.0.200
web1 - 192.168.0.10

以上是我在LVS调度服务学习过程的一些总结及理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值