[导读] 前言今天我们来深度解密一下负载均衡器LVS的秘密,相信大家看了你管这破玩意儿叫负载均衡?这篇文章后,还是有不少疑问,比如LVS看起来只有类似路由器的转发功能,为啥说它是四层(传输层)负载均衡器呢,今天我们就来逐渐揭开LVS的迷雾,本文将会用图解的方式浅入深地探讨LVS的工作机制最...
前言 今天我们来深度解密一下负载均衡 器 LVS 的秘密,相信大家看了 你管这破玩意儿叫负载均衡? 这篇文章后,还是有不少疑问,比如 LVS 看起来只有类似路由器的转发功能,为啥说它是四层(传输层)负载均衡器呢,今天我们就来逐渐揭开 LVS 的迷雾,本文将会用图解的方式浅入深地探讨 LVS 的工作机制 最好大家对网络是如何连接的,数据包的收发机制有所了解,这样会很容易理解本文的知识点,如果对此没概念,建议大家看看 这篇文章 ,把网络是如何连接的给你安排得明明白白 没看过也没关系,本文会对一些必要的知识点做些铺垫,争取让大家都能看懂 负载均衡器的诞生 在很长一段时间内小章公司的 DAU(日活)不超过 10,所以他只部署了一台机器,毕竟多一台机器要加钱,而且就算挂了也影响不了几个用户 但无意间小章的业务踩中了风口,业务量暴涨,dau 达到了好几万,眼看就要突破十万,小章慌了,赶紧全面升级了这台机器的内存,CPU 等配置,暂时扛过去了,但小章明白,单机性能无论怎么升都会遇到瓶颈,所以小章想了个办法,多部署几台机器,将流量平均分配到这几台机器上 怎么分配呢,最简单的方式,当然是用 DNS 负载均衡,在域名解析服务器上设置负载均衡策略,让流量随机打到其中某台机器上 但这个方案有以下两个明显的问题: 占用过多公网 IP,要知道现在租一个公网 IP 可是要好几千 DNS 缓存可能会引起致命故障 第一个问题加钱就能解决,但第二个问题可不是加钱就能解决的了,因为众所周知 DNS 解析是迭代或递归查询,需要经过 根 DNS 服务器 -> 顶级DNS服务器 -> 权威DNS服务器 这三步查找才能解析到域名对应的 ip,可想可知这个解析是有多么耗时,所以一般会有 DNS 缓存 ,DNS 缓存主要有「浏览器缓存」,「操作系统缓存」,「路由器缓存」,「ISP 缓存」四种 每次发起一个域名解析请求,都会依次在以上四个缓存里查找,如果命中缓存,则直接返回此域名对应的 IP,其中像 Chrome 缓存 1 分钟, ISP 缓存可能高达 1~2 个小时,于是问题就来了,如果某台机器宕机,但由于以上四个缓存中依然可能会有此域名的 IP 缓存,对请求方而言,是感知不到的,那么只要缓存未过期请求方就会持续地将将流量打到这台挂掉的机器,引起线上故障,这当然是不能容忍的。 那该怎么办呢,小章突然想起了计算机界的一个经典名言:「没有什么是加一层解决不了的问题,如果有,那就再多加一层」,何不在 DNS 与 server 间多加一层,负载均衡的工作让这个中间层来做,小章想了下脑海中浮现出了以下架构图 可以看到这个负载均衡器(以下简称 LB)有以下特点 对外用公网 ip(以下我们简称 VIP) 承接所有流量,对内则与真实的服务器(即 Real Server,以下简称 RS)通信,与 RS 在同一个内网里 LB 只负载转发请求的工作,实际的处理逻辑交由其背后的 RS,RS 处理完后将响应包发给 LB,然后 LB 再返回给 client 于是网络拓扑图改进如下 NAT 接下来的重点就是 LB 是如何工作的了,首先要明白,当我们说收到一个请求时,实际上收到的是一个数据包,那么这个数据包长啥样呢 源IP , 目的IP , 源端口 , 目的端口 ,简称 TCP 四元组,四元组唯一确定一条链接 ,在传输过程中四元组是不会变的,现在 LB 收到这个数据包之后,想将其转发给其背后的服务器,就要把目的 IP 改成服务器的 IP(假设为第二台机器,其 IP 地址为 192.168.0.3),那么修改后的数据包如下 当 RS 处理好后,由于这个数据包还要经过 LB 再转发给客户端,所以服务器的网关要设置为 LB 的内网 IP(即 192.168.0.1)再将数据包出去,LB 就能收到所有的响应数据包了。 此时的数据包如下 为什么 RS 的响应包要经过 LB 呢,因为为了保证四元组不变,LB 收到数据包后要将源 IP 改为 VIP,客户端才会识别到这是对之前请求的正确响应 画外音:客户端请求与响应包的四元组不能变 修改后的数据包 所以总结一下 LB 的主要工作机制:主要是修改了进出数据包的 IP,首先修改目的 IP 为其 RS 的 IP,将包传给 RS 处理,RS 处理完后再将包发给网关(LB),LB 再修改源 IP 为其出口的 VIP,只要四元组不变,那么客户端就能正常地收到其请求的响应 ,为了让大家更直观地感受负载均衡的对 IP 的修改,我做了一张动图,相信大家看了理解会更深刻 从客户端的角度来看,它以为其与 LB 背后的 RS 通信,但实际上它只是与 LB 通信,LB 只是起到了一个虚拟服务器的作用,所以我们给它命名为 LVS(Linux Virtual Server),LVS 只是起到了修改 IP 地址并且转发数据包的功能而已,由于它在数据包的进出过程中都修改了 IP 地址,我们称这模式为 NAT(Network Address Translation,网络地址转换) 模式,可以看到这种工作模式下,网络请求包和网络响应包都要经过 LVS 看到这问题似乎已经完美解决了,但是我们忽略了一个问题:每个网络数据包都是有大小限制的 。如下图示,在每个数据包中,每个 payload(一般为应用层数据)大小一般不能超过 1460 byte 也就是说如果在客户端的请求数据(比如 HTTP 请求过大)超过了 1460 个字节,就要分包传,服务端收到所有分包后再组装成完整的应用层数据,那么显然,LVS 应该把同一个请求(即四元组相同)的分包转发给同一个 RS,不然把分包传给不同的 RS,数据就不完整了。所以 LVS 要根据四元组来记录包应该转发给哪一个 RS,四元组一样的数据包都转发给同一个 RS。 四元组的 IP 是在 IP Header 中,而端口号在 TCP Header 中,这意味着 LVS 需要卸下 TCP Header 拿到端口号,然后根据四元组是否相同再决定是否转发到同一台 RS 上,四元组对应一个 TCP 连接,也就是说 LVS 具有记录连接的功能 ,而连接是传输层的概念。至此相信你明白开头的一个问题:「LVS 起到了转发包的功能,为什么说它是四层负载均衡」 DR 经过这样的设计,由于 LVS 负载均衡的作用,轻松解决了单机瓶颈,小章的公司顺利度过了 C10K(并发连接 1 万),C20K,。。。。的问题,度过了瓶颈期,但随着并发数越来越高,小章发现了一个大问题,LVS 逐渐扛不住了,因为所有数据包的进出都要经过它,这让它成为了很大的瓶颈,随着 RS 水平扩展数量越来越多, LVS 迟早要挂掉。能否让 LVS 只负责转发请求包,但响应的数据包直接经由 RS 返回给客户端呢,类似下面这样 画外音:红色虚线为数据包的流转流程,可以看到响应数据包不经过 LVS 这样的话响应包就不用经过 LVS 了,LVS 的负载压力自然释放了,我们把这种模式称为 DR(Direct Router,直接路由)模式 方案有了,那么怎么实现呢?这个设计方案有两个注意点 首先 LVS 还是要承载所有的请求流量(接收所有数据包),然后再根据负载均衡 算法转发给 RS RS 处理完后是不经过 LVS,直接将数据包转发给路由器再发给客户端的,意味着 RS 必须要有与 LVS 同样的 VIP(四元组不能变),另外由以上拓扑图可知,它们也必须在同一个子网里(严格地说,应该是同一个 vlan,因为是通过交换机通信的),这就意味着 LVS 和 RS 都必须要有两个 IP,一个 VIP,一个子网 IP 那么一台主机如何才能有两个 IP 呢? 我们知道计算机要上网,首先要把网线插入网卡,一个网卡其实就对应着一个 IP,所以一台主机配两个网卡就有两个 IP ,但多数人不知道的是一个网卡是可以配置多个 IP 的,另外网卡一般分两种,一种是物理网卡 ,一种是虚拟网卡 物理网卡 :可以插网线的网卡,如果有多个网卡,我们一般将其命名为 eth0,eth1。。。,如果一个网卡对应多个 IP,以 eth0 为例,一般将其命名为 eth0,eth0:0,eth0:1。。。eth0:x,比如一台机器只有一个网卡,但其对应两个 IP 192.168.1.2, 192.168.1.3,那么其绑定的网卡名称分别为 eth0,eth0:0 虚拟网卡 :虚拟网卡通常被称为 loopback,一般命名为 lo,是一个特殊的网络接口,主要用于本机中各个应用之间的网络交互(哪怕网线拔了,本机各个应用之间通过 lo 也是能通信的),需要注意的是虚拟网卡和物理网卡一样,也可以绑定任意 IP 地址,如果在虚拟网卡配置了任何的 IP 地址,只要有物理网卡,就能到收到并处理目的 IP 为虚拟网卡上 IP 的数据包,lo 默认绑定了 127.0.0.1 这个本地 IP ,如果要绑定其他的 IP,对应的网卡命名一般为 lo:0,lo:1。。。 画外音 :一般服务器包括 LVS 是以双网卡的形式存在的,一来每个网卡带宽都是有限的,双网卡相当于提升了一倍的带宽,二来两个网卡也起到了热备的作用,如果一个网卡坏了,另外一个可以顶上。理解了以上知识点,我们可以将拓扑图完善如下 你可能注意到了 RS 的 VIP 是绑定在 lo:0 虚拟网卡 上而不是物理网卡上,这是为什么呢,主要是为了保证请求都打到 LVS 上 。 1. arp_ignore=1 首先我们知道 LVS 和 RS 都位于同一个子网,我们需要了解一下子网的工作机制:子网一般称为以太网,主要用 mac 地址来通信,位于 ISO 模型的二层,一开始内网的机器互相不知道彼此的 mac 地址,需要通过 arp 机制来根据 IP 获取其对应的 mac,获取之后首先会在本地的 arp 表记录此 IP 对应的 mac (下次就直接在本地缓存查找 mac),然后会在包头上附上 IP 对应的 mac,再将包传输出去,交换机就会找到对应的机器了 所以当客户端请求 VIP 后,请求到达了上图中的路由器,路由器要转发给此 IP 对应的机器,于是它首先发起了一个 arp 请求希望拿到 VIP 对应的 mac 地址。 那么现在问题来了,由于三台机器的 IP 都为相同的 VIP,如果都响应了 arp 请求,就相当于一个 IP 对应了三个 mac,路由器该用谁的 mac 地址呢? 解决方案很简单:由于请求都要经过 LVS,所以只让 LVS 响应 arp,抑制住另外两台 RS 对 VIP 的 arp 响应即可,不过请求到达 LVS 后,LVS 还要将包转发给 RS(假设为 RS2 吧),此时也要用到 arp 来获取 RS 的 mac 地址,但是注意从 LVS 发起的 arp 请求目的 IP 变成了 RS2 的内网 IP:115.205.4.217(绑定在物理网卡 eth0 上)。 综上所述, RS 不能响应目的 IP 为虚拟网卡 绑定的 VIP 的 arp 请求,但能响应目的 IP 为物理网卡 绑定的 IP 的 arp 请求,这就是为什么 RS 需要把 VIP 绑定在虚拟网卡上,而把内网 IP 绑定在物理网卡上的真实原因,就是为了 arp 响应的需要 当然一般服务器默认都会响应所有 IP 的 arp 响应,所以需要对 RS 做额外配置,即 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.lo.arp_ignore=1设置的 arp_ignore=1 表示的含义如下 1 - reply only if the target IP address is local address configured on the incoming interface 即我们上述所说的,只响应目的 IP 为接收网卡(即物理网卡 )上的 IP 的 arp 请求(会忽略目的 IP 为虚拟网卡 上 VIP 的 arp 请求) 作了以上的设置后由于针对 VIP 的 arp 请求只有 LVS 会响应(路由器收到 LVS 的 arp 响应后会在 arp 缓存表里记录 VIP 的 mac 地址为 LVS 的mac),所以可以保证所有请求都会打到 LVS 上,然后 LVS 也顺利地将数据包发给了 RS2,RS2 处理好后就准备把数据包从网卡发出了,但这里需要注意,RS2 可不能直接把数据包通过物理网卡 eth0 传出去的,这样会导致数据包的源 IP 被修改为 eth0 的 IP(即 115.205.4.217),会导致四元组发生变化(别问为什么,问就是协议栈的关系),所以我们需要额外配置一下,让数据包使用 lo 接口发送,如下 route add -host 115.205.4.214 dev lo:0# 添加一条路由,目标 IP 为 VIP 的数据包使用 lo 接口发送,这样响应报文的源 IP 就会为 VIP 然后再通过 eth0 发出去,这样可保证四元组不会发生变化。 2. arp_announce=2 接下来还有一个问题,RS2 怎么将数据包传给它的网关(即路由器)呢,由于它们还是在同一个子网,所以也是通过 arp 的方式先获取到网关的 mac,然后在以太网包头上装上网关的 mac 传给网关的。 但这里有一个点需要注意,通过 arp 获取网关的 mac 时,网卡会发送一个包含「源IP」,「目标 IP」,「源 mac」的 arp 广播包 通常情况下源 IP 可以选择为数据包的源 IP,也可以选择为物理网卡上的 IP,但在 DR 模式下这里的源 IP 只能选择为物理网卡上 IP ,这是为什么呢 我们知道目标 IP 是网关 IP,所以网关会响应这个 arp 请求,但同时网关在收到这个 arp 响应后也会在本地的 arp 表更新:源 IP => 源 mac 这一项,这里的源 mac 为 RS2 的 mac,还记得上文中路由器的 arp 缓存表已经保存了 LVS 的 VIP 与 LVS 的 mac 的对应关系了吗,也就是说从 RS2 发出的 arp ,源 IP 如果是数据包的源 IP(即 VIP),网关收到 arp 后会在路由表更新 VIP 的 mac 地址为 RS2 的 mac 的地址!这样下一次客户端请求路由器就会直接把数据包转发给 RS2 而不会经过 LVS!所以 RS2 要发 arp 获取网关的 mac 时使用的源 IP 应该为其物理网卡(eth0)对应的 IP(即 115.205.4.217),这样就避免了上述问题,与 arp_ignore=1 一样,这一项也需要我们手动配置 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.lo.arp_announce=2arp_announce=2 表示的是 忽略 IP 数据包的源 IP 地址,选择该发送网卡上最合适的本地地址作为 arp 请求的源 IP 地址 上面这段有点绕,大家可以多读几遍好好体会一下,其实主要目的就是为了避免路由器的 ARP 缓存表误更新 VIP 的 mac 为 RS 的 mac 从上面的介绍可以看出 DR 模式是比较复杂的,需要在 RS 上做额外的配置,所以线上一般使用 NAT 模式 FullNAT 但问题又来了,该怎么解决 NAT 模式下 LVS 的单点问题呢,毕竟所有进出流量都出入同一台 LVS(因为 RS 的网关只有有一个),在 RS 不断扩容下,单点 LVS 很可能成为巨大的隐患,而且 LVS 要作为所有 RS 的网关,意味着他们要在同一个网段下。 如果在阿里云这些公有云平台上部署肯定不现实,因为在公有云上,很可能 RS 是分布在各地的,这就意味着要跨 vlan 来通信,而 NAT 显然不符合要求,于是在 NAT 的基础上又衍生出了 FullNAT,FullNAT 其实就是为了公有云而生的 FullNAT NAT 模式下,LVS 只将数据包的目标 IP 改成了 RS 的 IP,而在 FullNAT 模式下,LVS 还会将源 IP 地址也改为 LVS 的内网 IP(修改 IP 主要由 LVS 的内核模块 ip_vs 来操作),注意上图 LVS 内网 IP 和 RS 的 IP 是可以在不同网段下的,通常在公有云平台上,它们是部署在 intranet 即企业内网中的,这样的话 LVS 就可以跨网段和 RS 通信了,也避免了 LVS 的单点瓶颈,多台 LVS 都可以将请求转发给 RS 如图示,部署了两台 LVS,它们内网与 RS 的不在同一个网段,照样能通信,部分读者可能会注意到一个问题:LVS 转发给 RS 的数据包源 IP(即客户端 IP,client_ip)被替换成了内网 IP,这就意味着 RS 收到的数据包是不含有 client_ip 的,有时候 client_ip 对我们分析数据有很重要的作用(比如分析下单在不同地域分布情况就需要 client_ip),针对这种情况,LVS 会在收到请求包后在数据包的 TCP Header 中插入 client_ip 上图就是是 TCP Header,client_ip 就是放在 tcp option 字段中的,然后 RS 上只要安装了 TOA 模块就能从中读取 client_ip,TCP 的这个 option 的字段也提醒我们在做技术方案设计的时候适当的增加一些冗余字段能让你的程序可扩展性更好。 总结 至此,相信大家已经明白了 LVS 的 NAT,DR ,FullNAT 的工作机制了,实际上 LVS 还有个 TUNNEL 隧道模式,只是生产上不怎么用,所以不做介绍,另外每个 LVS 一般会做双机热备,如下,备机通过定时发送心跳包能感受到 LVS 主机的存活,另外注意虚线部分,备机还可以感知到服务器的存活,如果服务器挂了, LVS 会将其剔除,保证 LVS 转发的流量不会打到宕掉的机器上。 文中的小章就是章文嵩博士,1998 年他主导了 LVS 项目的开发,一开始只有 NAT,DR,TUNNEL 三种模式,但后来随着阿里云云上服务的崛起,这三种模式都无法满足实际的部署需要,所以他又指导其手下基于 NAT 来做改造诞生了 FullNAT,值得一提的是 LVS 是少数几个国人开发并得到 Linux 官方认可的开源软件,已集成进 Linux 内核,可见这一项目的巨大价值与贡献。 - EOF -
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。
关键字:
驱动电源
在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。
关键字:
工业电机
驱动电源
LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...
关键字:
驱动电源
照明系统
散热
根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。
关键字:
LED
设计
驱动电源
电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...
关键字:
电动汽车
新能源
驱动电源
在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...
关键字:
发光二极管
驱动电源
LED
LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。
关键字:
LED
驱动电源
功率因数校正
在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...
关键字:
LED照明技术
电磁干扰
驱动电源
开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源
关键字:
LED
驱动电源
开关电源
LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。
关键字:
LED
隧道灯
驱动电源
LED驱动电源在LED照明系统中扮演着至关重要的角色。由于LED具有节能、环保、长寿命等优点,使得LED照明在各个领域得到广泛应用。然而,LED的电流、电压特性需要特定的驱动电源才能正常工作。本文将介绍常用的LED驱动电...
关键字:
LED驱动电源
led照明
LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电源转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。
关键字:
LED
驱动电源
高压工频交流
种种迹象都在表明,半导体行业或已提前进入寒冬时期,越来越多的厂商开始扛不住了……
关键字:
LED
半导体
驱动电源
崧盛股份9日发布投资者关系活动记录表,就植物照明发展趋势、行业壁垒等问题进行分享。植物照明未来市场需求广阔崧盛股份指出,植物照明将会走向长期产业领域。主要原因有三:第一,LED植物照明赋能终端种植更具有经济价值。由于LE...
关键字:
崧盛股份
驱动电源
在当今高度发展的技术中,电子产品的升级越来越快,LED灯技术也在不断发展,这使我们的城市变得丰富多彩。 LED驱动电源将电源转换为特定的电压和电流,以驱动LED发光。通常情况下:LED驱动电源的输入包括高压工频交流电(即...
关键字:
LED
驱动电源
高压直流
人类社会的进步离不开社会上各行各业的努力,各种各样的电子产品的更新换代离不开我们的设计者的努力,其实很多人并不会去了解电子产品的组成,比如LED电源。
关键字:
LED
驱动电源
低压直流
随着科学技术的发展,LED技术也在不断发展,为我们的生活带来各种便利,为我们提供各种各样生活信息,造福着我们人类。LED驱动电源实际上是一种电源,但是它是一种特定的电源,用于驱动LED发射带有电压或电流的光。 因此,LE...
关键字:
LED
驱动电源
电流
LED灯作为一种新型节能和无污染光源,由于其特有的发光照明特性,在现代照明应用中发挥着革命性的作用。作为 LED 照明产业链中最为核心的部件之一,LED 驱动电源的驱动控制技术所存在的可靠性低、成本高等典型问题一直制约着...
关键字:
多路
LED
驱动电源
随着社会的快速发展,LED技术也在飞速发展,为我们的城市的灯光焕发光彩,让我们的生活越来越有趣,那么你知道LED需要LED驱动电源吗?那么你知道什么是LED驱动电源吗?
关键字:
LED
开关电源
驱动电源
早前有新闻称,Cree在2018年开始宣布转型高科技半导体领域,并一边逐渐脱离照明与LED相关业务,一边持续投资半导体。在今日,Cree宣布与SMART Global Holdings, Inc.达成最终协议,拟将LED...
关键字:
cree
led照明