postgresql - 谷歌云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 的数据,然后再次随机超时,因此循环重复。
这个端点做了两件事
- 通过数据库验证 jwt 令牌
- 记录要运行的 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 上,我们都没有办法使用任何资源。
我们不知所措,谁能帮忙,或者有什么建议?
谢谢大家
解决方案
推荐阅读
- amazon-web-services - 获取使用 Lambda - Node.js 调用 AWS HTTP API 的 URL
- python - 根据特定列合并多个 CSV 文件 - Python
- visual-studio - 无法安装 node-sass
- xamarin.forms - Listview 不更新自定义 dataTemplate xamarin Groupheadertemplate
- python - 字符串列表中出现的字符串的双重列表理解
- reactjs - 如何使用 DynamoDB 后端实现 React 分页前端
- facebook - Flutter:无法同时使用 Google 和 Facebook 插件
- kubernetes - Kubernetes 中的网络策略
- c - Win32 程序双缓冲不起作用
- pointers - 预增量运算符和取消引用运算符导致分段错误,似乎无法理解为什么