一、LVS
1.1简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩主导开发的开源负载均衡项目,目前,LVS已经被集成到Linux内核模块中。该项目实现了在基于IP的数据基础上,请求负载均衡调度方案,LVS支持多种调度算法,如轮询、最少连接、源地址哈希等,用于决定请求的转发方式。
1.2 LVS的集群体系结构及概念
1.2.1 集群结构
1.2.2 LVS的概念
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的
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相关信息
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 实验环境
主机 | ip | vip | 扮演的角色 |
lvs | 192.168.0.100(仅主机) | 172.25.254.100 | 调度器 |
web1 | 192.168.0.10(仅主机) | null | 真实服务器(RS) |
web2 | 192.168.0.20(仅主机) | null | 真实服务器(RS) |
主机 | ip | vip | 扮演的角色 |
client | 172.25.254.200(nat) | null | 测试机(VS) |
router | nat:172.25.254.100 仅主机:192.168.0.100 | null | 路由器 |
LVS | 192.168.0.50(仅主机) | 192.168.0.200/32 | 调度器 |
web1 | 192.168.0.10(仅主机) | 192.168.0.200/32 | 真实服务机(RS) |
web2 | 192.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调度服务学习过程的一些总结及理解。