企业级调度器 LVS

集群和分布式基础知识

系统性能的扩展方式

当一个系统,或一个服务的请求量达到一定的数量级的时候,运行该服务的服务器的性能和资源上限, 很容易成为其性能瓶颈。除了性能问题之外,如果只部署在单台服务器上,在此服务器当机,不能提供 服务的情况下,则会导致服务不可用

系统性能扩展的两种方式

横向扩展:

又称向外扩展,水平扩展,规模扩展等,常用英文 Scale Out,Scale horizontally 来表示,一般采用新 增节点的方式,增加服务节点的规模来解决性能问题,比如,当一台机器不够用时,可以再增加一台机 器或几台机器来分担流量和业务

纵向扩展:

又称向上扩展,垂直扩展,性能扩展等,常用英文 Scale Up,Scale vertically 来表示,一般采用升级服 务器硬件,增加资源供给,修改服务配置项等方式来解决性能问题,比如,将服务器由32G内存升级成 128G内存,将服务最大并发数由128调整到1024等

集群基础知识

集群 (Cluster):是为了解决某个特定问题将多台计算机组合起来形成的单个系统

集群分类

负载均衡集群 (LB集群):

LB:Load Balancing,是将工作量分配到多台计算机以达到最佳的资源利用率、最大限度地提高吞吐 量、缩短响应时间和避免过载的计算机集群系统,在该系统中,每台计算机只承担一部份访问请求

高可用集群(HA集群):

HA:High Available,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动 节点及备用节点,此方案主要用来解决 SPOF(Single Point Of Failure)问题

HA集群相关术语:

  • MTBF(Mean Time Between Failure):平均无故障时间,正常时间

  • MTTR(Mean Time To Restoration ( repair)):平均恢复前时间,故障时间

  • A (Available):系统可用性,计算公式 A = MTBF/ (MTBF+MTTR),是系统可用时长与特定单位 时长的比值,一般写作 99%,99.5%,99.99%,..... 特定单位时长一般以年或月来计算

  • SLA(service level agreement):服务等级协议,是在一定开销下为保障服务的性能和可用性, 服务提供商与用户间定义的一种双方认可的协定,通常这个开销是驱动提供服务质量的主要因素, 在常规领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,我们就可 以认为服务不达标,而对于运维工程师,最主要的工作目标就是要达到该要求

bash 复制代码
1年 = 365天 = 8760小时
99% = 8760*0.1% = 87.6小时(3.65day)不可用
99.99% = 8760*0.01% = 0.876小时 = 52.6分钟不可用

高性能计算集群(HPC集群):

HPC:High performance computing,是在局域网或互联网中连接多台计算机,通过软件和硬件来实 现资源共享和任务分配,共同完成一个任务的高性能计算系统。用于大规模数据处理、科学计算、数字 媒体处理等领域,可以提供更高的计算效率和更大的数据存储容量

分布式系统基础知识

分布式计算机系统,是指由多台分散的计算机,经互连网络的联接而形成的系统,系统的处理和控制功 能分布在各个计算机上

  • 分布式应用:服务按照功能拆分,使用微服务器构搭建的系统

  • 分布式存储:将数据分散存储到多个存储服务器上,并将这些分散的存储资源构成一个虚拟的存储 设备,包括分布式文件系统、分布式块存储和分布式对象存储外,还包括分布式数据库和分布式缓 存等,常用的分布式存储技术包括 HDFS,Ceph等

  • 分布式计算:一种科学的计算方法,能把需要进行大量计算的工程数据分割成小块,由多台计算机 分别计算,然后再把所有的结果进行合并,得出统一的结论,常用的分布式框架包括 Hadoop, Spark 等

集群和分布式的区别

集群是同一个业务系统部署在多台服务器上,集群中每一台服务器实现的功能没有差别,数据和代码都 是一样的

分布式是一个业务系统被拆分成多个子业务,或者本身就是不同的业务,部署在多台服务器上,在分布式中,每台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式系统中每台服务器完成一 个小功能,所有的功能加起来,才是完整的业务

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率

对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成 同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪 一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来,分布式的每一个节点,都完成不同 的业务,如果一个节点垮了,那这个业务可能就会失败

LB Cluster 负载均衡集群

基于实现方式分类

基于硬件实现的负载均衡:

F5 BIGIP,Citrix Netscaler,A10 等

基于软件实现的负载均衡:

  • LVS:Linux Virtual Server

  • nginx:支持七层调度

  • haproxy:支持七层调度

  • ats:Apache Traffic Server,由yahoo捐助给apache

  • 阿里云ALB(七层负载均衡),阿里云NLB(四层负载均衡),阿里云 CLB(传统型负载均衡)

  • AWS ALB(七层负载均衡),AWS NLB(四层负载均衡),AWS CLB(传统型负载均衡)

基于工作的协议层次分类

工作在传输层(四层)的负载均衡:

传输层负载均衡基于四层通用协议(TCP/UDP)进行调度 LVS,nginx(基于stream划模块),haproxy(基于tcp模式),阿里云 NLB,阿里云 CLB,AWS NLB,AWS CLB

工作在应用层(七层)的负载均衡:

应用层负载均衡通常基于应用层特定协议进行调度,又被称为 proxy server

  • 基于 http 协议的负载均衡:nginx,httpd,haproxy(mode http), ......

  • 基于 fastcgi 协议的负载均衡:nginx,httpd,......

  • 基于 mysql 协议的负载均衡:mysql-proxy,mycat,.....

负载均衡中的会话保持

会话保持是指在 "会话" 持续或 "会话" 完成一个任务或一个事务的时间段内,将同一个客户端的请求都转 发后台同一个服端服务器上,在某些场景下,会话保持又称为粘滞会话(Sticky Sessions)

比如在一个使用了负载均衡的系统中,后端有多台业务服务器,当一个客户端在某台业务服务器上产生 了数据,则该客户端的后续请求都应该被调度到该服务器上,否则后续请求将无法使用之前产生的数 据,会出现会话状态丢失的请况

会话保持可以使用 session 共享,session 复制的机制来实现,也可以使用负载均衡中的特性来实现

实际上,会话保持机制与负载均衡的功能是相互矛盾的。负载均衡希望将来自客户端的连接、请求均衡 的转发至后端多台服务器上,以避免单台服务器负载过高;而会话保持机制却要求将某些请求转发至同 一台服务器进行处理。因此,在实际的部署环境中,我们要根据应用环境的特点,选择适当的会话保持 机制

常用的会话保持实现方式:

  • session sticky:session 粘滞,负载均衡器根据客户端的某些特性值(一般是源IP)进行hash运 算,将同一客户端调度到后端同一台服务器上

  • session replication:session 复制,确保客户端在后端业务服务器上产生的会话信息能同步至其 它后端服务器,每台服务器拥有全部

  • session session server:session 共享,客户端产生的会话信息不单独保存在某台后端服务器上,而是用 专门的 session 服务器保存,后端服务器连接 session 服务器,共享客户端会话信息,session server 一般通过 redis 或 memecached 来实现

  • cookie insert:cookie 插入,客户端首次连接时,负载均衡调度器往该客户端中写入一个cookie 数据,用来标记其连接的是哪台后端服务器,当该客户端再次连接,就可以根据cookie 中记录的信 息进行调度

负载均衡的高可用

在使用负载均衡对流量进行调度的场景中,负载均衡服务负责连接所有客户端请求,并转发至后端服务 器,在此情况下我们需要保证负载均衡服务不能成为单点,可以配合 keepalived 服务实现 负载均衡服 务的高可用

LVS 基础知识

Linux2.4 版内核开始,己经完全内置了 LVS 的各个功能模块,通过LVS提供的负载均衡技术和Linux操作系统可以实现一个高性能,高可用的服务器群集,LVS具有良 好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能

LVS 工作原理

LVS 是根据监听到的前端请求报文中的目标 IP 和目标协议及端口号,将该请求转发到后台某台 RS 服务 器上,由 RS 服务器完成对前端请求的响应,具体的监听规则及调度策略由使用者自行配置

LVS 是内核中的功能,工作在 INPUT 链的位置上,截取发往 INPUT 链的请求与配置好的 LVS 监听及调 度规则进行对比,如果命中,则会触发 LVS 调度,从而转发该请求

相关术语

  • VS:Virtual Server,Director Server(DS),Dispatcher,Load Balancer(LB),负载均衡服 务器,调度器,负责流量转发服务

  • RS:Real Server(lvs),upstream Server(nginx),backend server(haproxy),后端提供业务的服务器

  • CIP:Client IP,客户端IP

  • VIP:Virtual Server IP,虚似IP,负载均衡服务器的外网 IP,一般将域名解析到该IP

  • DIP:Director IP,负载均衡服务器的内网 IP,该IP负责与后端业务服务器进行通讯

  • RIP:Real Server IP,后端业务服务器的 IP

LVS 工作模式

LVS 官方支持三种工作模式,分别是 NAT 模式,DR 模式,TUN 模式,不同的模式有各自不同的特点, 使用者可以根据业务场景选择不同的的工作模式来实现其负载均衡集群

NAT 模式

数据报文中的源和目标

报文顺序 目标
1 client:49.89.179.13:12345 LVS-VIP:219.142.145.239:80
2 client:49.89.179.13:12345 RS-RIP:192.168.10.110:80
3 RS-RIP:192.168.10.110:80 client:49.89.179.13:12345
4 LVS-VIP:219.142.145.239:80 client:49.89.179.13:12345

NAT:Network address translation (网络地址转换)

NAT 模式本质上就是多目标的DNAT, LVS 将请求报文中的目标地址和目标端口修改为后端的 RS 服务器的 RIP 和 PORT 进行转发

NAT 模式特点:

  • RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址;RS 的网关要指向 DIP

  • 请求报文和响应报文都必须经由 LVS 转发,LVS 易成为系统瓶颈

  • 支持端口映射,可修改请求报文的目标 PORT

  • VS 必须是 Linux 系统,RS 可以是任意 OS 系统

  • LVS 主机需要开启 ip_forward 转发

DR 模式

数据报文中的源和目标

报文顺序 目标
1 client:49.89.179.13:12345(client mac) LVS-VIP:219.142.145.239:80(LVS VIP mac)
2 client:49.89.179.13:12345(LVS DIP mac) LVS-VIP:219.142.145.239:80(RS RIP mac)
3 LVS-VIP:219.142.145.239:80(RS RIP mac) client:49.89.179.13:12345(网关 mac)

DR:Direct Routing(直接路由)

DR 模式是 LVS 的默认模式,应用广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC,目标MAC 是某挑选出的 RS 的 RIP 所在接口的 MAC 地址;源 IP/PORT,以及 目标 IP/PORT 均保持不变,但源 MAC 和目标 MAC 会发生改变,DR 模式下,数据链路层之上的内容不 会发生变化

DR 模式特点:

  • LVS 服务器 和 RS 服务器 上都配置有 VIP 地址

  • 确保前端路由器将目标 IP 为 VIP 的请求报文只发往 LVS 服务器;

  • 后端 RS 服务器上的 VIP 只用作封装响应报文,不可响应 ARP 广播,也不可主动对外发送 ARP 广 播,

  • RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP在同一 IP 网络;

  • RIP 的网关不能指向 DIP,以确保响应报文不会经由 LVS 服务器

  • RS 服务器和 LVS 服务器要在同一个物理网络(不能跨路由,因为路由会隔离 ARP 广播)

  • LVS 服务器只处理请求报文,不处理响应报文,相对于 NAT 模式其负载性能会大幅提升,响应由 RS 服务器自行完成

  • 不支持端口映射(端口不能修改,数据链路层之上的内容不会发生变化)

  • 无需开启 ip_forward

  • RS 服务器可以使用大多数 OS 系统(支持相关网络设置即可)

如何确保前端路由器将目标 IP 为 VIP 的请求报文只发往 LVS 服务器?

  • 在前端网关的 ARP 表中做静态绑定,将 VIP 和 LVS 服务器上的 VIP 所在的网卡的 MAC 地址写死

  • 在 RS 服务器上用 arptables 工具设置 arp 防火墙,确保 RS 服务器上的 VIP 不对外发送ARP 广 播,也不会响应 ARP 广播

  • 在 RS 服务器上修改内核参数关闭 ARP 广播和 ARP 应答

