• 首页
  • 关于我们
  • 产品中心
  • 新闻资讯
  • 在线招聘
  • 联系我们
  • 新闻资讯

    你的位置:开云(中国)Kaiyun·官方网站 > 新闻资讯 > 开云(中国)Kaiyun·官方网站 20张图让你澈底掌捏负载平衡的机密!

    开云(中国)Kaiyun·官方网站 20张图让你澈底掌捏负载平衡的机密!

    发布日期:2023-12-09 13:46    点击次数:95

    [[416980]]  开云(中国)Kaiyun·官方网站媒介

    今天咱们来深度解密一下负载平衡器 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=2 

    arp_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 内核,可见这一神志的纷乱价值与孝顺。

    本文转载自微信公众号「码海」,不错通过以下二维码温雅。转载本文请关联码海公众号。