DNS及其工作方式可能伴随着IT的更多方面的误解,传说,迷信和神话。
即使是当我们谈论变化的“传播”时,那些知道我们本质上在撒谎(或至少大大简化)的人,仍然倾向于使用该术语来描述-同时-极其简单明了的事物。仍然难以解释...并且与传播本身无关,但是与缓存和否定缓存有关,这两者都是系统工作方式的基本组成部分(并且可以说,它如何避免在以下情况下彻底崩溃)重量)-本质上是由内而外,与实际的“传播”相反,即为拉力-而非推力。
对于所有有关短TTL的担忧和烦恼,它们往往更常工作,以至于简单尝试一下可能符合您的利益。在$ {day_job},当我们的站点从“旧”平台迁移到“新”平台时,通常意味着它们的迁移方式是不共享基础结构中的任何内容。我进行此类迁移的第一步是在切割前将TTL降低到60s,以使旧TTL具有自身的多个倍数以耗尽,从而为我提供了合理的保证,即这些带有短TTL的过渡RR将“传播” ”。当我准备好进行削减时,我将重新配置旧的平衡器¹,以通过Internet限制到新系统的流量,以使平衡器不再平衡多个内部系统,而是“
然后我切换DNS,并观察新的平衡器和旧的平衡器。
我总是对过渡发生得如此迅速感到惊讶。阻碍似乎几乎总是搜索蜘蛛和第三方“健康检查”站点,这些站点莫名其妙地锁定了旧记录。
但是,有一种情况可以预见地崩溃:当用户的浏览器窗口保持打开状态时,它们往往会锁定到已发现的地址,并且该地址通常会一直持续到关闭所有浏览器窗口为止。
但是,在上面的叙述中,您找到了解决问题的方法:“负载平衡器”(具体地说,更准确地说是反向代理)可以是您公开的DNS记录指向的系统。
然后,反向代理将请求转发到正确的目标IP地址,它使用第二个带有短TTL的“虚拟”主机名进行解析,该主机名指向真实的后端服务器。³因为代理始终在该主机上接受DNS TTL虚拟DNS条目,可以确保快速,完整地切换。
不利的一面是,您可能通过不必要的额外基础结构路由通信,或者为跨多个网络边界的传输支付了多余的冗余。
有一些服务可以在全球范围内提供这种功能,而CloudFront是我最熟悉的服务。(Cloudflare很有可能会达到完全相同的目的,因为我所做的少量测试表明它也可以正常运行,并且我敢肯定还有其他功能。)
尽管CloudFront主要以CDN的形式销售,但它的核心是全球反向代理网络,可以选择性地缓存响应。如果将www.example.com
指向CloudFront的点和CloudFront配置为将这些请求转发到backend.example.com
,并且DNS记录backend.example.com
使用短TTL,则CloudFront将做正确的事,因为它确实遵守了该短TTL。当后端记录更改时,流量将在TTL耗尽时全部迁移。
指向CloudFront的前端记录上的TTL,以及浏览器和缓存解析器是否尊重它都是不重要的,因为对后端目标的更改不需要更改www.example.com
记录...因此,“ Internet”的概念www.example.com
无论后端系统碰巧在何处,对于正确的目标而言,它始终是一致的。
对我来说,这可以通过使浏览器无需“跟随”对原始服务器IP的更改来完全解决问题。
tl; dr:将请求路由到充当真实Web服务器代理的系统,以便仅代理配置需要适应原始服务器IP的更改-而不是面向浏览器的DNS。
请注意,CloudFront还通过强加在前端的一些DNS魔术来最大程度地减少延迟,从而www.example.com
根据查询的浏览器的位置将其解析为最佳的CloudFront边缘位置www.example.com
,因此,流量通过不必要的circuit回路由的可能性很小从浏览器到边缘再到起源……但这部分是透明,自动的,不在问题范围之内。
而且,当然,通过减少原始服务器或传输上的负载,内容缓存也可能很有价值-我已经在CloudFront上配置了原始服务器位于ADSL电路上的网站,而ADSL固有地受到上游带宽的限制。CloudFront连接以获取内容的原始服务器不必是AWS生态系统内的服务器。
¹我将平衡器称为单个实体,而实际上它具有多个节点。当平衡器是ELB时,平衡器后面的机器将充当虚拟应用服务器,并实际发动到新平台的平衡器,因为ELB不能自己做到这一点。
²新平衡器对旧平衡器的唯一了解是,它需要信任旧平衡器的X-Forwarded-For,并且不应对旧平衡器的源地址进行任何基于IP的速率限制。
³当代理是您控制的一台或多台服务器时,您可以选择跳过在背面使用DNS,而仅在代理配置中使用IP地址,但是随后讨论的托管/分布式方案需要第二层DNS 。