bash 复制代码
# arptables 实现

arptables -A IN -d $VIP -j DROP # 丢弃ARP广播数据包
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP # 丢弃对外ARP广播的数据包

#相关内核参数实现
/proc/sys/net/ipv4/conf/all/arp_ignore #忽略ARP广播,不应答
/proc/sys/net/ipv4/conf/all/arp_announce #不主动发送ARP广播

#all 表示所有网卡配置,除了all中的配置,还要单独为每块网卡设置
[root@ubuntu ~]# ls /proc/sys/net/ipv4/conf/
all default ens33 lo
TUN 模式

数据报文中的源和目标:

报文顺序 目标
1 client:49.89.179.13:12345 (client mac) LVS-VIP:219.142.145.239:80 (LVS VIP mac)
2 LVS-DIP:74.176.10.123 (49.89.179.13:12345) (LVS-DIP mac) RS-RIP: 152.68.174.110(219.142.145.239:80) (RS RIP mac)
3 RS-VIP:219.142.145.239:80 (RS - RIP mac) client:49.89.179.13:12345 (网关 MAC)

TUN:IP tunneling(IP隧道)

TUN 模式不修改请求报文的IP首部(源 IP 为 CIP,目标 IP 为 VIP),而是在原 IP 报文之外再封装一个 IP首部(源 IP 为 DIP,目标 IP 为 RIP),再将报文发往后端 RS,RS 直接响应客户端(源 IP 是 VIP,目 标 IP 是 CIP),TUN 模式与 DR 模式的区别是 TUN 模式下 LVS 服务器和后端 RS 可以不在同一个物理 网络,可以跨公网

TUN 模式特点:

  • RIP 和 DIP 可以不处于同一物理网络中,RS 的网关一般不能指向 DIP,且 RIP 可以和公网通信;

  • 集群节点可以跨互联网实现,DIP,VIP,RIP 都可以是公网地址;

  • RS 服务器上的 tun 接口需要配置 VIP 地址,以便接收 LVS 服务器转发的数据包,以及作为响应报 文的源 IP;

  • LVS 服务器转发给 RS 服务器时需要使用隧道,隧道外层的数据报文中的源 IP 是 DIP,目标 IP 是 RIP;

  • RS 服务器响应给客户端的报文中源 IP 是 VIP,目标 IP 是 CIP;

  • LVS 服务器只处理请求报文,不处理响应报文,相对于 NAT 模式其负载性能会大幅提升,响应由 RS 服务器自行完成;

  • 不支持端口映射;

  • 无需开启 ip_forward;

  • RS 服务器的操作系统必须支持隧道功能;

FULL NAT 模式

数据报文中的源和目

报文顺序 目标
1 client:49.89.179.13:12345 LVS-VIP:219.142.145.239:80
2 LVS-DIP:192.168.10.123:12345 RS-RIP:192.168.10.110:80
3 RS-RIP:192.168.10.110:80 LVS-DIP:192.168.10.123:12345
4 LVS-VIP:219.142.145.239:80 client:49.89.179.13:12345

FULL NAT:Full Network address translation (完全网络地址转换)

FULL NAT 模式不是 LVS 官方内置的工作模式,是由阿里巴巴公司开发的第三方模式,仅在 2.6.32 版本 的内核中存在过,目前主流的 LINUX 发行版并不支持该模式,相对于 NAT 模式而言,FULL NAT 在转发 时,将请求报文中的源 IP 地址 源端口和目标 IP 地址目标端口都进行了替换,然后再向后端转发

FULL NAT 模式主要用于公有云环境中,在阿里云上,不建议将虚拟机设为流量穿透服务,虚拟机网关 必须使用其自带的网关,在此情况下,无法修改后端 RS 服务器的网关,则无法使用 NAT 模式,所以需 要使用 FULL NAT 模式来解决此类问题

FULL NAT 模式特点:

  • RIP 和 DIP 不要求在同一网络,但要能通信;RS 网关不必指向 DIP

  • 请求报文和响应报文都必须经由 LVS 转发,LVS 易成为系统瓶颈

  • 支持端口映射,可修改请求报文的目标 PORT

  • VS 必须是 Linux 系统,RS 可以是任意 OS 系统

  • LVS 主机需要开启 ip_forward 转发

