首页 > 解决方案 > 谷歌云sql在重负载下窒息

问题描述

首先,我想我应该提供一些背景知识。

我们有一个在 nodejs 中运行的 https api,它使用 koa2 框架来处理任何传入的请求。这是在具有 2 个 vCPU 和 9GB 内存的 Compute Engine 上运行的。

然后,它通过私有 IP 地址连接到 Cloud SQL,并连接到 Postgres v9.6 数据库。它运行 4 个 vCPU、15GB 内存和 500GB 固态硬盘(目前我们的空间使用量为 259GB)。

我们有数千个天气和土壤监测站通过 FTP 将数据发布到我们的 GCE(我知道,我正试图让他们逐步淘汰),然后使用 PHP 脚本读取数据并将其泵入数据库。这每隔 15 分钟到几个小时就会发生一次。

我们现在还有大约 300 个站,它们将 json 请求推送到 api 以摄取数据。这种情况每 2 小时发生一次。这就是它变得棘手的地方。

api 每隔 2 小时就会像狗一样运行,几乎无法使用。正因为如此,它也导致 300 个站随机超时而不发送数据,然后在下一个周期它尝试上传 4h 的数据,然后再次随机超时,因此循环重复。

这个端点做了两件事

  1. 通过数据库验证 jwt 令牌
  2. 记录要运行的 Google Tasks 作业(google tasks 作业获取有效负载并将其插入数据库(使用更新或插入))

在此期间,我通过运行多达 4 个集群 api 服务器脚本进行了检查,但没有任何效果,这让我认为它不是 api,而是更多的数据库。

我们可以使用 npm 包来复制问题loadtest -c 50 --rps 200 http://localhost:9092/v3/integrations/inbound

这给了我们(这是我们的日志,而不是来自 loadtest 的日志)

[2020-07-07 22:00:42][INFO] '[POST][200] /v3/integrations/inbound {6715ms}'
[2020-07-07 22:00:43][INFO] '[POST][200] /v3/integrations/inbound {7633ms}'
[2020-07-07 22:00:44][INFO] '[POST][200] /v3/integrations/inbound {8447ms}'
[2020-07-07 22:00:45][INFO] '[POST][200] /v3/integrations/inbound {9519ms}'
[2020-07-07 22:00:46][INFO] '[POST][200] /v3/integrations/inbound {10531ms}'
[2020-07-07 22:00:47][INFO] '[POST][200] /v3/integrations/inbound {11530ms}'
[2020-07-07 22:00:48][INFO] '[POST][200] /v3/integrations/inbound {11927ms}'
[2020-07-07 22:00:48][INFO] '[POST][200] /v3/integrations/inbound {12704ms}'
[2020-07-07 22:00:49][INFO] '[POST][200] /v3/integrations/inbound {13344ms}'
[2020-07-07 22:00:49][INFO] '[POST][200] /v3/integrations/inbound {13694ms}'
[2020-07-07 22:00:50][INFO] '[POST][200] /v3/integrations/inbound {14532ms}'
[2020-07-07 22:00:51][INFO] '[POST][200] /v3/integrations/inbound {15620ms}'
[2020-07-07 22:00:52][INFO] '[POST][200] /v3/integrations/inbound {16557ms}'

你可以在这里看到响应时间很长。删除身份验证检查会降低很多

[2020-07-07 22:08:13][INFO] '[POST][200] /v3/integrations/inbound {82ms}'
[2020-07-07 22:08:27][INFO] '[POST][200] /v3/integrations/inbound {59ms}'
[2020-07-07 22:08:27][INFO] '[POST][200] /v3/integrations/inbound {160ms}'
[2020-07-07 22:08:27][INFO] '[POST][200] /v3/integrations/inbound {100ms}'
[2020-07-07 22:08:27][INFO] '[POST][200] /v3/integrations/inbound {157ms}'
[2020-07-07 22:08:27][INFO] '[POST][200] /v3/integrations/inbound {171ms}'
[2020-07-07 22:08:28][INFO] '[POST][200] /v3/integrations/inbound {189ms}'
[2020-07-07 22:08:28][INFO] '[POST][200] /v3/integrations/inbound {329ms}'
[2020-07-07 22:08:28][INFO] '[POST][200] /v3/integrations/inbound {264ms}'
[2020-07-07 22:08:28][INFO] '[POST][200] /v3/integrations/inbound {396ms}'
[2020-07-07 22:08:29][INFO] '[POST][200] /v3/integrations/inbound {313ms}'
[2020-07-07 22:08:29][INFO] '[POST][200] /v3/integrations/inbound {449ms}'
[2020-07-07 22:08:30][INFO] '[POST][200] /v3/integrations/inbound {457ms}'
[2020-07-07 22:08:30][INFO] '[POST][200] /v3/integrations/inbound {453ms}'

这并不能解决问题,因为我们需要它来进行身份验证,此时 api 仍然会受到攻击并且仍然很慢。

我还应该注意的是,在 GCE 和 GSQL 上,我们都没有办法使用任何资源。

我们不知所措,谁能帮忙,或者有什么建议?

谢谢大家

标签: postgresqlgoogle-cloud-platformgoogle-compute-enginegoogle-cloud-sqlkoa2

解决方案


推荐阅读