LVS的原理
LVS是Linux virtual server的缩写,为linux虚拟服务器,是一个虚拟的服务器集群系统。LVS简单工作原理为用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接收到请求,返回给用户。对于用户来说,看不到Web后端具体的应用。
一:LVS 的集群结构和特点
1.1 LVS结构
LVS(Linux Virtual Server)是一种开源的负载均衡解决方案,它的三层结构主要包括前端、中间层和后端。
-
前端(Load Balancer):通常部署在服务器集群的外部,负责接收客户端的请求。前端可以是一个IP地址和端口的组合,它将接收到的所有请求分发给后端的服务器群组。
-
中间件(Pool Manager):也称为调度器或代理,它隐藏了后端的实际服务器信息,并根据某种策略(如轮询、最少连接数等)动态地选择并分配请求给其中的一个或一组服务器。这是LVS的核心组件,实现了负载均衡功能。
-
后端(Server Group):由一组实际处理服务的服务器组成。它们可能是物理机,也可以是虚拟机,或者是通过网络连接的远程服务器。后端服务器不需要直接暴露给客户端,它们只与中间件交互。
1.2 LVS的术语
DS:Director Server。指的是前端负载均衡器节点
RS:Real Server。后端真实的工作服务器
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址
DIP:Director Server IP,主要用于和内部主机通讯的IP地址
RIP:Real Server IP,后端服务器的IP地址
CIP:Client IP,访问客户端的IP地址
1.3 LVS的集群与分布
1.3.1 系统性能扩展方式
Scale UP:向上扩展,增强
Scale Out:向外扩展,增加设备,调度分配问题,Cluster
1.3.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(高性能计算,国家战略资源,不在课程范围内)
1.3.3 分布式
分布式存储:Ceph,GlusterFs,FastDFS,MogileFs
分布式计算:hadoop,Spark
分布式常见应用
分布式应用-服务按照功能拆分,使用微服务
分布式静态资源--静态资源放在不同的存储集群上
分布式数据和存储--使用key-value缓存系统
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.4 十种LVS的调度算法
- 轮叫调度 rr
均等地对待每一台服务器,不管服务器上的实际连接数和系统负载
- 加权轮叫 wrr
调度器可以自动问询真实服务器的负载情况,并动态调整权值
- 最少链接 lc
动态地将网络请求调度到已建立的连接数最少的服务器上
如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
- 加权最少链接 wlc
调度器可以自动问询真实服务器的负载情况,并动态调整权值
带权重的谁不干活就给谁分配,机器配置好的权重高
- 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
- 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
- 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
- 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
- 最少期望延迟 sed
不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
- 永不排队 nq
无需队列,如果有realserver的连接数为0就直接分配过去
二 LVS-NAT结构
2.1 lvs-nat原理图
2.2 lvs-nat原理
用户请求LVS到达director,director将请求的报文的目的IP改为RIP,同时将报文的目标端口也改为realserver的相应端口,最后将报文发送到realserver上,realserver将数据返回给director,director再把数据发送给用户
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口 3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
2.3 lvs-nat特性
- NAT模式修改的是目的ip,直接走的是switch不需要修改mac地址,所以VIP和RIP不需要在同一个网段内
- NAT的包的进出都需要经过LVS,所以LVS可能会成为一个系统的瓶颈问题
三:LVS-TUN模式
3.1 lvs-tun原理图
3.2 lvs-tun原理
用户请求LVS到达director,director通过IP-TUN加密技术将请求报文的包封装到一个新的IP包里面,目的IP为VIP(不变),然后director将报文发送到realserver,realserver基于IP-TUN解密,然后解析出来包的目的为VIP,检测网卡是否绑定了VIP,绑定了就处理这个包,如果在同一个网段,将请求直接返回给用户,否则通过网关返回给用户;如果没有绑定VIP就直接丢掉这个包
3.3 lvs-tun特性
1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
四 LVS-FULLNAT模式
4.1 lvs-fullnat原理图
4.2 lvs-fullnat 特性
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射
五 LVS-DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
5.1 lvs-dr原理图
5.2 dr模式原理
1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
5.3 dr模式特性
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址 在RS上使用arptables工具 在RS上修改内核参数以限制arp通告及应答级别
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修败)
9.RS可使用大多数OS系统
六 四种模式的比较
一:是否需要VIP和realserver在同一网段
DR模式因为只修改包的MAC地址,需要通过ARP广播找到realserver,所以VIP和realserver必须在同一个网段,也就是说DR模式需要先确认这个IP是否只能挂在这个LVS下面;其他模式因为都会修改目的地址为realserver的IP地址,所以不需要在同一个网段内
二:是否需要在realserver上绑定VIP
realserver在收到包之后会判断目的地址是否是自己的IP
DR模式的目的地址没有修改,还是VIP,所以需要在realserver上绑定VIP
IP TUN模式值是对包重新包装了一层,realserver解析后的包的IP仍然是VIP,所以也需要在realserver上绑定VIP
三:四种模式的性能比较
DR模式、IP TUN模式都是在包进入的时候经过LVS,在包返回的时候直接返回给client;所以二者的性能比NAT高
但TUN模式更加复杂,所以性能不如DR
FULLNAT模式不仅更换目的IP还更换了源IP,所以性能比NAT下降10%
性能比较:DR>TUN>NAT>FULLNAT
七 实验部分
7.1 lvs-nat模式原理
7.1.1 实验准备
|--------|-------------------------------|---------------|-----|
| 主机 | IP | VIP | 角色 |
| lvs | 192.168.0.100 | 172.25.254.vs | vs |
| web1 | 192.168.0.10,GW 192.168.0.100 | null | rs |
| web2 | 192.168.0.20,GW 192.168.0.100 | null | rs |
| client | 172.25.254.200 | | 测试机 |
7.1.2 配置命令
开启内核路由功能
在web1和web2开启httpd服务
[root@webserver2 ~]# dnf install httpd
[root@webserver1 ~]# dnf install httpd
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html[root@webserver2 ~]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html
重启httpd服务
[root@webserver1 ~]# systemctl enable --now httpd
在lvs上安装ipvsadm
[root@lvs ~]# dnf install ipsvadm
增加调度策略
测试
修改为权重调用
7.2 lvs-dr模式的实现
7.2.1 实验准备
在nat基础上修改
|--------|------------------------------------------------|----------------|-----|
| 主机名 | IP | VIP | 角色 |
| lvs | 192.168.0.50 | 172.25.254.100 | vs |
| route | NAT-eth0:172.25.254.100,仅主机 eth1:192.168.0.100 | | |
| web1 | 192.168.0.10,GW 192.168.0.100 | null | rs |
| web2 | 192.168.0.10,GW 192.168.0.100 | null | rs |
| client | 172.25.254.200 | | 测试机 |
7.2.2 配置命令
在route设置内核路由
在lvs和web1,web2设定vip
[root@lvs ~]# ip a a dev lo 192.168.0.200/32
[root@webserver1 ~]# ip a a dev lo 192.168.0.200/32
[root@webserver2 ~]# ip a a dev lo 192.168.0.200/32
在web1-2解决响应问题
在lvs上配置策略
测试
7.3 火墙mark标记解决调度问题
7.3.1 实验环境基于DR模式
7.3.2 实验配置
在web1-2上安装mod_ssl并重启httpd
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd
设置端口标签
在lvs设置调度策略
测试