LVS 工作模式总结和比较
NAT TUN DR
RS 服务器系统 无任何额外要求 要求支持隧道功能 要求禁用ARP广播和 ARP 应答
RS 服务器网络 私有网络 私有网络/公有网络 私有网络
RS 服务器数量 较少,一般不超过 20台 可以超过100台 可以超过100台
RS 服务器网关 指向LVS 服务器,原路返回 指向自己的路由器,不需要原路返回 指向自己的路由器,不需要原路返回
优点 支持端口转换 支持公网 性能最好
缺点 性能存在瓶颈 要求支持隧道,不支持端口转换 不支持跨网段和端口转换

NAT 与 FULL NAT:

请求报文和响应报文都经由 LVS,NAT 模式下的 RIP 网关要指向 DIP,FULL NAT 模式下无此要求;

DR 与 TUN:

请求报文经由 LVS,响应报文由 RS 自行转发;DR 模式通过修改 MAC 首部实现,通过 MAC 网络转发;TUN 模式能过在原 IP 报文之外封装新的 IP 首部实现转发,支持跨公网通信

LVS 调度算法

调度算法是指 LVS 服务器将前端请求转发给后端 RS 服务器的转发策略

调度算法分为静态算法和动态算法两类,在这些调度算法中,实际使用较多的是 RR,WRR,WLC 等有 限的几种

四种静态调度算法

静态算法仅根据算法本身来进行调度,不关注后端 RS 服务器负载情况

  • RR:Round Robin,轮询算法,LVS 服务器将前端请求轮流转发到后端每一台 RS 服务器上,后端 每台 RS 服务器处理的请求量都是相同的

  • WRR:Weight RR,加权轮询算法,LVS 服务器将前端请求根据后端 RS 服务器的权重进行转发, 对于后端 RS 服务器中性能好的机器可以设置较高的权重,物尽其用

  • SH:Source Hash,源 IP 地址 hash,将来自于同一个 IP 地址的客户端请求调度到后端同一台 RS 服务器上,从而实现会话保持

  • DH:Destinatio Hash,目标 IP 地址 hash, 客户端的请求第一次被调度到某到 RS 服务器后,其 后续的请求都将会被发往同一台 RS 服务器,一般用于正向代理缓存场景

WRR 算法的调度规则:当前 RS 服务器被调度的比例 = 当前 RS 服务器的权重值/总权重值(所有RS服务 器的权重之和)

六种动态调度算法

动态算法要根据当前系统中后端 RS 服务器的负载情况进行调度,给负载较低的后端主机多转发,给负载较高的后端主机少转发

活动连接:Activeconns ,在 LVS 中,有数据传输的连接被称为活动连接

