刷新 Google App Engine 中的 DNS 缓存

刷新 Google App Engine 中的 DNS 缓存

我们最近发现,在我们的数据库服务器(托管在 Aiven)进行定期维护期间,Google App Engine 应用程序无法正确进行故障转移。

在计划维护期间,数据库服务器将通过更新 DNS 记录将故障转移到替代服务器。这应该是即时的,但我们发现在 GAE 中运行的节点应用程序因连接失败而崩溃了几分钟。

连接错误被视为硬错误,因此节点应用程序退出,然后立即通过再次运行 npm start 替换为新进程。但是,此进程也失败了,因为它也无法连接,依此类推,直到 GAE 认为服务器有问题并替换它。

当实例被替换时,连接问题似乎已经解决,但我不清楚为什么需要这么长时间才能解决。

我怀疑旧的数据库主机名可能已被缓存,因此它无法再尝试连接到旧的 IP。

作为一种解决方法,我想知道是否可以刷新 Google 应用引擎实例上的 DNS 缓存(从实例内部)?

我查找了有关 App Engine 如何解析 DNS 的文档,但最终却找到了有关设置自定义或内部 DNS 的页面。

总结一下:我们在 GAE 上运行的节点应用程序正在连接到外部托管的数据库,并通过 DNS 查找来识别主机。

因此,我需要刷新的缓存是缓存公共 DNS 记录查找的缓存不是托管在 Google 上,但由 GAE 应用程序请求。

IE:

Node GAE App -> { Public Internet } -> Database

答案1

我认为解决方案应该是进行一些架构修改。

作为 PaaS,您没有太多访问权限来运行 GAE 来运行某些管理操作。

基于此,我建议进行以下架构变革:

  1. 为正在运行的数据库服务器使用虚拟 IP,并在故障转移时在服务器之间切换。DNS 将仅映射到虚拟 IP。

或者

  1. 验证 DNS 记录的 TTL,并将其缩短为可以等待 DNS 复制的最短时间,例如 60 秒。问题是机器将更频繁地访问 DNS 服务器。

或者

  1. 在数据库服务器前面放置一个负载均衡器,并在故障转移时更改负载均衡器映射。DNS 将映射到负载均衡器。

相关内容