OVN HA GW based BFD

OVN HA

Gateway 领导权重分配

有时网关可能是健康的,但仍然可能不适合领导 HA 集群。这可能有几个原因,包括:

  • underlay 物理网络不可达
  • BFD(或ping)检测到下一跳路由器不可达。处理步骤
  • 网关刚启动并且没有完全配置

在这种情况下,网关应该通过使用 other_config:cpath_down 标志使其隧道保持 down,从而放弃领导权。这向参与的管理程序和网关表明,即使其隧道仍然正常,也应将此网关视为已关闭。

也就是说,OvS 所设计的 HA chassis group 方案是基于 BFD,应该能够同时检查 tunnel 和 underlay (到网关)的可达性。这两者网络联通必不可少的。

主备方案(从一个router的视角看,router 出去的流量只能到一个网关)

在理想情况下,所有流量将在活动的网关集之间平均分配。要做到这一点有点棘手,但作为一个方向,可以使用"路由器特定的活动-备份"(Router Specific Active-Backup)算法。这个算法在每个逻辑路由器的基础上看起来很像活动备份,只是有一点不同。它为每个逻辑路由器选择一个不同的活动网关。因此,在有多个逻辑路由器的情况下,所有路由器都具有一定的负载均衡,该算法的性能更好。

如果构建在基本的独立于控制器的活动备份之上,则此策略的实现非常简单。 在每个逻辑路由器的基础上,算法是相同的,领导权是由网关的活跃度决定的。 这里的关键区别在于网关必须对每个逻辑路由器具有不同的领导权优先级。 这些领导权优先级可以通过 ovn-north 计算,就像它们在独立于控制器的 active-backup 模型中一样。

一旦我们有了这些逻辑路由器优先级,就只需要将它们传递给网关集群的成员和管理程序。特别是,管理程序只需要为每个逻辑路由器提供一个主备(切换)bundle操作(或 group操作),按优先级顺序列出该路由器的网关,而不是为所有路由器共享一个 bundle 操作。

此外,需要更新网关以考虑各个路由器的优先级。具体来说,每个网关应该丢弃它正在运行的备份路由器的流量,并转发活动网关的流量,而不是简单地丢弃或转发所有内容。这应该通过让 ovn-controller 为网关重新计算 OpenFlow 来完成,尽管存在其他选项。

最后一个复杂的问题是,必须更新 ovn-northd 的逻辑,以便以更复杂的方式选择每个逻辑路由器的领导优先级。它选择什么算法来做这件事并不重要,除此之外,它应该在一般情况下提供良好的平衡。也就是说,每个逻辑路由器的优先级应该足够不同,即使发生故障,路由器也应该平衡到不同的网关。

主主方案

在主备设置中,用户将遇到的一个问题是网关领导抢占。如果一个新的网关被添加到集群中,或者由于某种原因重新启动了一个现有的网关,我们最终可能会遇到这样一种情况,即新激活的网关具有比 HA 集群中任何其他网关更高的优先级。在这种情况下,只要该网关出现,它就会从当前活动的领导中抢占领导,从而导致不必要的故障转移。由于故障转移可能非常昂贵,因此这种抢占可能是不可取的。

(如果一开始就确定了集群规模,和网关规模,其实也是一个好实践。)

控制器可以通过巧妙地调整领导优先级来避免抢占。对于每个路由器,应该为新网关分配优先级,使它们在最终出现时排在第二位或更晚。此外,如果一个网关宕机了很长一段时间,那么它的旧的领导优先级应该被撤销,而新的应该被分配,就好像它是一个全新的网关一样。请注意,只有在网关关闭一段时间(几分钟)后才会发生这种情况,否则网关震荡可能会产生广泛的、不可预测的后果。

注意,根据部署,避免抢占应该是可选的。为了满足这些需求,必须牺牲最佳负载平衡,因为新网关在启动时将没有流量。因此,这个特性代表了必须在每次安装的基础上进行权衡。

L3 HA 的最后一步是实现真正的双活 HA。在这种情况下,每个路由器在每个网关上都有一个实例,并且使用类似于ECMP 的机制在所有实例之间均匀分配流量。这种机制将要求网关参与物理网络的路由协议,以吸引流量并发出故障警报。它超出了本文的范围,但最终可能是必要的。

OVN HA 逻辑设计要点

在设计上,所有 gw 之间的检测是基于 BFD的,gw 一开始是有设置权重的。检测到 gw 状态异常(上述两个链路必须都是通的),就会把 gw 状态设置为 down。

这个设置为 down 的动作,不是在控制面,而是在转发面。只是整个 HA 策略,是控制面拉起的时候下发的。

这个设计本质上依然是符合转控分离原则的,即使控制面挂了,转发面依然可以正常使用很长一段时间。

相关推荐
聚集的流星30 分钟前
初识go语言之指针用法
开发语言·后端·golang
风生水气2 小时前
Supabase:帮助快速构建应用后端的BaaS服务
后端
ss2734 小时前
基于Springboot + vue实现的贸易行业crm系统
vue.js·spring boot·后端
Ai 编码助手5 小时前
Go语言如何实现限制用户 1 分钟内最多请求 1000 次?
开发语言·后端·golang
zzyh1234565 小时前
搭建springcloud脚手架
后端·spring·spring cloud
customer085 小时前
【开源免费】基于SpringBoot+Vue.JS夕阳红公寓管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Edward-tan6 小时前
【玩转全栈】----Django模板的继承
后端·python·django
汪子熙6 小时前
深入解析 npm ci 的运行原理及其在 Angular 项目中的应用
javascript·后端
SomeB1oody6 小时前
【Rust自学】13.8. 迭代器 Pt.4:创建自定义迭代器
开发语言·后端·rust