非活动连接:InActiveconns,在 LVS 中,没有数据传输的连接被称为非活动连接

  • LC:Least Connections,最少连接算法,将前端请求调度到己建立的连接数最少的后端 RS 服务 器上,如果集群后端服务器具有相同的配置和相近的系统性能,采用此调度算法可以较好的均衡负 载(Overhead = Activeconns * 256 + InActiveconns,负载值越小,则被调度的优先级越高,256 个非活动连接相当于1个活动连接)

  • WLC:Weighted Least Connections,加权最少连接算法,此算法是 LVS 的默认调度算法,在 LC 算法中,只考虑了 RS 服务器的连接数,而没有考虑 RS 服务器会有不同的配置和性能,此算法优 化了负载均衡性能,具有较高权重值的 RS 服务器将承受较大比例的活动连接负载,(Overhead = (ActiveConns * 256 + InActiveConns)/ Weight,权重值越大,则计算出的负载值越小,相应的,被调度的优先级越高,256个非活动连接相当于1个活动连接)

  • SED:Shortest Expected Delay,最短延迟调度算法,此算法是 WLC 算法的改进版,不再考虑非活动连接(Overhead =(Activeconns + 1)* 256 / Weight,权重值越大,则计算出的负载值越小,相应的,被调度的优先级越高,不考虑非活动连接的原因是为了防止 WLC 算法中 InActiveconns 数过大影响调度的准确性,+1 是为了保证被除数大于0,防止出现计算结果为0的情 况,计算结果为0则意味着每台 RS 被调度的概率是一致的,权重值设置无效

  • NQ:Never Queue,最少队列调度算法/永不排队调度算法,初始的时候先做一次轮循,保证每台 RS 都至少被调度一次,后续使用 SED 调度算法

  • LBLC:Locality-Based Least Connections,基于局部性的最少链接调度算法,本质是动态的 DH 算法,该算法优先使用 DH 算法将请求调度到同一台 RS 服务器上,如果该 RS 服务器负载较高或 不可用,则再使用 LC 算法决定调度到哪一台 RS 服务器上,此 RS 服务器将成为一下次调度时 DH 算法的首选项

  • LBLCR:Locality-Based Least Connections with Replication,带复制的基于局部性的最少链接调 度算法,在 LBLC 算法中,如果 DH 算法选出的 RS 服务器不能被调度,则要使用 LC 算法重新选择 RS 服务器,LBLCR 的算法优势是会将之前被选中的 RS 服务器上的相关缓存数据复制一份到此次被 选中的 RS 服务器上,达到数据复用的目的

高版本内核中新增的调度算法

在 4.15 版本的内核中,新增了 FO 和 OVF 两种调度算法,后续又增加了 MH,TNDR 调度算法

  • FO:Weighted Fail Over,权重过载算法,在此算法中,LVS 会遍历关联的后端 RS 服务器列表, 找到未过载(未设置 IP_VS_DEST_F_OVERLOAD 标志)且权重最高的RS服务器进行调度,属于静 态算法

  • OVF:Overflow-connection,溢出连接算法,该算法基于真实服务器的活动连接数量和权重值实现,将新的请求调度到权重最高的 RS 服务器,直到其活动连接数超过权重值,后续请求将调度到 下一个权重最高的 RS 服务器上,属于动态算法

  • MH:Masquerading Hashing,源 IP 地址 hash,将来自于同一个 IP 地址的请求调度到后端同一 台 RS 服务器上,hash 计算方式与 SH 算法不同

  • TNDR:Two Node Direct Routing,直接路由调度,而不使用 NAT 网络转换

LVS 工具集

软件安装和服务管理
bash 复制代码
#安装软件
[root@ubuntu24 ~]# apt install ipvsadm -y

#相关工具
[root@ubuntu24 ~]# dpkg -L ipvsadm
/.
/etc
/etc/default
/etc/default/ipvsadm		#服务配置文件
/etc/init.d
/etc/init.d/ipvsadm			#服务脚本
/etc/ipvsadm.rules			#转发规则持久化保存的文件
/sbin
diverted by base-files to: /sbin.usr-is-merged
/sbin/ipvsadm				#主程序
/sbin/ipvsadm-restore		#规则重载工具
/sbin/ipvsadm-save			#规则保存程序
/usr
/usr/share
/usr/share/doc
/usr/share/doc/ipvsadm
/usr/share/doc/ipvsadm/README
/usr/share/doc/ipvsadm/SCHEDULERS
/usr/share/doc/ipvsadm/changelog.Debian.gz
/usr/share/doc/ipvsadm/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/ipvsadm
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz

#systemd 服务管理,该服务脚本不是软件中包含的文件
# /run/systemd/generator.late/ipvsadm.service
# Automatically generated by systemd-sysv-generator 由 systemd-sysv-generator 自动生成此文件
ipvsadm 工具

ipvsadm 是转发规则配置工具,主要用来配置接收前端请求的规则(集群),以及为该集群设置往后端 RS 服务器的转发规则,包括调度算法,后端 RS 服务器IP地址,端口,权重等

前置条件:如果是 NAT 模式,LVS 主机上需要开启 ip_forward 转发规则,不同的模式还需要其它内核 参数支持

bash 复制代码
[root@ubuntu24 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@ubuntu24 ~]# echo 'net.ipvsysctl -p
net.ipv4.ip_forward = 1

主要是两条命令,分别是集群管理,以及集群上的RS 管理

bash 复制代码
#命令格式
ipvsadm -A|E virtual-service [-s scheduler] [-p [timeout]] [-M netmask] [--pe 
persistence_engine] [-b sched-flags]
ipvsadm -D virtual-service
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e virtual-service -r server-address [options]
ipvsadm -d virtual-service -r server-address
ipvsadm -L|l [virtual-service] [options]
ipvsadm -Z [virtual-service]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon {master|backup} [daemon-options]
ipvsadm --stop-daemon {master|backup}


#常用选项
virtual-service #虚拟服务器,集群,用来接收前端请求的规则,
scheduler #调度算法,默认wlc
timeout #超时时长,单位秒
netmask #子网掩码
persistence_engine #指定持久化引擎
sched-flags #


#集群管理
-A|--add-service #添加集群监听规则,添加VIP
-E|--edit-service #编辑集群
-D|--delete-service #删除集群,会同时删除该集群中的 RS 配置
-C|--clear #清空所有规则
-R|--restore #重新加载规则,同 ipvsadm-restore 命令
-S|--save #保存规则,同 ipvsadm-save 命令


#RS 管理 - 先指定集群
-a|--add-server virtual-service #在指定集群中添加 RS
-e|--edit-server virtual-service #修改指定集群中的 RS
-d|--delete-server virtual-service #删除指定集群的 RS

-r|--real-server server-address #指定 RS 服务器
-w|--weight weight #指定 RS 服务器权重
-g|--gatewaying #dr 模式,默认值
-i|--ipip #tun 模式
-m|--masquerading #nat 模式
--tun-type type #tun 模式下指定隧道类型 ipip|gue|gre,默认 ipip
--tun-port port #tun 模式下指定目标端口

-L|-l|--list #列出所有规则

#-L 子选项
-n|--numeric #以数字显示主机和端口
-Z|--zero #清空计数器
-c|--connection #查看具体连接数据
--exact #查看扩展信息 
--stats #输出统计信息
--rate #输出速率

--timeout #查看会话超时时长,分别显示 tcp连接超时时长,
 #TCP连接 FIN 状态后超时时长,UPD超时时长
--set tcp tcpfin udp   #设置会话超时时长,同时指定三个值,单位为秒
-h|--help #查看帮助


#virtual-service 监听集群写法,一般是VIP
-t|--tcp-service IP[:port]|service-address[:port]
-u|--udp-service IP[:port]|service-address[:port]
--sctp-service IP[:port]|service-address[:port]
-f|--fwmark-service fwmark


#IP[:port]|service-address[:port]   IP或主机名,可以指定端口,如果不指定端口,则前端请求与后端RS保持一致
#fwmark: firewall mark,可以用防火墙给多个集群打 mark,然后对该 mark 批量设置 RS,值为正整数

#server-address 真实后端RS主机写法
IP[:port]

添加集群,并添加 RS 服务器

bash 复制代码
#添加集群,必须指定端口
#添加集群,监听 10.0.0.157 的 80 端口收到的 tcp 协议请求报文,默认调度算法为 wlc
[root@ubuntu24 ~]# ipvsadm -A -t 10.0.0.157:80

#往集群中添加后端RS服务器
#-a 表示往集群中添加RS
#-t 192.168.10.200:80 表示监听集群
#-r 10.0.0.110 表示后端RS,后端RS 不指定端口,与集群端口保持一致
#-m 表示NAT 模式
[root@ubuntu24 ~]# ipvsadm -a -t 10.0.0.157:80 -r 10.0.0.161 -m
[root@ubuntu24 ~]# ipvsadm -a -t 10.0.0.157:80 -r 10.0.0.153 -m

查看集群

bash 复制代码
#Prot LocalAddress:Port Scheduler Flags 
#协议 集群:端口   调度算法   标志位

# -> RemoteAddress:Port           Forward Weight ActiveConn InActConn  
# -> RS服务器地址:端口   当前工作模式 权重 活动连接数 非活动连接数

#Forward 取值 Masq|Route|Tunnel,分别对应的是NAT|DR|TUN

#查看
[root@ubuntu24 ~]# 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.10.200:80 wlc
  -> 10.0.0.153:80                Masq    1      0          0
  -> 10.0.0.161:80                Masq    1      0          0
  
#不以数字显示
[root@ubuntu24 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:http wlc
  -> 10.0.0.153:http              Masq    1      0          0
  -> 10.0.0.161:http              Masq    1      0          0
  
[root@Rocky-9 ~]# curl 192.168.10.200
RS-1 index.html nginx
[root@Rocky-9 ~]# curl 192.168.10.200
RS-2 index.html Apache HTTP
[root@Rocky-9 ~]# curl 192.168.10.200
RS-1 index.html nginx
[root@Rocky-9 ~]# curl 192.168.10.200
RS-2 index.html Apache HTTP

修改集群

bash 复制代码
#修改集群不能修改地址和端口,只能修改某些属性, 修改调度算法为 RR
[root@ubuntu24 ~]# ipvsadm -E -t 192.168.10.200:80 -s rr
[root@ubuntu24 ~]# 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.10.200:80 rr
  -> 10.0.0.153:80                Masq    1      0          0
  -> 10.0.0.161:80                Masq    1      0          0

注意:LVS 不会检测后端 RS 服务器状态

设置端口转发

bash 复制代码
#设置端口转发,先删除RS,再添加
[root@ubuntu ~]# ipvsadm -d -t 192.168.10.200:80 -r 10.0.0.110
[root@ubuntu ~]# ipvsadm -a -t 192.168.10.200:80 -r 10.0.0.110:88 -m

设置多个集群

bash 复制代码
#添加另一个集群
[root@ubuntu24 ~]# ipvsadm -A -t 192.168.10.200:88
#添加一台服务器权重为2,默认权重为1
[root@ubuntu24 ~]# ipvsadm -a -t 192.168.10.200:88 -r 10.0.0.161 -m -w 2

[root@ubuntu24 ~]# ipvsadm -Ln -t 192.168.10.200:88
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:88 wlc
  -> 10.0.0.161:88

权重为0的RS服务器不会被调度,一般用作平滑升级

删除集群

bash 复制代码
#删除指定集群
[root@ubuntu24 ~]# ipvsadm -D -t 192.168.10.200:88

#清空所有集群
[root@ubuntu24 ~]# ipvsadm -C
持久化保存
bash 复制代码
#当前规则在LVS 服务器重启后会丢失
#可以将规则进行持久化保存
[root@ubuntu ~]# cat /etc/ipvsadm.rules
# emtpy rules file for ipvsadm


#服务保存
[root@ubuntu ~]# service ipvsadm save
 * Saving IPVS configuration...                       [ OK ]
 
#持久化保存到文件
[root@ubuntu ~]# ipvsadm-save -n > /etc/ipvsadm.rules
#清空规则并重载
[root@ubuntu ~]# ipvsadm -C
[root@ubuntu ~]# ipvsadm-restore < /etc/ipvsadm.rules

#自行实现开机加载
[root@ubuntu ~]# cat /etc/rc.local
#!/bin/bash
ipvsadm-restore < /etc/ipvsadm.rules
相关推荐
小何学计算机1 分钟前
Nginx配置基于端口的 Web 服务器
服务器·前端·nginx
菜鸟xy..6 分钟前
windows server 2008 建立ftp服务器
运维·服务器
dzq19818 分钟前
Hexo提交部署命令与Git Bash Here控制终端中按下Ctrl+C无法中断hexo s的解决办法
运维·git·hexo·部署博客·hexo s·ctrl+c·源码推送
团儿.29 分钟前
KVM磁盘配置:构建高效虚拟环境的基石
linux·运维·centos·kvm·kvm磁盘
CloudJourney2 小时前
初始Docker
运维·docker·容器
惊鸿一博2 小时前
linux_电脑一运行程序就死机怎么处理?
linux·运维·电脑
SG.xf2 小时前
Ansible
运维·ansible
看山还是山,看水还是。3 小时前
Nginx 的 Http 模块介绍(中)
android·运维·网络·nginx·http
、十一、3 小时前
Linux中ES的安装
linux·运维·elasticsearch
不甘平凡的蜜蜂3 小时前
第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八
运维·网络·网络协议·tcp/ip·计算机网络·智能路由器