暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案

这是悟空的第 158 篇原创文章

原文链接:首发悟空聊架构

官网:www.passjava.cn

你好,我是悟空。

前言

上篇我们讲了Keepalived 底层原理上篇,中篇还是得继续呀,但是发现中篇内容还是很多,一篇讲不完,所以先讲 Keepalived 的路由原理。

在写的过程中,发现路由原理其实挺枯燥的,我想把这个主题用通俗易懂、且有趣的方式讲解出来,但是一直找不到合适的切入点,一次偶然的对话让我的灵感迸发。

话说之前大学放暑假的时候,我到一个餐厅打工两个月,Title 是初级传菜员。正是这次打工经验,为我带来了一波潜藏已久的素材,请听听我的故事吧~

本文主要内容如下:

一、餐厅角色

在餐厅主要有这几种角色:

  • 服务员:负责记录客户已点哪些菜、上菜时间、上菜、划掉菜。可以将多个服务员都当做客户端,相对于传菜员来说。
  • 传菜员:负责通知厨房走菜、划菜、传菜。可以将传菜员当作 Keepalived 组件
  • 厨师:烹饪、装盘。可以将厨师当作后台真实服务器

为什么需要传菜员这个角色?有了传菜员这个角色后,发生了什么呢?

  • 服务员需要服务顾客,不需要离开包间去厨房拿菜。(单一职责)
  • 服务员不需要定期到厨房询问菜是否好了。(解耦)

流程图如下:

① 客户点菜下单。

② 服务员记录菜名、上菜时间。这里的上菜时间是指客户要求的上菜时间,因为有些客户可能想等朋友一起来了再吃。

③ 服务员将一份订单交给传菜员,另外一份订单留在包间。

④ 传菜员大声通知多位厨师有哪些菜要做,什么时候开始上菜。

⑤ 厨师准备食材和烹饪。如果缺少食材,厨师还会告诉传菜员,由传菜员转告服务员说这道菜不能做。

⑥ 厨师做好后将菜装在盘子里,然后递给传菜员。

⑦ 传菜员将订单上对应的菜划掉,表示已经做了。

⑧ 传菜员将菜端给服务员。

⑨ 服务员将菜从订单上划掉。

⑩ 服务员将菜端上餐桌。

这个流程简单来说就是客户下单->服务员传单->传菜员通知->厨师烹饪->传菜员传菜->服务员上菜。

上面的流程不正是服务员请求数据,将请求都发给了传菜员,传菜员将请求转发给了厨师,厨师处理完后返回结果。妙啊!!

二、初探 Keepalived 的路由方案

2.1 为什么需要路由方案

上篇我们讲到 Keepalived 的负载均衡调度算法,通过这个算法选出某台真实服务来处理本次客户端请求。

就好比传菜员要将要做的菜,告诉其中一个厨师(一般是告诉大厨)。

而如何告诉厨师呢?是用喇叭喊,还是传呼机,还是走到他旁边告诉他?

服务员与厨师对话的方式

对于 Keepalived 来说,选择了一个真实服务器后,后续还有两个流程需要梳理下

  • Keepalived 如何将请求转发给这个服务呢?
  • 服务处理完这个请求后,如何将处理结果返回给客户端?

上面两个流程就是 Keepalived 的路由方案要做的事。

Keepalived 有三种路由方案:NAT、TUN、DR。

2.2 配置在哪

具体的配置哪种路由方案在 keepalived.conf 配置文件中,其中有一个 lb_kind 配置,可以配置成 NAT、DR、TUN 三种。目前配置的是 DR 模式。

还有一个配置 lb_algo,这个是配置调度算法的,比如这里配置的 wrr 加权轮询调度算法。

2.3 LVS 的结构

上篇我们说到 Keepalived 是利用了 LVS 模块的功能来实现负载均衡的。那么 LVS 的结构是怎么样的呢?

分为两个模块:前端的负载均衡器(Load Balance,简称 LB),后端的多台真实服务器(Real Server, 简称 RS)组成。LB 负责流量转发,RS 负责处理请求,然后将请求返回。

三、深入理解 Keepalived 的路由方案

3.1 NAT 路由方案

NAT 的全称是 Network Address Translation,网络地址转换。它有两个功能:

  • 使企业内部的私有 IP 可以访问外网,
  • 使外部用户可以访问位于公司内部的私有 IP 主机。

对于 Keepalived 来说,这种模式就好比餐厅的标准下单上菜模式:多个服务员将订单数据转给传菜员,传菜员通知厨师进行烹饪,厨师把菜做好后转给传菜员,传菜员负责把菜传递给服务员。

如下图所示,LVS 负载调度器有两块网卡,配置了不同的 IP 地址,网卡 eth0 设置为公网 VIP 与外部网络连通,网卡 eth1 设置为私有 VIP 与内部网络通过交换设备相互连接,

示例如下:

eth0 网卡 -> 公网 VIP -> 外部网络
eth1 网卡 -> 私有 VIP -> 交换设备 > 内网网络

原理图如下所示:

① 比如现在 eth0 网卡配置了一个公有 VIP 如 10.1.2.88,客户端发送的请求都是到这个 Public VIP(目标地址)。

② 主 LVS Router 负责接收请求,将请求的目的地址(Public VIP)替换成 NAT VIP(192.168.56.88)。

③ 这个 NAT VIP 和后端服务器同属一个局域网,可以相互访问,请求经过负载均衡调度选择一个真实服务器。

④ LVS 修改数据包中的目标地址和目标端口为真实服务器的。

⑤ 真实服务器处理完请求后,将应答数据返回给 LVS Router。

⑥ LVS Router 将应答数据的源 IP 地址 NAT VIP 和端口转换成 Public VIP 和 LVS 的端口,然后转发给外部网络的客户端。

对于客户端而言,它只和 Public VIP 打交道,并不知道 NAT VIP,更不知道真实服务器的 IP 地址,这个过程也称为 IP 伪装。

对于服务员来说,她只和传菜员打交道,并不知道厨师‍ 。

1.2 LVS-TUN 路由方案

1.2.1 NAT 方案的瓶颈

如果餐厅的生意非常火爆,一个传菜员会非常忙,有可能厨师已经把菜做好了,但是传菜员没有时间传给服务员,那么餐厅的瓶颈就是传菜员了。

如下所示,一个传菜员对应三个厨师,而且做的菜很多,都需要传菜员将菜端给包间外的服务员。

NAT 的路由方案存在瓶颈,由于所有的数据请求及响应的数据包都需要经过 LVS 调度器转发,如果后端服务数量很多,客户端访问流量也很大的话,那么调度器会忙于调度转发和地址替换等操作。

为了解决 NAT 的性能问题,TUN 路由方案是个比较好的选择。TUN 方案中,真实服务器处理完结果后,直接返回给客户端。但是这就要求真实服务器能够与外部网络连接。

也就是说厨师做好菜后,厨师直接把菜递给服务员,不需要经过传菜员。厨师是对外可见的。

1.2.2 TUN 详解

TUN 其实是 tunneling(隧道)的缩写,而 TUN 路由方案就是基于 IP 隧道的一种技术。

我们熟知的 VPN 技术就是 IP 隧道技术。

IP 隧道其实是一种封装技术,将一个 IP 报文封装在另一个 IP 报文中。分为如下两步:

  • ① 先将原始数据包进行封装。
  • ② 然后添加新的源地址+端口、新的目标地址+端口。

它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

原理图如下所示:

TUN 模式的缺点:

隧道模式的RS节点需要合法 IP,这种方式需要所有的服务器支持 IP Tunneling 协议。

1.3 LVS-DR 模式

那么 LVS 的 TUN 路由模式有没有什么问题呢?

因为 TUN 的方式必须在 LVS 调度器和真实的服务器之间有一个隧道连接,这个创建隧道的过程会对服务器增加负担。

