我在 AWS 中设置了多个 VPC,并且我的所有实例都使用预置的 IP 地址,即 -不使用Elastic IP Addresses
.
当任何给定实例启动时,它会在机器上执行一个脚本(网络后),该脚本获取实例 ID、区域 ID(来自本地配置)和区域等 - 一旦它有了这些信息,它就会更新Route 53
以更新 DNS这些实例的私有托管区域中的信息。
这样做的原因基本上是为了让我可以将 DNS 用于服务器连接字符串。我的 Web 服务器和数据库服务器位于私有子网中,当 Web 服务器连接到数据库时,它只使用staticdns.mydomain.private
映射到实例私有 IP 地址的那个。这样,当实例重新启动或 IP 因其他原因发生更改时,它不需要进行大量的重新配置。
这一切都很好,而且它有效 - 有一个警告。新的 DNS 映射的解析存在延迟,我不确定它有多长 - 它不是很长,但它似乎有点随机(可能是 TTL?)。在解析器缓存旧IP的这段时间里,我们将收到从 Web 服务器到数据库的连接失败。我更希望这个缓存在更新时被释放,但我什至不知道在哪里搜索它。
有谁知道是否有办法在 Route 53 的专用区域内刷新 DNS 解析器缓存?我也尝试nscd
在服务器上使用,这似乎没有帮助。
几个选项和注释...
如果服务器位于同一个 VPC 或对等 VPC 中,则使用它们的私有 IP 进行通信,而不是公共 IP。当实例停止/重新启动时,私有 IP 保持不变。
nscd
旧记录缓存在主机上,而不是 Route 53 中。一旦一个 IP 发生更改,您就必须刷新所有其他主机的缓存,这需要大量自动化操作。除了一些应用程序和框架还在 nscd 之外缓存记录,因此在需要时很难刷新所有内容。您可以将 DNS 记录的 TTL 降低到 60(= 1 分钟),这意味着解析的记录不会被缓存超过一分钟。这与 AWS RDS 用于故障转移机制的方法相同。
使用网络负载均衡器 (NLB) - 即使服务器的实际 IP 发生变化,它也会为您的服务器提供稳定的 IP。然而,这实在是太矫枉过正了。
使用弹性 IP。那也可以解决你的问题。当附加到正在运行的实例时,它们不会产生任何费用。
使用 AWS RDS,可能是无服务器的Aurora,在不使用时几乎没有成本。所有的管理、故障转移等都将为您完成。