我如何扩展用于 300 个工作程序的队列作业的高 I/O mysql 数据库?

我如何扩展用于 300 个工作程序的队列作业的高 I/O mysql 数据库?

我目前在前端使用 angular 作为显示队列工作者进度的仪表板。在后端,我使用 50 个 AWS EC2 实例,每个实例大约有 6 个工作者,这些工作者由 Supervisord 管理。这些工作者在 Aurora Mysql Serverless DB 中执行下一个可用的作业。这些工作者在数据库中写入大量数据,也从中读取大量数据,我注意到读取操作在前端变慢了。例如,在执行 axios get 请求以获取作业进度时,有时需要 50 秒才能收到信息,并且所有后续的 ajax 调用都会延迟。

我尝试将数据库扩展到更好的实例,但我觉得这不是正确的方法,因为仍然存在很大的滞后。我认为这可能是因为 mysql 不是适合这项工作的工具,而 redis 更适合?我还想到的一个解决方案是有一个只读副本,以便前端仪表板从中读取并在几毫秒内接收信息。这种方法的缺点是我在后端使用了一个 api,所以我必须在另一个实例上复制该 api,并且会有两个类似的 api,其中一个是只读的。

你们认为最好的方法是什么?

答案1

您是否检查过哪些查询实际上对数据库造成了最大的压力?它们是检查作业进度的查询吗?如果是这种情况,您可能希望每隔几秒运行一次这些查询,然后缓存结果redis或者内存缓存(例如亚马逊AWS官方博客)。仪表板进度更新通常不需要100%准确和100%即时。

Aurora 还支持只读节点- 也许您可以从这些 R/O 节点读取更新,而不会用只读内容使主 R/W 节点过载。

还要确保你已经获得了正确的索引在数据库表上。您可以使用EXPLAIN SELECT ...确保它们不会扫描表。索引可以巨大的不同之处!

正如 Tim 所说,管理作业队列最好使用AWS SQS- 工作人员逐一从队列中挑选作业,而不必扫描数据库来查找下一个作业。

希望有帮助:)

相关内容