• 【Linux集群教程】01 集群概述 & 负载均衡集群


    1 集群概述

    1.1 何为集群

    • 分布式:同一个任务,由不同步骤(各个服务器实现功能不同)共同完成的过程就叫分布式(例如:生产车间中的某一条流水线,流水线上有很多步骤,不同步骤之间就叫分布式)
    • 负载均衡:将用户的请求,分配到多个功能相同的服务器上。其实就是任务分配(例如:生产车间中的多条相同功能的流水线)
    • 集群:就是一组协同工作,各有分工的服务器组成一个整体,对外表现为一个整体。

    定义: 集群是一组协同工作的服务器,各有分工,对外表现为一个整体。

    集群的意义: 更好的利用现有资源实现服务的高度可用

    集群扩展方式

    • 垂直扩展:更换服务器硬件
    • 水平扩展:添加更多的服务器节点

    集群与分布式的区别

    • 分布式: 多台计算机干一件事,服务是分散部署在不同的机器上,多台服务器合起来跑的才是一套完整代码,这就叫分布式。
    • 集群: 多台计算机干同样的事,多台服务器跑的都是一套完整的代码,这就叫集群

    (1)相同点:分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。

    (2)不同点:分布式是指将业务系统进行拆分,即分布式的每一个节点都是实现不同的功能。而集群每个节点做的是同一件事情。

    单节点服务器运行服务

    优点:

    • 价格便宜
    • 单线路机房的带宽更大
    • 防御更高

    缺点:

    • 时间较长
    • 能力有限
    • 软件工程师在上层无论编写多优秀的代码和软件优化到极限,也无法突破该单台服务器的性能资源,只能无限的接近该台服务器的性能指标

    多节点服务器(集群)运行服务

    缺点:

    • 成本高昂
    • 管理成本增加

    优点:

    • 业务不中断
    • 总体效率高
    • 适合大型业务

    在生产环境中衡量业务的标准:

    • IP即为地址,被理解单个用户
    • PV(Page View)点击率:、访问量,即页面访问量,每打开一次页面PV计数+1,刷新页面也是。IP访问数指独立IP访问数,计算是以一个独立的IP在一个计算时段内访问网站计算为1次IP访问数。通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标;当然,有时还会同时考察另外一个指标,即uv(unique visitor),指访问某个站点或点击某条新闻的不同IP地址的人数。
    • UV 访问数(Unique Visitor)指独立访客访问数,一台电脑终端为一个访客。在同一个局域网中对互联网访问时对外通常是同一个IP,如果该局域网中有10台终端在同一个计算时段内访问同一个网站,对该网站的独立IP访问数贡献为1,而不是10。而此时UV访问数则为 1。在同一天内,uv只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。

    IP和PV关系:

    网站访问量,的衡量标准一个是IP,另一个是PV,常以日为标准,即日独立IP,和PV来计算。

    访问数(IP):即InternetProtocol,指独立IP数。00:00-24:00内相同IP地址只被计算一次。

    综合浏览量(PV):即PageView,即页面浏览量或点击量,用户每次刷新即被计算一次。

    PV高不一定代表来访者多;PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量。比如一个网站就你一个人进来,通过不断的刷新页面,也可以制造出非常高的PV。

    1.2 集群分类

    img

    1. Load Balance Cluster 负载均衡集群 LBC:

    提供和节点个数成正比的负载能力,这种集群适合需要提供大负载访问量的服务,如Web。这类集群中比较著名的有Turbolinux Cluster Server、Linux Virtual Server。此类集群把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。

    负载均衡集群中有一个分发器或者叫调度器,我们将其称之为Director,它处在多台服务器的上面,分发器根据内部所定义的规则或调度方式从下面的服务器群中选择一个以此来响应客户端发送的请求,从而解决高并发的问题。在扩展中可非常容易的使用Scale out扩展,从而实现集群的伸缩性,在业内常见开源解决方案有LVS、Haproxy、Nginx、ATS;

    • 负载均衡集群也是由两台或者两台以上的服务器组成,分为前端负载调度和后端服务两个部分。负载调度部分负载吧客户端的请求按照不同的策略分配给后端服务节点,而后端节点是真正提供营养程序服务的部分。与HA Cluster不同的是,负载均衡集群中,所有的后端节点都处于活动状态,他们都对外提供服务,分摊系统的工作负载。
    • 负载均衡集群可以把一个高负荷的应用分散到多个节点共同完成,适用于业务繁忙、大负荷访问的应用系统。但是它也有不足的地方;当一个节点出现故障时,前端调度系统并不知道此节点已经不能提供服务,仍然会把客户端请求调度到故障节点上来,这样访问就会失败。为了解决这个问题,负载调度系统一般都引入了节点监控系统。
    • 节点监控系统位于前端负载调度机上,负责监控下面的服务节点。当某个节点出现故障后,节点监控系统会自动将故障节点从集群中剔除;当此节点恢复正常后,节点监控系统又会自动将其加入集群中,而这一切,对用户来说是完全透明的。
    1. High Available Cluster 高可用性集群 HAC:

    运行于两个或多个节点上,目的是在系统出现某些故障的情况下,最大限度地减少服务中断时间,保障应用程序持续提供服务的能力。这类集群中比较著名的有keepalived、TurbolinuxTurboHA、Heartbeat、Kimberlite 等。对于此类集群还有很多通俗的名称,如“双机热备”, “双机互备”等。

    高可用集群是服务的可用性比较高,当我们某台服务器死机后不会造成我们的服务不可用。其工作模式则是将一个具有故障的服务转交给一个正常工作的服务器,从而达到服务不会中断。一般来说我们集群中工作在前端(分发器)的服务器都会对我们的后端服务器做一个健康检查,如果发现我们服务器宕机就不会对其在做转发,衡量标准:可用性=在线时间/(在线时间+故障处理时间),就是通常我们说的可用性99%、99.9%、99.99%等等,在业内的硬件的解决方案有 F5 ,在业内常见开源解决方案有Heartbeat、Keepalived、HaProxy等等;

    > 在高可用性集群HA中,会出现脑裂的现象,即在 Master - Slave 中会有心跳检测功能,但有可能因为网络环境不稳定或者其他情况,导致Master - Slave发送心跳包的时长超过了最长有效时间,则会可能Slave会代替Master进行服务,但是原Master一直都在存活并且提供服务,那么集群HA就出现双Master的情况。即脑裂。

    > HA 出现脑裂的情况时,会有电源交换机这种硬件设备,来实时检测,当 Backup 机器接替 Master,而Master 又还正常工作的情况下,电源交换机会将 Master 节点的电源直接关闭。

    • 一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线维护再上线,该过程并不影响整个集群的运行。当应用程序出现故障,或者系统硬件,网络出现故障是,应用可以自动,快速地从一个节点切换到另一个节点,从而保证应用持续、不间断地对外提供服务。
    1. High Performance Computing 高性能集群 HPC:

    利用计算集群软件将多个节点的计算机联结在一起,完成通常只有超级计算机才能完的计算任务。

    HP:高性能的集群是当某一个任务量非常大的时候,我们做一个集群共同来完成这一个任务。这种处理方式我们称为并行处理集群,并行处理集群是将大任务划分为小任务,分别进行处理的机制,常常用于大数据分析,海量资源整合,目前比较出名的就是Hadoop。

    总之,在实际生产环境中我们都可以根据实际情况来挑选合适的集群解决方案,3种集群的侧重各有不同,LB集群着重在于提供服务并发处理能力,HA集群以提升服务在线的能力实现服务不间断,HP集群着重用于处理一个海量任务。

    • HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其他节点计算结果的情况。

    负载均衡集群 – LBC: 分担服务的总体压力

    高可用集群 – HAC: 尽可能的保障服务状态的可用性

    高性能运算集群 – HPC: 提供单台服务器提供不了的计算能力

    1.3 总结

    集群概念:集群是一组协同工作的服务器,各有分工,对外表现为一个整体。

    负载均衡集群 LBC:负担服务的总体压力

    高可用集群 HAC:尽可能的保障服务状态的可用性

    高性能运算集群 HPC:提供单台服务器提供不了的计算能力

    LBC:负载均衡集群,每个子节点的工作任务是一致的,例如:在流水线中的一个生产车间有5个工人在同时做一件事。

    HAC:高可用集群。负载均衡集群一般会与高可用集群结合使用,是 LBC 和 HPC 的组件。

    HPC:高性能运算集群,例如:在运算一个复杂的程序时将运算进行拆分(1+2+3+4+5+6)分配给三台机器处理,例如1+2分给A,3+4分给B、5+6分给C。然后将A,B,C的计算结果进行运算后就得到最终结果了。简单理解:将计算量分摊给集群的各个机器进行计算处理。

    > 负载均衡集群提升的是工作效率,高性能运算集群则是减轻单个任务消耗的时间,用于大型的计算服务(天气,人类DNA库)

    1.4 HA 集群脑裂的原因和预防

    参考文档:https://blog.csdn.net/qq_41582883/article/details/118734994

    1.4.1 什么是脑裂

    在高可用集群中,节点间无法互相检测到对方心跳而各自启动故障转移功能,分裂成独立的节点,节点之间彼此都认为对方出现了故障,从而争抢”共享资源”、争起”应用服务”。进而导致严重后果:

    共享资源被瓜分、两边”服务”都起不来了;

    两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏。

    服务器“脑裂”容易引起服务器集群逻辑关系混乱,导致主、备服务器误认为对方宕机而同时接管对方的业务,同时占用共享的文件系统,造成数据库争抢资源,引起数据库表文件的损坏,从而导致数据库服务的中断,对外业务暂停。

    1.4.2 导致裂脑发生的原因

    (1)高可用服务器之间心跳线路故障,导致无法正常的通信:

    (2)心跳线本身就坏了(包括断了,老化);

    (3) 网卡以及相关驱动坏了,IP配置及冲突问题;

    (4)心跳线间连接的设备故障(交换机的故障或者是网卡的故障);

    (5)仲裁的服务器出现问题;

    (6)防火墙阻挡了心跳消息的传输;

    (7)心跳网卡地址等信息配置的不正确,导致发送心跳失败;

    (8)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件Bug等;

    (9)keepalived配置文件中主备的virtual_router_id不一致也会导致裂脑问题发生;

    1.4.3 如何预防HA集群脑裂

    (1)同时使用串行电缆和以太网电缆连接,添加冗余的心跳线,尽量减少“脑裂”发生机会。

    (2)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。

    (3)设置仲裁机制:例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。通过第三方软件仲裁谁该获得资源。

    (4)fence机制,当检测到裂脑时强行关闭一个心跳节点(需要Stonith、fence)

    (5)仲裁机制+fence机制:Pacemaker+Corosync+合适的资源Agent

    (6)对裂脑的监控报警,报警报在服务器接管之前,给人员处理留足够时间。例如:1分钟内报警,但是服务器此时没有接管,而是5分钟再进行接管;或者报警后不直接自动服务器接管,而是由人为人员控制接管

    2 负载均衡集群

    img

    根据架构图可以知道,暴露的外网环境下的其实是负载均衡器,而负载均衡器也会做一个 HA 高可用的形式。

    负载均衡器会将流量(按特定的算法,比如轮询,加权轮询,最少连接数,最少连接数慢启动时间,源IP哈希等)打到后台真正提供服务的 Web 服务器,Web 服务器的功能和配置是一样的,如果需要访问数据库服务器,那么Web也会将流量打到 后台的数据库服务器集群。

    2.1 负载均衡集群重点分析

    img

    用户通过 Internet 互联网访问负载均衡器,通过负载均衡器来访问企业内网的真实服务器。

    负载调度器:

    • 分类:软件(LVS,HAproxy[ Linux HA项目中的子项目 ],Nginx)/ 硬件(F5[ 性价比不高 ])
    • 工作层级:

    img

    ISO 七层模式以及TCP/IP模型越网上层,越智能,可以识别出比他低层的所有内容。

    • 负载均衡集群可以在数据链路层(称为二层负载均衡)主要是 F5。
    • 传输层(称为四层负载均衡)主要是LVS,HAProxy,F5(可以识别端口,IP,MAC地址)。
    • 应用层(称为七层负载均衡)主要是Nginx,HAProxy,F5(可以识别协议域名,主机名,端口,IP)。

    当每引用一个层级以后,那么其响应速度就会更慢。功能越复杂,消耗的资源就越多,响应速度也就越慢。

    ISO 七层模型介绍:

    1. 物理层:负责实际的比特流传输
    2. 数据链路层:MAC 地址编址
    3. 网络层:IP 地址编制,路由选择
    4. 传输层:端口范围,TCP/UDP

    真实服务器池:

    • Web服务器、数据库服务器、文件服务器、中间件应用服务器、日志服务器、监控服务器、程序版本控制服务器、虚拟机服务器、邮件服务器、打印服务器、域控制服务器、多媒体服务器、通讯服务器、ERP服务器等。使用服务器进行池化搭建。

    2.2 负载均衡集群原理

    2.2.1 四层负载均衡的工作逻辑

    img

    LVS 只做简单数据的更改,比如IP地址的转换。并没有涉及到真实数据的流量转发,以及流量生产。

    LVS 只是把必要的地址进行修改,把目标和源进行更改。就是源地址转换,目的地址转换。

    云厂商的负载均衡器本质上也是间接或者直接使用 LVS。

    LVS 只进行了一次 TCP 连接。数据并没有改变。

    概述:

    1. 四层负载均衡工作在OSI模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体类型,然后经过负载均衡内部的调度算法转发至要处理请求的服务器。四层负载均衡单纯的提供了终端到终端的可靠连接,并将请求转发至后端,连接至始至终都是同一个。LVS就是很典型的四层负载均衡。

    2. 七层负载均衡工作在OSI模型的第七层,应用层,所以七层负载均衡可以基于请求的应用层信息进行负载均衡,例如根据请求的资源类型分配到后端服务器,而不再是根据IP和端口选择。七层负载均衡的功能更丰富更灵活,也能使整个网络更智能。如上图所示,在七层负载均衡两端(面向用户端和服务器端)的连接都是独立的。

    3. 简言之,四层负载均衡就是基于IP+端口实现的。七层负载均衡就是通过应用层资源实现的。

    2.2.2 七层负载均衡的工作逻辑

    img

    Nginx 与客户端做一次TCP连接,Nginx 与 后端的真实服务器做了一次TCP连接。做了两次不同的完整的 TCP 连接。

    Nginx 直接使用域名或者主机名,其命中率会更高。

    分类:访问量

    • LVS 的访问量极高
    • Nginx 的访问量要比 LVS 低得多的多

    使用场景:

    • LVS:C/S,B/S
    • Nginx:B/S

    简单总结:LVS的调度粒度比较粗,模糊查询。Nginx调度粒度细,精确查询。

    2.2.3 为什么四层比七层效率高?

    四层是TCP层,使用IP+端口四元组的方式。只是修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的。只不过在后端机器上看到的都是与代理机的IP的 ESTABLISHED 而已,LVS中没有握手。

    7层代理则必须要先和代理机三次握手后,才能得到7层(HTTP层)的具体内容,然后再转发。意思就是代理机必须要与client和后端的机器都要建立连接。显然性能不行,但胜在于七层,人工可操作性高,能写更多的转发规则。

    2.2.4 HAProxy 与 LVS 的异同

    1)两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,而HAProxy是基于第三应用实现的软负载均衡。

    2)LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术、可提供TCP和HTTP应用的负载均衡综合解决方案。

    3)LVS工作在ISO模型的第四层,因此其状态监测功能单一,而HAProxy在状态监测方面功能强大,可支持端口、URL、脚本等多种状态检测方式。

    4)HAProxy虽然功能强大,但是整体处理性能低于四层模式的LVS负载均衡,而LVS拥有接近硬件设备的网络吞吐和连接负载能力。

    2.3 LVS 工作模式

    2.3.1 LVS 常用术语

    • 负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP】
    • 服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS。
    • 共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务。

    常用术语

    名称定义
    DSDirector Server 指的是前端负载均衡器节点
    RSReal Server。后端真实的工作服务器
    VIPVirtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址
    DIPDirector Server IP,主要用于和内部主机通讯的IP地址
    RIPReal Server IP,后端服务器的IP地址
    RIPReal Server IP,后端服务器的IP地址

    2.3.2 LVS 工作层级

    LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

    • ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。

      • 软硬件驱动,虚拟文件系统管理,内存管理,进程管理,网络协议栈工作在内核空间。内核空间更贴近硬件
    • ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

      • 应用程序,C函数库(Glibc)则是用户空间,用户空间更贴近用户。

    img

    2.3.3 LVS工作模式分类

    https://blog.z0ukun.com/?p=773

    img

    NAT模式:LVS负载均衡器位于服务器和用户及Internet 之间。也就是说LVS负载均衡器需要配置两块网卡,一个是内网IP,一个是公网IP。连接了内网和公网 网络环境。

    TUN模式:服务器、LVS负载均衡器以及用户均是通过 Internet 相连。也就说服务器具有公网的特性,分布在各个地区,可以通过LVS进行组合构建完整集群,使用场景有限。

    DR模式:LVS负载均衡器和服务器处于同一个广播域中,用户以及Internet 通过路由器将请求转发到LVS负载均衡器。该模式是负载量最高的一种方式。企业中最常用的模式。

    2.3.3.1 LVS NAT 模式
    • nat network address translation 是一种外网和内网地址映射的技术
    • 多目标的DNAT转换,它公网修改请求报文的目标IP地址,同时可能会修改目标的端口,挑选出某Real Server的RIP地址实现转发。在LVS负载均衡调度器上请求先发送给 PREROUTING —> INPUT,然后经由监听在INPUT上的LVS程序强制将请求转发给POSTROUTING。
    • NAT 模式下,网络包的进出都要经过LVS处理,LVS需要作为RS的网关。当包达到LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP,RS接收到包以后,仿佛时客户端直接发给他的一样。RS处理完,返回相应时,源IP时RS IP,目标IP时客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给他的。客户端无法感知到后端 RS 的存在。

    注意:

    • RS的RIP和Director的DIP必须在同一IP网络
    • RS和DIP应该使用死亡地址,且RD的网关要指向DIP
    • 真实服务器的网关必须设置为LVS的IP地址

    img

    LVS-NAT模式总结:

    1. 集群节点处于同一个网络环境中
    2. 真实服务器必须将网关指向负载均衡器LB。(所有数据报文必须经过负载均衡器,负载均衡器才能进行DNAT和SNAT的处理)
    3. RIP通常是私有IP,仅仅用于各个集群节点通信
    4. 负载均衡器必须位于RS于DS之间,充当网关
    5. 支持端口映射
    6. 负载均衡器必须是Linux,真实服务器随意
    7. 进出数据报文都要经过负载均衡机器,压力较大。
    • 因为用户跟内网的服务器是互相不可知的状态,客户通过路由器和服务器相连时,客户的请求根本就不知道后端服务器的真实IP,发送的数据包的目的IP地址也就只能够到路由器,无法真正到达后端服务器集群。所以就需要LVS负载均衡做DNAT以及SNAT的地址转换技术。
    2.3.3.2 LVS TUN 模式

    TUN模式是一种IP隧道模式,用户的请求通过LVS到达 Nginx 集群,请求的过程和NAT模式一样的,重要的是响应不同;

    但是有一个硬性的要求:每一个Nginx节点都要配备网卡,会导致Nginx集群都暴露在公网,会有安全问题

    • 客户端将访问VIP包问发送给LVS服务器
    • LVS服务器将请求报文重新封装,发送给后端真实服务器
    • 后端真实服务器将请求包问解封,在确认自身有VIP之后进行请求处理
    • 后端真实服务器在处理完数据i请求后,直接相应客户端

    注意:

    • TUNNEL 必须在左右的RS上绑定VIP
    • RS 直接把包发给Client
    • 隧道模式运维起来比较难,一般不用
    • RIP、DIP、VIP全都是公网地址

    img

    img

    LVS-TUN模式总结:

    1. 集群所有节点都必须直接 / 间接拥有公网地址
    2. 真实服务器必须将网关指向真实的网关处
    3. 不支持端口映射
    4. DS 与 RS 必须开启隧道功能
    5. 入站由 DS 完成,出战由 RS 完成
    6. 负载均衡器必须是 Linux 操作系统,真实服务器随意
    7. 压力较大(负载均衡器需要大量的数据包的封装和解封装)
    8. 使用场景比较少
    2.3.3.3 LVS DR 模式

    广播域:同一个广播域就是在同一个子网下,同一个交换机(二层)下的计算机都在同一个广播域中。

    DR模式叫做直接路由模式,与TUN模式不同的是,Nginx集群的响应会统一经过一个路由中转之后,统一返回给用户,此时Nginx集群是处于私网当中的;

    • 客户端i请求由LVS接受,由真实提供服务服务器RS直接返回给用户,**返回的时候不经过LVS。**DR 模式下需要LVS和绑定同一个VIP(RS通过将VIP绑定在loopback实现)。
    • 一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,改包就会被转发到对应的RS处理,注意此时的源IP和目标IP都没有变,LVS只是做了移花接木。
    • RS收到LVS转发来的包,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法的接受,RS感知不到前面有LVS的存在
    • 当RS返回响应时,只要直接向源IP返回即可,不需要再经过LVS。

    img

    LVS-DR(直接路由)模式:负载调度器通过交换机连接真实提供服务的服务器池(属于同一个广播域),接收用户请求并调度;均衡服务器池(伪装为调度器的公网IP地址后)通过交换机直接应答结果给路由器,进一步到用户;

    生产环境一般都是用DR模式,这避免了真实服务器暴露在公网之下防止攻击,又不必将数据从负载调度器原路返回,大大增加了LVS的抗并发能力,LBC模式其实和NGINX的七层代理本质一样的。

    LVS-DR 的特点就是:RS 真实服务器网卡上都会有一个负载均衡器的IP地址,并且该IP地址不向外广播。RS 和负载均衡器是在同一个广播域中。

    LVS-DR模式总结:

    1. 集群节点处于同一个广播域中
    2. 真实服务器将网关指向真实路由器(LVS-DR 模式中的负载均衡器只是做了一个数据包二层MAC地址的修改)
    3. 负载均衡器只否则入站请求,压力最小
    4. 不支持端口映射
    5. 负载均衡器必须是 Linux,真实服务器最好是 Linux(因为需要网卡配置一个DIP,并且该IP不能向外 ARP 广播)

    2.3.4 四种工作模式的对比

    NATDRTUNFULLNAT
    RS的限制任意OS限制ARP需要支持Tunneling任意OS
    RS的网络私有LANLAN/WAN私有
    RS的数量少量Low(10-20)大量High(100)大量High(100)少量Low(10-20)
    RS的网关LVS的DIP自己的路由自己的路由自己的路由
    优点端口转换性能好WAN端口转换,跨VLAN
    缺点性能瓶颈不支持跨网段需要支持Tunneling性能瓶颈,无法获得用户IP

    2.4 LVS-DR 构建

    2.4.1 个人实验环境说明

    网络:

    • 10.10.10.0/24
    • 总共需要 6 台机器(10.10.10.11,10.10.10.12,10.10.10.13,10.10.10.14,10.10.10.15,10.10.10.16)

    配置:

    • 使用VMware 的仅主机模式。

    • 操作系统配置

      • 硬件选项:1C2G、20GB、2块网卡。
      • 操作系统类型:CentOS 7.9.2009
    #所有机器执行
    #修改主机名
    hostnamectl set-hostname node1 | node2 | node3 ......
    
    #关闭防火墙功能
    systemctl stop firewalld 
    systemctl disable --now firewalld 
    
    #关闭SELinux
    setenforce 0
    sed -i.bak -r '/^SELINUX/s@(.*)=(.*)@\1=disabled@g' /etc/selinux/config
    
    #配置本地光盘源
    mkdir -pv /mnt/cdrom
    mount /dev/sr0 /mnt/cdrom
    #配置成开机自动挂载
    cat >> /etc/fstab <<EOF
    /dev/sr0 /mnt/cdrom iso9660 defaults 0 0 
    EOF
    
    #查看repo源
    mkdir -pv /etc/yum.repos.d/repo_backup
    mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo_backup
    cat > /etc/yum.repos.d/CentOS-Media.repo <<EOF
    [CentOS-Media]
    name=CentOS-Media
    baseurl=file:///mnt/cdrom/
    enabled=1
    gpgcheck=0
    EOF
    
    #安装常用软件包
    yum install -y lrzsz gcc gcc-c++
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.4.2 LVS-DR模式搭建

    img

    大致流程

    Client 发送一个数据包,源地址是10.10.10.240,目标地址是10.10.10.100,在当前广播域中,数据包会被发送到负载调度器,负载调度器会根据算法进行修改DMAC(目的MAC),修改完之后会被扔回广播域,回到RS1,为了使RS1能够接受数据,开启一个lo:0 10.10.10.100的接口(相当于起了个小名),这样的话,当前广播域中会存在多个相同的ip地址,会引起ip地址冲突,为了解决这个问题,可以修改ARP(地址解析协议,根据IP地址获取物理地址的一个TCP/IP协议)的通信行为,然后 lo 配置路由规则拿到数据报文,回信给客户端

    ARP 通信行为

    • ARP 响应级别

      • arp-ignore:
        • 0 只要本机配置有相应 IP 地址就响应
        • 1 仅在请求的目标地址配置在请求到达的网络接口上时,从给予响应
    • ARP 通告行为

      • arp-announce:
        • 0 将本机任何网络接口上的任何地址都向外通告
        • 1 尽可能避免目标网络通告与其网络不匹配的地址信息表
        • 2 仅向目标网络通告与其网络相匹配的地址信息

    实际操作:

    #关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
    #如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
    systemctl stop NetworkManager
    systemctl disable --now NetworkManager
    
    #CentOS6的操作
    service NetworkManager stop
    chkconfig NetworkManager off
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    负载均衡器的操作

    #负载均衡器10.10.10.11
    systemctl stop NetworkManager
    systemctl disable --now NetworkManager
    
    #创建虚拟网卡
    $ cd /etc/sysconfig/network-scripts
    $ cp ifcfg-eth0 ifcfg-eth0:0
    $ vim ifcfg-eth0:0
    NAME="eth0:0"
    DEVICE="eth0:0"
    ONBOOT="yes"
    #配置虚拟IP地址
    IPADDR="10.10.10.100"
    PREFIX="32"
    #重启网络服务
    $ systemctl restart network
    #查看机器的网卡配置是否生效
    $ ip addr show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
        inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 10.10.10.100/32 brd 10.10.10.255 scope global secondary eth0:0
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe16:7335/64 scope link
           valid_lft forever preferred_lft forever
    
    #配置内核参数
    $ cat >> /etc/sysctl.conf <<EOF
    #LVS-DR Kernel BEGIN
    ##禁止转发重定向报文
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.eth0.send_redirects = 0
    #LVS-DR Kernel END
    EOF
    #刷新内核参数
    $ sysctl -p
    #ipvsadm是一个工具,同时它也是一条命令,用于管理LVS的策略规则。
    $ modprobe ip_vs
    $ yum install -y ipvsadm
    #查看ipvs的信息
    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    
    #ipvs的常用命令
    ipvsadm -v
    ipvsadm -A -t 虚拟IP:80 -s rr
    ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g
    ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g
    ipvsadm -Ln
    service ipvsadm save
    chkconfig ipvsadm on
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    ipvsadm 命令的其他用法

    #语法
     ipvsadm -A|E -t|u|f <集群服务地址> [-s <调度算法>] [-p <超时时间>] [-M <掩码>] [-b <标志>]
     ipvsadm -D -t|u|f <集群服务地址>
     ipvsadm -C
     ipvsadm -R
     ipvsadm -S [-n]
     ipvsadm -a|e -t|u|f <集群服务地址> -r <真实服务器地址> [选项]
     ipvsadm -d -t|u|f <集群服务地址> -r <真实服务器地址>
     ipvsadm -L|l [options]
     ipvsadm -Z [-t|u|f <集群服务地址>]
     ipvsadm --set <超时时间>
     ipvsadm --start-daemon <主或备> [--mcast-interface <组播接口>] [--syncid <SID>]
     ipvsadm --stop-daemon <主或备>
     ipvsadm -h
    
    #相关的子命令
     --add-service     -A        添加一个集群服务,需要使用选项
     --edit-service    -E        编辑一个集群服务,需要使用选项
     --delete-service  -D        删除指定集群服务,需要使用选项
     --clear           -C        删除所有集群服务,包括真实服务器转发策略规则
     --restore         -R        从标准输入中恢复策略规则
     --save            -S        保存策略规则到标准输出
     --add-server      -a        添加一个真实服务器,需要使用选项
     --edit-server     -e        编辑一个真实服务器,需要使用选项
     --delete-server   -d        删除一个真实服务器,需要使用选项
     --list            -L|-l     查看集群服务列表,包括真实服务器转发策略规则
     --zero            -Z        计数器清零。清除连接数、包转发等数量统计信息
     --set <超时时间>            设置TCP、TCPFIN(TCP关闭连接状态)、UDP连接超时时间,用于
                                 会话保持。一般情况下TCP和UDP超时时间保持默认就好,TCPFIN
                                 可以根据情况设定,指定它则用户请求连接关闭,该连接则会变
                                 为非活跃(InActive)空闲等待状态,在空闲等待时间内,如果
                                 来自同一源IP的请求,则还会转发给后端的同一台真实服务器上
     --start-daemon              开启连接同步守护进程。在选项后面指定自己是Master(主)还
                                 是backup(备),主负载调度器会同步所有策略及连接状态到备
                                 负载调度器,当主故障,备可以接替其工作
     --stop-daemon               停止连接同步守护进程
     --help            -h        显示帮助信息
    
    #选项
     --tcp-service  -t  <集群服务地址>   允许集群服务使用的传输协议为TCP。<IP:Port>
     --udp-service  -u <集群服务地址>    允许集群服务使用的传输协议为UDP。<IP:Port>
     --fwmark-service  -f <防火墙标识>   使用一个整数值来防火墙标识集群服务,而不是地址、
                                         端口和协议使用它,我们可以通过结合IPtables将多
                                         个以调度器为目标的端口定义成一个防火墙标识,由
                                         ipvsdam通过此项关联标识,则可以实现对一个IP多
                                         端口调度,即实现后端服务器可以开放多个服务
     --scheduler    -s scheduler         指定集群服务使用的调度算法:rr|wrr|lc|wlc|lblc
                                         |lblcr|dh|sh|sed|nq,默认为wlc
     --persistent   -p <超时时间>        开启持久化服务,开启它则表示在指定时间内,来自同
                                         一IP的请求都会转发到后端同一台真实服务器上
     --netmask      -M <网络掩码>        使用网络掩码来屏蔽持久化来源IP的地址范围,默认值
                                         为255.255.255.255,即所有来源IP请求都会享受持久
                                         化服务
     --real-server  -r <真实服务器地址>  指定真实服务器的主机IP与端口
     --gatewaying   -g                   指定真实服务器转发工作模式,使用DR模式,默认
     --ipip         -i                   指定真实服务器转发工作模式,使用TUN模式
     --masquerading -m                   指定真实服务器转发工作模式,使用NAT模式
     --weight       -w <权重值>          指定真实服务器的权重值
     --u-threshold  -x <上阀值>          设置转发请求的最大上连接阀值,范围为0~65535,当
                                         当连接数超过指定上限时,LVS则不会转发请求                                   
     --l-threshold  -y <下阀值>          设置转发请求的下连接阀值,范围为0~65535,当连接
                                         数降低至指定值时,LVS则继续提供服务,默认值为0
     --mcast-interface interface         设置用于连接同步守护进程的组播接口
     --syncid sid                        设置连接同步守护进程的SID号,用于标识,范围0~255
     --connection   -c                   显示连接信息,一般与"-l"连用
     --timeout                           显示TCP、TCPFIN、UDP超时时间信息,一般与"-l"连用
     --daemon                            显示连接同步守护信息,一般与"-l"连用
     --stats                             显示统计信息,一般与"-l"连用
     --rate                              显示转发速率信息,一般与"-l"连用
     --exact                             显示数据包和字节计数器的确切值,扩大字符长度
     --thresholds                        显示阀值信息,一般与"-l"连用
     --persistent-conn                   显示持久化连接信息,一般与"-l"连用
     --numeric      -n                   地址和端口以数字格式显示,一般与"-l"连用
     --sched-flags  -b <标识>            设置调度算法的范围标识,用于SH算法,有两个标识:
                                         sh-fallback,如果真实服务器不可用,则将其转发到
                                         其他真实服务器上。
                                         sh-port,将源地址的端口号也添加到散列键=值中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    后台提供服务的真实服务器

    #提供服务的真实服务器RS 10.10.10.12
    $ systemctl stop NetworkManager
    $ systemctl disable --now NetworkManager
    
    #安装 httpd 服务并开启服务
    $ yum install -y httpd
    $ systemctl enable --now httpd
    $ netstat -auntlp | grep 80
    tcp6       0      0 :::80                   :::*                    LISTEN      1589/httpd
    $ echo "This is the real server1" > /var/www/html/index.html
    $ curl 10.10.10.12
    This is the real server1
    
    #配置网络服务
    $ cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
    DEVICE=lo:0
    #配置虚拟IP地址
    IPADDR=10.10.10.100
    NETMASK=255.255.255.255
    EOF
    $ systemctl restart network
    
    #配置内核参数
    $ cat >> /etc/sysctl.conf <<EOF
    #LVS-DR Kernel BEGIN
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2 
    net.ipv4.conf.default.arp_ignore = 1 
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 1
    #LVS-DR Kernel END
    EOF
    $ sysctl -p
    
    #启动回环网卡并配置路由信息
    $ ifup lo:0
    $ route add -host 10.10.10.100 dev lo:0
    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         10.10.10.2      0.0.0.0         UG    0      0        0 eth0
    10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
    10.10.10.100    0.0.0.0         255.255.255.255 UH    0      0        0 lo
    #设置开机自动加载
    $ echo "/usr/sbin/route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
    #提供服务的真实服务器RS 10.10.10.13
    $ systemctl stop NetworkManager
    $ systemctl disable --now NetworkManager
    
    #安装 httpd 服务并开启服务
    $ yum install -y httpd
    $ systemctl enable --now httpd
    $ netstat -auntlp | grep 80
    tcp6       0      0 :::80                   :::*                    LISTEN      8341/httpd
    $ echo "This is the real server2" > /var/www/html/index.html
    $ curl 10.10.10.13
    This is the real server2
    
    #配置网络服务
    $ cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
    DEVICE=lo:0
    #配置虚拟IP地址
    IPADDR=10.10.10.100
    NETMASK=255.255.255.255
    EOF
    
    #配置内核参数
    $ cat >> /etc/sysctl.conf <<EOF
    #LVS-DR Kernel BEGIN
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_aonnounce =2 
    net.ipv4.conf.default.arp_ignore =1 
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_aonnounce = 1
    #LVS-DR Kernel END
    EOF
    $ sysctl -p
    
    #启动回环网卡并配置路由信息
    $ ifup lo:0
    $ route add -host 10.10.10.100 dev lo:0
    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         10.10.10.2      0.0.0.0         UG    0      0        0 eth0
    10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
    10.10.10.100    0.0.0.0         255.255.255.255 UH    0      0        0 lo
    #设置开机自动加载
    $ echo "/usr/sbin/route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    用于测试,所以后台的真实服务器网页不一致;但在生产环境中,后台的真实服务器部署的网页站点是一致的。

    负载均衡器的规则

    #ipvs的常用命令
    ipvsadm -v
    #-A:代表添加一个集群
    ipvsadm -A -t 虚拟IP:80 -s rr
    #-a:代表添加集群中的子节点
    #-t:代表TCP协议
    #-s:指定算法
    #-r:代表后台的真实服务器
    #-g:指定为DR模式
    ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g
    ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g
    ipvsadm -Ln
    service ipvsadm save
    chkconfig ipvsadm on
    
    $ ipvsadm -A -t 10.10.10.100:80 -s rr
    $ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
    $ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.10.10.100:80 rr
      -> 10.10.10.12:80               Route   1      0          0
      -> 10.10.10.13:80               Route   1      0          0
    
    #使其 ipvsadm 配置永久生效(CentOS 7使用)
    ipvsadm -Sn > /etc/sysconfig/ipvsadm
    #ipvsadm-save > /etc/sysconfig/ipvsadm
    #清楚ipvs规则
    #ipvsadm -C
    #恢复命令:
    #ipvsadm-restore < /etc/sysconfig/ipvsadm
    
    #启动ipvsadm服务,并设置为开机启动
    $ systemctl enable --now ipvsadm.service
    #查看服务状态
    $ systemctl status ipvsadm.service
    #重启服务
    $ systemctl restart ipvsadm.service
    #开机自动加载集群规则
    $ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
    
    #查看ipvs状态
    $ ipvsadm -Ln --stats
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
      -> RemoteAddress:Port
    TCP  10.10.10.11:80                      0        0        0        0        0
      -> 10.10.10.12:80                      0        0        0        0        0
      -> 10.10.10.13:80                      0        0        0        0        0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    2.4.3 测试LVS-DR

    因为浏览器会有缓存机制,需要强制刷新页面就能够得到实验效果

    imgimg

    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.10.10.100:80 wrr
      -> 10.10.10.12:80               Route   1      0          0
      -> 10.10.10.13:80               Route   1      0          0
    $ ipvsadm -Ln --stats
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
      -> RemoteAddress:Port
    TCP  10.10.10.100:80                    35      331        0    61746        0
      -> 10.10.10.12:80                     17      111        0    15537        0
      -> 10.10.10.13:80                     18      220        0    46209        0
    #LVS模式:只负责入站的请求,出站的流量是由真实的服务器完成。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.5 LVS-NAT 构建

    img

    c发送一个数据包,源地址是20.20.20.22,目标地址是20.20.20.11,负载调度器LVS组件会根据DNAT转换把ip地址修改为服务器的地址,RS1收到数据包后,回信给网关负载调度器10.10.10.11,为了保证源地址一致性,采用了SNAT转换

    #关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
    #如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
    systemctl stop NetworkManager
    systemctl disable --now NetworkManager
    
    #CentOS6的操作
    service NetworkManager stop
    chkconfig NetworkManager off
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • LVS 的操作示例
    #LVS的操作
    #网络配置
    $ vim /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE="Ethernet"
    BOOTPROTO="static"
    NAME="eth0"
    DEVICE="eth0"
    ONBOOT="yes"
    IPADDR="10.10.10.11"
    PREFIX="24"
    
    $ vim /etc/sysconfig/network-scripts/ifcfg-eth1
    TYPE="Ethernet"
    BOOTPROTO="static"
    NAME="eth1"
    DEVICE="eth1"
    ONBOOT="yes"
    IPADDR="20.20.20.11"
    PREFIX="24"
    #重启网络服务
    $ systemctl restart network
    #查看IP地址
    $ ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
        inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe16:7335/64 scope link
           valid_lft forever preferred_lft forever
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:16:73:3f brd ff:ff:ff:ff:ff:ff
        inet 20.20.20.11/24 brd 20.20.20.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe16:733f/64 scope link
           valid_lft forever preferred_lft forever
    #安装 IPvsadm
    yum install -y ipvsadm
    
    #修改内核参数
    cat >> /etc/sysctl.conf <<EOF
    net.ipv4.ip_forward = 1
    EOF
    #刷新内核参数
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 后台 Real-Server 操作示例
    #关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
    #如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
    systemctl stop NetworkManager
    systemctl disable --now NetworkManager
    
    #CentOS6的操作
    service NetworkManager stop
    $ chkconfig NetworkManager off
    
    #网卡的网关设置为10.10.10.11
    $ vim /etc/sysconfig/network-scripts/ifcfg-eth0
    GATEWAY="10.10.10.11"
    
    $ systemctl restart network
    route add default gw <IP地址>
    
    #安装 httpd 服务
    yum install -y httpd
    
    systemctl enable --now httpd
    #RS1:10.10.10.12
    echo "This is the real server1" > /var/www/html/index.html
    #RS2:10.10.10.13
    sed -i.bak -r '/^Listen/s|(.*) (.*)|\1 8080|ig' /etc/httpd/conf/httpd.conf
    systemctl restart httpd
    echo "This is the real server2" > /var/www/html/index.html
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    用于测试,所以后台的真实服务器网页不一致;但在生产环境中,后台的真实服务器部署的网页站点是一致的。

    • 负载均衡器的规则
    #ipvs的常用命令
    ipvsadm -v #查看版本号
    
    #-A:代表添加一个集群
    #-s 10.10.10.0/24 是内网的网段 --to-source 公网网卡地址
    ipvsadm -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11
    ipvsadm -t nat -L
    ipvsadm -A -t 20.20.20.11:80 -s rr
    ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
    ipvsadm -Ln
    #service ipvsadm save
    #chkconfig ipvsadm on
    
    $ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11
    $ iptables -vnL -t nat
    Chain PREROUTING (policy ACCEPT 6 packets, 356 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 6 packets, 356 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 1 packets, 88 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        1    88 SNAT       all  --  *      eth0    10.10.10.0/24        0.0.0.0/0            to:20.20.20.11
    #保存iptables规则
    $ iptables-save > /tmp/iptables.txt
    #centos7之前是
    service iptables save
    #centos7是
    systemctl enable iptables.service
    #重启服务,规则都还在
    service iptables restart
    
    $ ipvsadm -A -t 20.20.20.11:80 -s rr
    $ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
    $ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m
    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  20.20.20.11:80 rr
      -> 10.10.10.12:80               Masq    1      0          0
      -> 10.10.10.13:8080             Masq    1      0          0
    
    #使其 ipvsadm 配置永久生效(CentOS 7使用)
    ipvsadm -Sn > /etc/sysconfig/ipvsadm
    #ipvsadm-save > /etc/sysconfig/ipvsadm
    #清楚ipvs规则
    #ipvsadm -C
    #恢复命令:
    #ipvsadm-restore < /etc/sysconfig/ipvsadm
    
    #启动ipvsadm服务,并设置为开机启动
    $ systemctl enable --now ipvsadm.service
    #查看服务状态
    $ systemctl status ipvsadm.service
    #重启服务
    $ systemctl restart ipvsadm.service
    #开机自动加载集群规则
    $ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
    
    #查看ipvs状态
    #会发现出站和入站都会有流量的加入,符合NAT模式
    $ ipvsadm -Ln --stats
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
      -> RemoteAddress:Port
    TCP  20.20.20.11:80                      5       35       24     4706     4005
      -> 10.10.10.12:80                      2       13        9     1775     1452
      -> 10.10.10.13:8080                    3       22       15     2931     2553
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 测试实验结果

    因为浏览器会有缓存机制,需要强制刷新页面就能够得到实验效果

    imgimg

    2.6 调度算法(策略)

    2.6.1 通用算法 - 调度

    固定算法(静态调度算法):只根据算法本身去调度,完全不考虑服务器本身

    • 固定算法所消耗的资源比较少

    动态算法(动态调度算法):除了考虑算法本身,还要考虑服务器的状态

    • 动态算法需要实时计算,所以消耗的资源比较多
    2.6.1.1 静态调度算法
    1. RR 轮询:将每次用户的请求分配给后端的服务器,从第一台服务器开始到第 N 台结束,然后循环

    2. WRR 加权轮询:按照权重的比例实现在多台主机之间进行调度

      1. wrr 相对于 rr 的进步之处在于考虑到了后端真实服务器的性能差异,wrr 在进行分配时引入了权重,可以使得性能好的真实服务器处理更多的请求,使得性能一般的服务器处理较少的请求。
      2. 服务器设置的权重越高,那么获得的处理的请求数就越多。
    3. SH(Source Hash)源地址散列:将同一个IP的用户请求,发送给同一个服务器

      1. HTTP -> HTTPS 无状态协议,也就是意味着每一次发起请求,都不知道上一次连接的信息是什么,无状态协议本身会导致发起的请求连接断开,导致影响用户使用
      2. 为了应对该问题,所以引入了 Cookie,Session。用来保障每一次连接可以知道服务器上一次访问的哪些数据,以及相关的参数。
      3. Cookie 用户端持久化,Session 服务器端持久化。

    img

    img

    1. DH(Destination Hash)目的地址散列:将同一个目标地址的用户请求发送给同一个真实的服务器(提高缓存的命中率)

      1. 大部分采用缓存服务器中。根据请求的目标IP地址作为哈希键从静态分配的哈希表中找出对应的服务器。发往同一个目标地址的请求始终转发到第一次调度的RS,可用于实现正向代理缓存场景中的负载均衡,如:web缓存。
    2.6.1.2 动态调度算法

    动态调度算法所理解的 http 连接分为两种:

    1. 活动连接:正在传输数据

    2. 非活动连接:

      1. 刚建立握手,还没有传输数据
      2. 传输数据完毕还没来得及断开
    3. 一般情况下,活动连接一般远大于非活动连接资源消耗,LVS 就理解为 活动连接 等同于 256 * 非活动连接的资源消耗比。

    4. LC(Least Connection)最少连接:将新的连接请求,分配给连接数最少的服务器,活动连接 * 256 + 非活动连接

      1. 面试题:第一台服务器的活动连接:10个,非活动连接:1000个。第二台服务器的活动连接:8个,非活动连接:8000个。问下一次连接请求是发送给哪一台服务器处理?第一台服务器:10 * 256 + 1000 = 3560,第二台服务器:8 * 256 + 8000 = 10048。所以下一次请求是发送给第一台服务器进行处理。
    5. WLC(Weighted Least Connection)加权最少连接:特殊的最少连接算法,权重越大承担的请求数越多(活动连接 * 256 + 非活动连接) / 权重

    6. SED(Shortest Expected Delay Scheduling)最短期望延迟:特殊的 WLC 算法,(活动连接 + 1)* 256 / 权重。

      1. 第一台服务器,权重设置为1,初始的请求数为0,第二台服务器(性能高),权重设置为2,初始的请求数为0。那么第一个请求连接是交给哪台服务器进行处理?第一台服务器:(0+1)* 256 / 1 / 3 = 768,第二台服务器:(0+1)*256 / 2 / 3 = 384(值小),值小就代表压力小,那么就会将请求以及大部分请求发送给第二台服务器。
    7. NQ 永不排队:特殊的SED算法,无需等待,如果有真实服务器的连接数等于 0 那就直接分配不需要运算

    8. LBLC 特殊的 DH 算法:即能提高缓存命中率,又要考虑服务器性能

    9. LBLCR :LBLC + 缓存,尽可能提高负载均衡和缓存命中率的折中方案

    2.6.2 LVS 持久连接

    HTTPS 安全 配置复杂 需要证书 消耗性能

    SSL 握手设备(处理 HTTPS 请求的硬件设备)

    img

    持久化连接:LVS

    • 类似于SH算法,即将同一源的IP的Client,发送给同一Server
    • 优先于通用算法 SH DH RR LBLC

    使用场景:

    • 持久化连接普遍用于 HTTPS 相关的 LVS 集群中。

    如何持久连接:

    • Client 每次访问负载器时,持久化时间加30,即为了保证持久
    • 当持久化时间消耗殆尽后,以通用算法来计算

    PCC(持久客户端连接):每客户端持久;将来自于同一个客户端的所有请求统统定向至此前选定的 RS;也就是只要IP相同,分配的服务器始终相同。

    example:ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120

    PPC(持久端口连接):每端口持久;将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的 RS;也就是只要IP,并且访问的端口相同,分配的服务器始终相同。

    example:ipvsadm -A -t 172.16.0.8:80 -s rr -p 120

    PFMC(持久防火墙标记连接):将来自于同一个客户端对指定服务(端口)的请求,始终定向至此选定的 RS;不过它可以将两个毫不相干的端口定义为一个集群服务。

    -t mangle -A PREROUTING:在mangle表中 PREROUTING链里
    -d 172.16.0.8        :目标地址是172.16.0.8
    -p tcp -dport 80     :TCP协议的80端口
    -j MARK --set-mark 10:标记mark值等于10
    #iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
    #iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
    #service iptables save
    #ipvsadm -A -f 10 -s wlc -p 120
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    范例:测试 PPC 持久端口连接

    ##在NAT模式的环境下进行修改,LVS机器执行
    #清除ipvs规则
    $ ipvsadm -C
    
    #添加ipvsadm规则
    $ ipvsadm -A -t 20.20.20.11:80 -s rr -p 120
    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  20.20.20.11:80 rr persistent 120
    
    $ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
    $ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m
    $ ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  20.20.20.11:80 rr persistent 120
      -> 10.10.10.12:80               Masq    1      0          0
      -> 10.10.10.13:8080             Masq    1      0          0
    #查看持久化环境
    $ ipvsadm -Ln --persistent-conn
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port            Weight    PersistConn ActiveConn InActConn
      -> RemoteAddress:Port
    TCP  20.20.20.11:80 rr persistent 120
      -> 10.10.10.12:80               1         0           0          0
      -> 10.10.10.13:8080             1         1           0          10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    进行实验访问

    img

    强制刷新也是会调度到同一个,过了120秒之后,就会重新分配。

    img

    #查看ipvs的详细信息流量
    $ ipvsadm -Ln -c
    IPVS connection entries
    pro expire state       source             virtual            destination
    TCP 00:14  TIME_WAIT   20.20.20.1:11819   20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11814   20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11817   20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11813   20.20.20.11:80     10.10.10.13:8080
    TCP 15:01  ESTABLISHED 20.20.20.1:11882   20.20.20.11:80     10.10.10.13:8080
    TCP 00:19  TIME_WAIT   20.20.20.1:11821   20.20.20.11:80     10.10.10.13:8080
    TCP 00:12  TIME_WAIT   20.20.20.1:11807   20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11811   20.20.20.11:80     10.10.10.13:8080
    TCP 00:14  TIME_WAIT   20.20.20.1:11820   20.20.20.11:80     10.10.10.13:8080
    TCP 01:58  NONE        20.20.20.1:0       20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11812   20.20.20.11:80     10.10.10.13:8080
    TCP 00:13  TIME_WAIT   20.20.20.1:11816   20.20.20.11:80     10.10.10.13:8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【基础篇】七、Flink核心概念
    MyBatis-动态SQL
    Lecture 12 Memory Management(内存管理)
    k8s搭建EFK日志系统
    Docker 常用命令
    文献知识点总结(1)《Boosting solar energy conversion with nanofluids》
    Blender 插件
    创建springboot(三)用户登录
    简单聊聊Https的来龙去脉
    numpy公式
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/126843848