AliDNS(www.alidns.com) 近期上线。看到同事说更换 local DNS 后,访问淘宝明显快了。以我当前的理解能力,认为无非是快在 DNS 解析这一步上,缩短的时间应该在毫秒级别,而 浏览器 与 淘宝 集群之间的延时应该不会有变化。但试了后,果然明显感觉变快了。好奇心驱使,学习了下 Anycast 技术。当然,AliDNS 还采用了集群缓存共享的设计(memcached  or tair) 以减少 cache miss,能缩短 IP 解析的延时,这也是访问变快的原因之一。

    学习 IPv4 的时候接触过 Unicast 和 Multicast(这个好理解),而学习 IPv6 的时候多了个 Anycast 的概念,但说实话,当时并没有真正理解啥叫 Anycast。好吧,不管怎样,概念性的东西先来上一段。

    “在 IP 网络上,通过一个 Anycast 地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如 DNS 或者镜像服务),访问该地址的报文可以被 IP 网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务。”

    如果上面这段话需要看两遍以上才能理解,那我可以说得简单一点,比如说 VIP。VIP 集群内是一组“提供特定服务的主机”,浏览器并不关心具体是哪台服务器在提供服务,报文被 LB 设备分发到其中某一台服务器上(对应:报文可以被 IP 网络路由到这一组目标中的任何一台主机上)。

    不同点有2:

    1. VIP 依靠 LB 设备实现分发,Anycast 依靠路由器

    2. VIP 带状态,同一个连接必须分发到同一台后端服务器,而路由器目前无法做到,所以仅适合 DNS 这类无状态的协议

   正是因为依靠路由器就能实现 Anycast,所以无需购买额外的硬件设备。但是玩过 Anycast 的人很少,是因为Anycast 必须配合 BGP,而有能力玩 BGP 的可都是高富帅啊!

    既然在玩 BGP,那就肯定有多个 AS。在每个 AS 内部署相同的集群,对外提供相同的服务,且各个 AS 对外宣告相同的 IP。如此配置之后,用户就会优先访问离自己路由最近的节点。之前必须到 3 个路口之外的店里买水果,现在变成了每个路口都有一个一模一样的水果店,能不快吗?

    当然,回到 AliDNS,使用 Anycast 仅能确保用户找到最近的 DNS 服务器,再加上集群缓存共享的因素,无疑会缩短了 DNS 解析的延时,但并不能确保访问 淘宝 变快。实际上,这里有另外一段逻辑:

wKiom1OVefag09jDAAVKHREzsMM090.jpg

    1. 一级 cache 集群由对外做 Anycast 发布一对vip(这里是223.5.5.5 和223.6.6.6),用户配置此 vip 为自己的 local dns 服务器。

    2. 一级 cache 得到用户请求后,先从自己的内存里面查看是否有结果,如果没有则将请求按照用户所属网络运营商类别,将请求转发到该运营商网络的二级 cache 服务器集群的 vip 上。

    3. 接下来二级 cache 服务器在自己所在集群中查找是否已经缓存结果,如果整个二级 cache 服集群都没有有效的缓存结果,则由此 cache DNS 服务器发起递归请求,等到结果返回后,存入此二级 cache 集群里面,由于此 cache dns 和用户属于同一个运营商,从而得到的结果是 CDN 友好的结果,然后此结果返回给一级 cache dns,一级 cache dns 进行本机缓存后再返回给客户端,客户端就得到了cdn 友好的结果。

    http://www.alidns.com/tech/ali-pub-dns-introl.html

    因此,关键的原因,在于得到了 CDN 友好的 IP。

    再补充一些 Anycast 的优缺点:

    1. Anycast 地址不能作为源地址。显然,不能保证回复报文能原路返回。

    2. 安全性问题,非法服务器可以使用假的 Anycast 地址声明服务,而实际上并不提供服务,也就造成了 DOS。

    优点:

    1. DDOS。当某个 AS 提供的服务被***时,路由器可以将报文路由到其它的 AS 上。

    2. 故障 or 网络拥塞。同上。

    不过我的疑问是,路由器如何得知服务出现异常? LB 设备都有的健康检查服务,难道路由器上也有?

    补充 Anycast 的实现: