一、LVS集群和分布式简介
1.1 lvs简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。
该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。
根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
1.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 lP |
访问流程 | CIP <--> VIP == DIP <--> RIP |
1.3 实验环境
主机名 | 角色定位 |
server1 | 调度器(VS) |
server2 | 真实服务器(RS) |
server3 | 真实服务器(RS) |
server4 | 测试机 |
二、集群和分布式简介
2.1、系统性能扩展方式
- Scale UP:向上扩展,增强
- Scale Out:向外扩展,增加设备,调度分配问题,Cluster
- lvs集群体系结构
2.2 集群Cluster
Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统
Cluster 常见的三种类型:
LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问
HA : High Availiablity (高可用) SPOF ( single Point Of failure )
MTBF:Mean Time Between Failure 平均无故障时间,正常时间
MTTR:Mean Time To Restoration ( repair )平均恢复前时间,故障时间
A=MTBF/ ( MTBF+MTTR ) (0,1) : 99%, 99.5%, 99.9%, 99.99%, 99.999%
SLA : Service level agreement (服务等级协议)是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9 ,四个 9 来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间
HPC :High-performance computing(高性能计算,国家战略资源)
2.3 分布式简介
分布式存储 :Ceph , GlusterFs , FastDFS , MogileFs
分布式计算 :hadoop , Spark
分布式常见应用:
分布式应用-服务按照功能拆分,使用微服务
分布式静态资源--静态资源放在不同的存储集群上
分布式数据和存储--使用key-value缓存系统
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
2.4 集群和分布式
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
三、LVS工作模式
3.1 NAT模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
RIP和DIP应在同一个IP网络,且应使用私网地址:RS的网关要指向DIP。
请求报文和响应报文都必须经由Direclor转发,Direclor易于成为系统瓶颈。
支持端口映射,可修改请求报文的目标PORTVS必须是Linux系统,RS可以是任意OS系统。
- 客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口9000port)
- VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
- RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port)
- VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
- VS服务器把修改过报文的响应数据包回传给客户端
- Ivs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以Ivs的调度机容易阻塞
实验准备
一台lvs | 两张网卡一个仅主机,一个NAT |
一台测试机 | 可以用自己电脑的cmd |
webserver1 | 仅主机网卡 |
webserver2 | 仅主机网卡 |
虚拟机关闭防火墙和selinux
每台主机必须有可用ip
LVS主机配置
开机,设置IP和主机名
查看命令
route -n
如果没有 router 命令 用下面的命令下载
yum install -y net-tools-2.0-0.62.20160912git.el9.x86_64
LVS中打开内核路由功能
安装ipvsadm
yum install ipvsadm -y
书写策略
[root@LVS ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
查看策略
ipvsadm -Ln
webserver1配置
ip信息——仅主机网卡 192.168.0.10/24使用代码
vim /etc/NetworkManager/system-connections/eth0.nmconnection
下载http服务做测试
yum install httpd -y
开启http服务
systemctl enable --now httpd
在index.html中写入内容以做测试查看
echo webserver1 192.168.0.10 > /var/www/html/index.html
webserver2配置
ip信息——仅主机网卡 192.168.0.20/24
创建虚拟机步骤同webserver1,这里不做重复展示在两台web机里,下载http服务
yum install httpd -y
开启http服务
systemctl enable --now httpd
在index.html中写入内容以做测试查看
echo webserver1 192.168.0.10 > /var/www/html/index.html
echo webserver2 192.168.0.20 > /var/www/html/index.html
测试
这里我直接在lvs主机内进行测试也是可以的
3.2 DR模式
- 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
- RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
DR模式的特点
- Director和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- 在前端网关做静态绑定VIP和Director的MAC地址
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
- RIP的网关不能指向DIP,以确保响应报文不会经由Director
- RS和Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 不支持端口映射(端口不能修败)
- RS可使用大多数OS系统
client | 一张NAT网卡 ip 172.25.254.10 |
router | 一张NAT网卡ip172.25.254.100/24 一张仅主机网卡ip 192.168.0.100/24 |
LVS | 仅主机网卡 192.168.0.50/24 环回地址192.168.0.100/24 |
webserver1 | 仅主机网卡 192.168.0.10/24 环回地址192.168.0.100/24 |
webserver2 | 仅主机网卡192.168.0.20/24 环回地址192.168.0.100/24 |
lvs主机内
router主机内
client主机内
解决vip响应问题
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在备RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
- 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
- 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
- 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
- 1:尽量避免将接信息向非直接连接网络进行通告
- 2:必须避免将接口信息向非本网络进行通告
在web1和web2内
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
要保证两台主机的网关直接到路由器的内网接口
在client内测试
3.3 防火墙解决轮询调度的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到webserver1后下次访问443仍然可能会被轮询到webserver1上
实验
在两台服务器上安装mod_ssl模块 让rs支持https
安装完后一定要重启
DR实验的策略
ipvsadm -A -t 192.168.0.200:80 -s rr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
我们再添加一个策略
ipvsadm -A -t 192.168.0.200:443 -s rr
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
访问测试
curl 192.168.0.200;curl -k https://192.168.0.200
返回的结果将会是:
webserver1 192.168.0.10
webserver1 192.168.0.10
或者
webserver2 192.18.0.20
webserver2 192.168.0.20
优化示范
我们可以使用防火墙来解决轮询调度算法中的这一问题
首先我们先清除之前的策略
ipvsadm -C
然后我们给80,443端口打上标签,将他们作为一个整体
被打上标记的会视为同一个 标签名字66
写上策略
访问测试
四、LVS算法
静态算法
- RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
ipvsadm -A -t 192.168.0.200:80 -s rr
- WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
ipvsadm -A -t 192.168.0.200:80 -s wrr
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
ipvsadm -A -t 192.168.0.200:80 -s sh
- DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
ipvsadm -A -t 192.168.0.200:80 s dh
动态算法
- LC:least connections(最少链接发)
- 适用于长连接应用Overhead(负载值)=activeconns(活动链接数)x256+inactiveconns(非活 动链接数)
- WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns )x 256+inactiveconns)/weight
- SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当webserver1的权重为1,webserver2的权重为10,经过运算前几次的调度都会被node2承接
- NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS