大家好,又见面了,我是你们的朋友全栈君。
GSLB,全局负载均衡(Global Server Load Balancing ),主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)。是对物理集群的负载均衡,不止是简单的流量均匀分配,还会根据应用场景的不同来制定不同的策略。本文将讨论 GSLB 的几种实现,并介绍调度服务实现的大体情况。
DNS 是一个分布式数据库,提供了主机名和 ip 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。
域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。

一个完整的DNS解析过程如下:

通过 DNS 调度的方式,对不同地域的请求返回不同的解析结果,将请求调度到离用户最近的服务器节点,从而减少延迟访问。

这种调度方式对原有的业务侵入性不大,实现起来简单方便,那么为什么没有使用这种方案?接下来说下这种方式的弊端。
DNS 调度是根据本地 DNS 服务器来进行 ip 定位的。因此 DNS 调度有一个前提:假定用户使用的缓存 DNS 与用户本身在同个网络内,在该前提下,DNS 的解析才是准确的。通常情况下,用户使用 ISP 提供的本地缓存(简称 local DNS),local DNS 一般与用户在同个网络内,这时候 DNS 调度是有效的。
但近些年,不少互联网厂商推广基于 BGP Anycast 的公共 DNS (Public DNS),而这些 Anycaset ip 的节点一般是远少于各个 ISP 的节点,例如可能广州电信用户使用了某公共 DNS,但该公共 DNS 里用户最近的是上海电信节点,甚至更极端的如 Google DNS 8.8.8.8,在中国大陆没有节点(最近的是台湾)。而不幸的是国内有不少用户使用了 Google DNS,这其实降低了他们的网络访问体验。总的来说,使用公共 DNS,实际上破坏了上文的前提,导致 DNS 区域调度失效,用户以为得到了更快更安全的 DNS 解析,但实际得到了错误的解析,增加了网络访问延迟。 传统 DNS 协议的区域调度过程示例如下图,假定某业务以 foo.163.com 对外提供服务,在北京和东京各有一个节点,业务期望国内大陆的用户访问北京节点,而非大陆用户则访问东京节点。因为权威是根据 DNS 缓存来决定返回的结果,所以当用户使用不同的 DNS 缓存时,可能会解析到不同的结果。

如果 ip 定位不根据 local DNS 的 ip 来定位,取而代之用原始请求的 ip 来定位不就能解决这个问题了吗?
2011 年,Google 为首的几家公司在提出了一个 DNS 的扩展方案 edns-client-subnet (以下简称 ECS),该扩展方案的核心思想是通过在 DNS 请求报文里加入原始请求的 ip(即 client 的 ip),使得权威 DNS 服务器能根据该信息返回正确的结果。目前,该方案仍处于草案阶段。该方案很好地解决了上述提到的 remote DNS 导致解析不准确的问题。但是这种方案需要权威 DNS 服务器和 local DNS 的支持才能工作,推广难度大。

local DNS 会缓存域名解析结果,域名变更到生效存在延迟。
使用 http 重定向 将内容转发到不同位置。

这种方案的局限性如下:
调度服务是一个供外部(客户端、sip)获取边缘服务的一个服务。返回的服务 ip 列表遵循就近接入,负载均衡的原则。通过客户端 sdk + 调度服务完成 GSLB 设备的功能。

这种方式让客户端有了负载均衡知识,服务端也获取到了任何想要知道的信息,从而可以做到更全面的解析策略。但是侵入性是最大的,因为客户端对 GSLB 是有感知的,且需要适配支持。
scheduler.support.geo meta信息相匹配的边缘服务列表scheduler.support.geo meta信息相匹配的边缘服务列表根据服务上报到发现服务 weight 字段,权重值大的优先级越高,排序越靠前。
通过调度策略服务将某个边缘服务置为下线状态后返回的边缘服务列表中将踢出该服务,也就是说调度策略服务会停止引流到该服务上。
scheduler.overload=true 的 meta 信息来让调度服务返回服务列表过滤掉该服务scheduler.overload=false 或者移除该 meta 信息来解除过载发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132018.html原文链接:https://javaforall.cn