在餐厅这种场景中,TUN 模式中,厨师是对外可见的,菜好了后直接和服务员对接;而 DR 模式中,厨师不可见,统一被看成是传菜员。

DR 模式和 TUN 模式的相同之处:

  • 模式中,用户的请求被调度器负载均衡到真实服务器上,然后真实服务器把响应结果返回给客户端。
  • 客户端的请求数据包中目标 IP 为 LVS 的 VIP,源 IP 为客户端 IP。

DR 模式和 TUN 模式不同之处:

  • DR 模式要求调度器与后端服务器必须在一个局域网内。
  • DR 模式不需要创建 IP 隧道。
  • DR 模式中,VIP 需要在 LVS 调度器与后端所有的服务器间共享。
  • DR 模式中,真实服务器处理完结果后,返回数据包时,设置源 IP 为 VIP 地址,目标 IP 为客户端 IP。
  • DR 模式中,LVS 调度器和真实服务器在同一物理网段上。同一网段机器数量有限,限制了其应用范围。

更细节的内容

负载均衡器和RS都使用同一个IP对外服务但只有 DR(Director Server,可以理解为 LVS 的核心) 对 ARP 请求进行响应,所以 RS (Real Server,真实服务器)对本身这个 IP 的 ARP 请求保持静默。

也就是说,网关会把对这个服务IP的请求全部定向给 DR。而 DR 收到数据包后根据调度算法,找出对应的 RS,把目的 MAC 地址改为 RS 的 MAC(因为 IP 一致)并将请求分发给这台 RS 这时 RS 收到这个数据包,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

四、三种模式对比

推荐 DR 模式。

彩蛋一

有位读者朋友对上篇提出一个疑问:Keepalived 高可用上篇

主向备机发送的到底是 VRRP 还是 ARP 广播报文?

更正和解答上篇的内容:

(1)主向备机发送的 VRRP 协议的广播报文,传递了优先级字段。从源码这里可以看出。

1.发送 VRRP 广播的方法,传入了一个 vrrp 实体和 prio 优先级。

vrrp.c
vrrp_send_adv(vrrp_t * vrrp, uint8_t prio)

2.这个方法 vrrp_send_adv 是在下面这个地方调用的,prio 是 vrrp 的属性字段 effective_priority 传进去的。

(2)主向局域网内广播 ARP 请求分组,告诉局域网自己的 IP 地址和 MAC 地址。客户端就知道了主的 IP 地址和 MAC 地址。

(3)假如发生了主备切换,虽然 IP 没变,还是 VIP,但是 MAC 地址已经变了。客户端发送 IP 数据报时,从自己的 ARP 高速缓存中找到 VIP 对应的 MAC 地址,把 MAC 地址写入 MAC 帧,然后通过局域网把该 MAC 帧发往此硬件地址。

- END -

关于我

8 年互联网开发经验,擅长微服务、分布式、架构设计。目前在一家大型上市公司从事基础架构和性能优化工作。

InfoQ 签约作者、蓝桥签约作者、阿里云专家博主、51CTO 红人。

欢迎加我好友 passjava,提供技术解答、简历修改、500人技术交流群。

参考资料

https://weread.qq.com/web/reader/fae32ef072021a44fae8fe6k9a132c802349a1158154a83

https://weread.qq.com/web/reader/0e732d007260a7490e70173ke2e329c0261e2ef524fbf75

https://weread.qq.com/web/reader/36732010719ecf6b3676799kc8f3245027cc8ffe9a588b8

https://weread.qq.com/web/reader/634329b05930c06341b7d10k98f3284021498f137082c2e

https://blog.51cto.com/aklaus/1757735

暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案的更多相关文章

  1. 第2月第24天 coretext 行高

    1.NSMutableAttributedString 行高 NSMutableAttributedString *attributedString = [[NSMutableAttributedSt ...

  2. 做了2个多月的设计和编码,我梳理了Flutter动态化的方案对比及最佳实现

    背景 在端上为了提升App的灵活性, 快速解决万变的业务需求,开发者们探索了多种解决方案,如PhoneGap ,React Native ,Weex等,但在Flutter生态还没有好的解决方案.未来闲 ...

  3. Stack的三种含义 ----超级经典 明白了 栈 的三种含义

    来自:http://www.ruanyifeng.com/blog/2013/11/stack.html ----------------------------------------------- ...

  4. 2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller ...

  5. 弄明白kubernetes中的“三种IP”

    Node IP : Node节点的IP地址 Pod IP:Pod的IP地址 Cluster IP : Service 的IP地址 首先,Node IP是Kubernetes集群中每个节点(服务器)物理 ...

  6. 第五篇 CSS入门 明白 三种嵌套形式,三种常用控制器

    CSS入门 css是 层叠式样式表   css的作用是什么呢?举个抽象的例子啊,HTML是人,CSS则是衣服...   css给html穿上衣服,有三种形式: 内嵌.内联.外联. 这三种形式,优先级为 ...

  7. 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!

    写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...

  8. 4月26日 python学习总结 JoinableQueue、线程、三种锁

    一.进程队列补充-创建进程队列的另一个类JoinableQueue JoinableQueue同样通过multiprocessing使用. 创建队列的另外一个类: JoinableQueue([max ...

  9. 达人专栏 | 还不会用 Apache Dolphinscheduler?大佬用时一个月写出的最全入门教程【三】

    作者 | 欧阳涛 招联金融大数据开发工程师 02 Master启动流程 2.10 WorkFlowExecutorThread 里执行 Submit StandByTask 方法 SubmitStan ...

随机推荐

  1. Linux 环境变量配置的 6 种方法,建议收藏

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量 ...

  2. kubeadm高可用master节点(三主两从)

    1.安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 五台机器,操作系统 CentOS7.5+(mini) 硬件配置:2GBRAM,2vCPU+,硬盘30GB+ 集群中所有 ...

  3. Nginx实战|Nginx健康检查

    开源Linux 长按二维码加关注~ 上一篇:盘点提高国内访问Github的速度的9种方案 服务治理的一个重要任务是感知服务节点变更,完成服务自动注册及异常节点的自动摘除.这就需要服务治理平台能够:及时 ...

  4. MySQL实时在线备份恢复方案

    开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案. 当主库发生误操作时,只需要恢复备库上的快照 ...

  5. 面试官给我挖坑:rm删除文件之后,空间就被释放了吗?

    在Linux,你是不是曾经天真的以为,使用rm删除一个文件,占用的空间就释放了?事情可能不是常常如人意. 产生一个指定大小的随机内容文件 我们先看一下当前各个挂载目录的空间大小: $ df -h /d ...

  6. 【Docker入门】Docker的常用命令

    ​ ​ 了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同. 一.Docker启动类命令 1.启动docker:syste ...

  7. 上半年最中意的 GitHub 更新「GitHub 热点速览 v.22.21」

    2022 年的热点速览加入 GitHub 产品动态之后,这次的图片显示是最得我意的,因为可以提升图片查看人的看片体验.而 GitHub 社区方面,GitHub 官方发布了部分开源项目的新版本.与此同时 ...

  8. 详解TCP四次挥手(断开TCP连接过程)

    在讲述TCP四次挥手,即断开TCP连接的过程之前,需要先介绍一下TCP协议的包结构. TCP协议包结构: 这里只对涉及到四次挥手过程的字段做解释 (1) 序号(Sequence number) 我们通 ...

  9. 一些实验中用过的python函数/方法(持续更新)

    衡量运行时间 很多时候你需要计算某段代码执行所需的时间,可以使用 time 模块来实现这个功能. import time startTime = time.time() # write your co ...

  10. 前端 关于请求地址时出现乱码, 出现%E2%80%8B的问题

    做项目时,添加了新的一个接口,习惯性地复制了接口下来.然后测试发现 请求时自动添加 了几个%E2%80%8B这种乱码. 问题原因: 我输出请求地址时也是正确的,是因为复制过来的接口地址会有零宽空格 解 ...