如何实现多数据中心流量调度
1. 需求场景
目前互联网的服务普遍都部署在数据中心(Data Center)内。数据中心是一个很复杂的系统,涉及到供电、制冷、供水等一系列的环节。由于设备故障、供电故障和自然灾害等因素,数据中心也可能出现故障。从服务的高可用角度,一般需要将服务部署在多个数据中心内,以便在数据中心出现故障的情况下,仍然保证服务的持续提供。
在多数据中心场景下,需要考虑网络流量如何在多个数据中心之间调度。如下图所示,有2个数据中心,每个数据中心内都部署了相同的服务(分别命名为服务1和服务2)。每个数据中心各有一个网络接入点。下面要解决的问题是如何将用户流量在多个数据中心部署的服务间做调度。
图1 多数据中心场景下的流量调度
2. 基于DNS的调度方案
2.1 方案说明
在多数据中心调度方面,目前比较普遍采用的是基于智能DNS的方案。工作原理如下图所示。
每个数据中心的接入点有不同的VIP(分别为1.1.1.1和2.2.2.2)。客户端在向服务发送请求前,首先通过智能DNS将域名(www.demo.com)解析为IP地址。智能DNS根据待解析的域名和客户端的IP地址(3.3.3.3),基于设置的解析策略,返回解析的结果(1.1.1.1)。
在每个数据中心内,发往这个数据中心接入点的请求都仅由同数据中心内的服务来处理。在下图中,发往1.1.1.1的请求仅由服务1来处理,发往2.2.2.2的请求仅由服务2来处理。
图2 在多数据中心场景下应用智能DNS
如果数据中心发生了故障(如:接入点1发生了故障,或服务1发生了故障),可以通过改变智能DNS的策略,将2.2.2.2返回给客户端,从而将用户流量从数据中心1中的服务1调度到数据中心2中的服务2。
图3 基于智能DNS实现故障切换
2.2 方案的问题
虽然基于DNS的多数据中心调度方案已普遍采用,但是这个方案也存在着非常明显的问题。方案的问题包括:
(1) 生效速度慢。DNS采用缓存机制,在客户端和客户端直接访问的Local DNS(位于客户端所处的网络或运营商内)内一般都有缓存。缓存可以降低客户端对于权威DNS和Local DNS的访问压力,但同时也增加了生效的延迟时间。例如,如果在权威DNS中将TTL设置为5分钟,则最终的生效延迟会达到8-10分钟。还可能存在有故障或不遵循DNS TTL的Local DNS,从而导致对应的用户使用更长的时间完成切换,甚至一直都不切换。
(2) 控制精度低。对于智能DNS的期待,是可以比较精确的控制到达各数据中心接入点的流量。但这个目标是无法实现的。这一方面是由于上文所提到的DNS缓存机制,客户端在每次DNS解析后发送的请求数量不确定;另一方面,在DNS解析的过程中存在Local DNS,权威DNS无法判断每个Local DNS所代表的用户规模。
图4 权威DNS难以判断Local DNS代表的用户规模
3. 基于七层负载均衡的调度方案
为了解决基于DNS的调度方案中所存在的问题,可以在转发的过程中引入七层负载均衡系统(如BFE)。
3.1 方案说明
图5 引入七层负载均衡系统后的调度方案
具体的方案如上图所示。在各数据中心内各部署一个BFE集群。BFE可以按照指定的权重,将流量转发至多个后端集群。
这个方案要求在多个数据中心之间有较好的内网互联。在同城的多个数据中心之间,这个条件是比较容易满足的。并且在同城内,数据中心之间的网络延迟可以控制在1-2ms内,对于转发整体的网络延迟影响也不大。
对于位于不同地域的多个数据中心,如果在数据中心直接有比较好的内网互联,也可以利用七层负载均衡做内网调度;如果没有充足的内网互联,只能继续使用基于DNS的调度方案。
3.2 方案的收益
和只使用DNS的方案相比,在引入七层负载均衡系统后,可以获得如下收益:
(1) 生效速度快。多集群间分流的权重配置在BFE加载后,可以立刻生效。这相比DNS的分钟级延迟有了巨大的提高。而且相比于DNS方案中Local DNS的不可控性,BFE的集群完全在服务提供方的控制之下。
(2) 控制精度高。在引入BFE后,转发至后端服务集群的流量可以精确的按照给定的权重来控制。这为后端服务的容量管理和压力过载场景下的处置提供了便利。
4. 应用场景说明
下面结合几个具体的场景,说明七层负载均衡如何在多数据中心流量调度中发挥作用。
4.1 场景1:服务故障
在某些场景下(如服务的灰度发布),可能出现单个数据中心内的服务出现故障,从而导致服务容量下降甚至完全无法提供服务。这时可以调整BFE上的分流权重,将流量调度到其它数据中心,快速完成止损处理。
图6 服务故障场景下的处理
4.2 场景2:外网流量突增
可能出现某个地区的用户流量突增,导致单个数据中心内的服务压力超过容量。这时可以将部分流量调度到其他子集群来服务。
图7 外网流量突增场景下的处理
4.3 场景3:外网故障
在外网故障的场景下,会在外网通过DNS将部分流量从一个网络接入点调度到另外一个网络接入点。这样可能会导致另一个数据中心内的服务(下图中的服务2)压力超过容量。这时可以将部分流量调度到服务1来服务,以降低服务2的压力。
图8 外网故障场景下的处理
5. 延伸阅读
本文说明了在多数据中心场景下如何通过使用七层负载均衡系统BFE来实现更好的流量调度效果。有兴趣的读者,可以阅读以下材料进一步了解:
(1) BFE多服务间分流权重比例的配置。可以查看《万亿级流量转发:BFE核心技术与实现》的第11章,或《深入理解BFE》(在线版本)的第21章。
(2) BFE多服务间负载均衡的实现机制。可以查看《万亿级流量转发:BFE核心技术与实现》的第14章,或《深入理解BFE》(在线版本)的第32章。
欢迎关注“BFE开源项目”公众号,获得本项目的更多更新。谢谢!
BFE开源项目2021年回顾和致谢
BFE开源项目阅读 993
深入剖析容器网络和 iptables
张晋涛赞 3阅读 1.3k
CodeGalaxy 推出轻量集群,可在云主机上一键搭建 K8s
韩天峰赞 2阅读 422
vivo 云原生容器探索和落地实践
vivo互联网技术赞 2阅读 670
企业流程数字化转型研讨会暨《流程优化风暴》新书发布会 即将召开
MissD阅读 4.8k
各开发语言DNS缓存配置建议
京东云开发者赞 3阅读 382
成为一名k8s专家需要掌握哪些知识?当我读完k8s源码之后总结
ning1875赞 1阅读 1.8k评论 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。