如何模拟 "serverless" Cloud SQL?

How can you simulate "serverless" Cloud SQL?

问题: 云 SQL 实例 运行 无限期且托管成本高。

目标:在不影响数据库可用性的情况下节省资金。

已经快四年了,Google Cloud 还没有满足这个已经在 AWS 上用他们的 Aurora RDS 实现的功能请求。

由于自动缩放到零的按需云 SQL 似乎不会很快出现,以下策略是否有效?

  1. 拥有 Cloud SQL、一个 Baby 和一个 Papa 实例。他们遵循 master/slave 副本原则,但有所不同。宝宝 实例很小,只有很少的 vCPU 和低内存,它总是 运行s,但是 这样做很便宜。但是,Papa 实例昂贵,具有高 vCPU 和高 内存,但 运行 仅在需要时使用。
  2. 首先,只有 Baby Cloud SQL 实例是 运行ning,因此接受 reads/writes 的是主实例。 Papa Cloud SQL 实例未 运行ning。
  3. 由于我使用的是标准应用引擎 将在没有流量的情况下自动缩放到零,安排一个 cron 作业 如果不存在应用引擎实例,则每 10 分钟检查一次。在这种情况下, 该应用程序没有流量。如果不是这种情况,则启动 Papa Cloud SQL 实例。一旦启动,Papa 实例 成为接受 reads/writes 的主人,而 Baby 实例 成为只能读取的从属副本。
  4. 如果 cron 作业检测到应用引擎的实例为零 运行ning,这意味着没有流量。因此,Papa Cloud SQL 实例是 停止并且 Baby Cloud SQL 副本被提升为主副本并且可以接受 reads/writes.
  5. 这样,昂贵的Papa实例运行就可以按需使用了。如果有交通 当 Papa 实例停止或重新启动时出现尖峰,Baby 实例仍将能够响应请求。

此策略可确保昂贵的 Papa Cloud SQL 实例仅 运行 具有流量。 这个 Baby-Papa 动态是否可以在 Google Cloud 上实现?

Cloud SQL 有一个 Admin API that can be used to manipulate your Cloud SQL instances in such a way. You could build pieces of what you are describing using Cloud Scheduler to trigger a Cloud Function,它使用 API 启动和停止实例,甚至 promote/demote 掌握它们。

但是,这可能不是个好主意。这些操作可能需要几分钟才能完成,并且会大大增加请求的冷启动时间。此外,SQL 服务器更喜欢长 运行ning 是有原因的 - 它们使用资源来缓存和优化查询以提高性能。启动、停止和调整实例大小可能会导致您失去这些好处。

最好考虑一下——你真的需要关系数据库吗?如果没有,最好使用像 Firestore 这样的无服务器产品。

如果您确定您确实需要关系数据库,您能否优化您对较小云 SQL 实例的使用?您能否使用上面列出的 Memorystore 或 Firestore 来缓存查询,或者使用我上面描述的服务来定时导出结果,这样您的应用程序更容易使用?

在没有流量时启动和停止您的 Cloud SQL 实例会更好吗?如果您的流量基于某些可预测的时间,您可以安排您的实例在这些时间段的开始和停止时调整大小。

最后,如果成本确实是一个选项,您可以在 GCE 实例上 运行 您自己的 SQL 服务器。这意味着您必须自己完成几乎所有的管理工作(安装、更新、维护等),但这样会更便宜。

与尝试硬塞非无服务器基础设施来匹配无服务器工作负载相比,所有这些可能都是更实用的解决方案。