LVS
本文最后更新于:2023年12月5日 晚上
集群和分布式
集群(cluster):为了解决某个特定问题将多台服务器组合起来形成的单个系统
cluster 分为三种类型:负载均衡(LB)、高可用(HA)、高性能(HPC,例如天河一号)
集群和分布式:
集群是一个业务系统部署在多台服务器上,分布式是拆分业务系统,然后分别部署在不同服务器
分布式是指通过网络连接的多个组件,通过交换信息协作而形成的系统。而集群,是指同一种组件的多个实例,形成的逻辑上的整体
cluster 负载均衡 LB
按实现方式:
- 硬件:F5,非常昂贵,一个 F5 就 18W,配置一套主从高可用就是 36W
- 软件:LVS、Nginx、haproxy
基于工作的协议层划分:
- 传输层:LVS、Nginx、haproxy
- 应用层:针对特定协议,常称为 proxy server
- http:nginx、httpd、haproxy…
- fastcgi:nginx、httpd…
- mysql:mysql-proxy、mycat…
cluster 高可用集群 HA
keepalived
LVS 简介
Linux Virtual Server,官网: http://www.linuxvirtualserver.org/
四层负载均衡,转发效率极高,具有处理百万计并发连接请求的能力。
阿里的四层 SLB ( Server Load Balance )是基于 LVS + keepalived 实现
LVS = IPVS(内核空间) + ipvsadm(用户空间)
- IPVS:集成在内核,工作在 netfilter 框架上,具体来讲就是工作在 INPUT 链上,将发往 INPUT 的流量进行 “处理”
- ipvsadm:管理 ipvs 规则的用户空间软件
负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性
- 应用于高访问量的业务
- 扩展应用程序:随时添加和移除 ECS 实例来扩展应用系统的服务能力
- 消除单点故障
- 同城容灾 (多可用区容灾)
- 跨地域容灾
LVS 集群
LVS 集群体系架构图
术语
- CIP:Client IP
- VS:Virtual Server;Director Server(DS)、Dispatcher(调度器)、Load Balancer
- RS:Real Server;upstream server(nginx)、backend server(haproxy)
- DIP:Director IP,VS 内网 IP
- VIP:Virtual server IP,VS 和 RS 的外网 IP
- RIP:Real server IP,RS 的 IP
访问流程:CIP <–> VIP==DIP <–> RIP
IPVS 工作模式
- nat:修改请求报文的目标 IP
- fullnat:修改请求报文的源和目标 IP,默认不支持
- dr:操纵封装新的 mac 地址
- tun:在原请求 IP 报文之外新加一个 IP 首部
nat
本质是多目标 IP 的 DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和 PORT 实现转发
缺点:请求报文和响应报文都必须经由 VS 转发,VS 容易成为系统瓶颈
fullnat
lvs-nat 模式下,DIP 和 RIP 应该在同一个 IP 网段,RS 的网关要指向 DIP
而 lvs-fullnat 模式下,DIP 和 RIP 通常不在一个网段,只要能通信就行,当然 RS 的网关也不指向 DIP
注意:此类型 kernel 默认不支持
dr (重点)
Direct Routing 直接路由,LVS 默认模式,应用也最广泛,重点掌握。
通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 的 MAC,目标 MAC 是一个挑选出的 RS 的 RIP 的 MAC 地址;源 IP/PORT 以及目标 IP/PORT 均保持不变
lvs-dr 模式的特点:
Director 和各 RS 都配置同一个公网 IP(VIP),通常配置在 lo 上
RS 和 Director 要在同一个物理网络(同一个机房)
请求报文要经由 Director,但响应报文不经由 Director,而由 RS 直接发往 Client
所以为了保证目标为 VIP 的请求发往 VS 而不是 RS,需要在 RS 上修改 arp_ignore 和 rp_announce 参数,从而隐藏 RS
RIP 和 DIP 在同一 IP 网段,RS 网关不能指向 DIP(避免响应报文经过 VS)
不支持端口映射
无需开启 ip_forward
tun
一般来说,TUN 模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在 Cache 服务器本地命中的情况下,Cache 服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
LAN 环境一般多采用 DR 模式,WAN 环境虽然可以用 TUN 模式,但是一般在 WAN 环境下,请求转发更多的被 haproxy、nginx、DNS 等实现。因此,TUN 模式实际应用的很少,跨机房的应用一般专线光纤连接或 DNS 调度
总结和比较
NAT | TUN | DR | |
---|---|---|---|
Real Server | any | Tunneling | Non-arp device |
Real server network | private | LAN/WAN | LAN |
Real server number | low (10~20) | High (100) | High (100) |
Real server gateway | load balancer | own router | own router |
优点 | 端口转换 | WAN | 性能最好 |
缺点 | 性能瓶颈 | 支持隧道 | 不支持跨网段 |
IPVS 负载均衡调度算法
根据其调度时是否考虑各 RS 当前的负载状态,分为两种:静态方法和动态方法
静态算法
仅根据算法本身进行调度
静态算法 | 说明 |
---|---|
RR | roundrobin 轮询,常用 |
WRR | weighted rr 加权轮询,常用 |
SH | 源 IP hash,将来自于同一个 IP 地址的请求始终发往第一次挑中的 RS,从而实现会话绑定 |
DH | 目标 IP hash,第一次轮询调度至 RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的 RS,典型使用场景是正向代理缓存场景中的负载均衡,如:web 缓存 |
动态算法
主要根据每 RS 当前的负载状态及调度算法进行调度 Overhead=value,较小的 RS 将被调度
动态算法 | 说明 |
---|---|
LC | least connections 适用于长连接应用 |
WLC | Weighted LC 默认调度方法,较常用 |
SED | Shortest Expection Delay 初始连接高权重优先,只检查活动连接,而不考虑非活动连接 |
NQ | Never Queue 第一轮均匀分配,后续 SED |
LBLC | Locality-Based LC,动态的 DH 算法,使用场景:根据负载状态实现正向代理,实现 Web Cache 等 |
LBLCR | LBLC with Replication 带复制功能的 LBLC,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的 RS,实现 Web Cache 等 |
FO | 内核 4.15 之后新增 |
OVF | 内核 4.15 之后新增 |
ipvsadm
ipvsadm 的核心功能:管理集群服务 和 集群服务的 RS
管理集群服务
管理集群上的 RS
ipvs 规则
ipvs 连接
保存规则
ipvs 调度规则建议保存至 /etc/sysconfig/ipvsadm.rules
重载
防火墙标记
FWM:FireWall Mark
借助防火墙标记来分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度
实现方法:
范例:
持久标记
session 绑定:对共享同一组 RS 的多个集群服务,需要统一进行绑定,IPVS 调度算法无法实现
持久连接模板:无论使用任何调度算法,在一段时间内(默认 360s),能够实现将来自同一地址的请求始终发往同一个 RS
实现方法:ipvsadm 指定 -p 选项即可
LVS 实战案例
重点掌握 LVS-DR 模式即可,其他模式如果用到再复习
LVS-DR 模式单网段案例
DR 模式中各主机上均需配置 VIP,解决地址冲突的方式有三种,最常用的是修改 RS 的内核参数:
arp_ignore:用于处理接收到的 arp 请求,
设置为 1:请求的目的 IP 地址为接收网卡上的 IP,才响应。
举例来讲:服务器上配置两个网卡 A 和 B,A 接收到 arp 请求,只要请求的目的 IP 不是 A 的 IP 就不响应。
arp_announce:用于处理发送的 arp 请求
- 设置为 2:请求的源 IP 为发送网卡的 IP
RS 要可以出网,所以配置了网关
VIP 是 10.0.0.100,给 VS 和 RS 的 lo 网卡都配置上
LVS-DR 模式多网段案例
前面的单网段案例中,lo 和 eth0 在同一个网段,如果把 lo 和 eth0 的 ip 设置在不同的网段就是多网段,这种情况是物理上单网段,逻辑上多网段
实现过程略。。。
LVS 高可用实现
DS 不可用时
- keepalived
- heartbeat/corosync
RS 不可用时
某 RS 不可用时,Director 依然会调度请求至此 RS
解决方案: 由 Director 对各 RS 健康状态进行检查,失败时禁用,成功时启用
常用解决方案:
- keepalived
- heartbeat/corosync
- ldirectord
检测方式:
- 网络层检测:icmp
- 传输层检测:端口探测
- 应用层检测:请求某关键资源
ldirectord
…