【问题标题】:Scaling MySQL database and improve performance when number of queries increase在查询数量增加时扩展 MySQL 数据库并提高性能
【发布时间】:2020-08-10 01:30:55
【问题描述】:

我们有一个系统,它由一个基于 Django 构建的 REST 应用程序组成。我们使用的数据库是MYSQL。两台服务器都托管在 AWS 中。

  • 目前有数百个 POST 请求来到我们的应用程序。
  • 我们在每次点击时将请求正文转储到我们的数据库中。
  • 请求的频率很高(每分钟大约 100 个)。

我们的下一个任务是处理我们收到的数据。目前我们已经安排了一个每 1 分钟运行一次的作业。

此作业具有从尚未处理的表中提取数据的逻辑,并根据我们的逻辑更新数据库中的其他表。 同时有大量的查询正在执行。 在数据流入过多的高峰时段,查询被锁定,我们的系统变得不堪重负。有时我们必须终止查询以释放系统。

有哪些方法可以减少查询的周转时间并确保所有查询在更短的时间内执行?我们如何确保查询不会被锁定?

【问题讨论】:

  • 附加信息请求。哪种 AWS 型号? RAM 大小、# 核心、MySQL 主机服务器上的任何 SSD 或 NVME 设备?在 pastebin.com 上发布并分享链接。从您的 SSH 登录根目录中,文本结果为:B) SHOW GLOBAL STATUS;至少 24 小时正常运行时间后 C) 显示全局变量; D) 显示完整的处理程序;为服务器工作负载调优分析提供建议。
  • 另一种进行高速摄取的方法。它有一个反馈循环来防止它像你描述的那样绊倒:mysql.rjweb.org/doc.php/staging_table
  • “巨大”只有 100 分钟/分钟,这到底是怎么回事?

标签: mysql performance django-rest-framework load scalability


【解决方案1】:

我假设您已根据需要选择了正确的数据库,如果您需要 mysql,那么您可以通过一些方法对其进行优化。

  1. 选择正确的 db 引擎 - 似乎您的系统写入繁重,因此选择了一些适用于行级锁定的引擎,例如 innodb。

  2. 索引 - 为优化读取和更新创建适当的索引。

  3. 使用主从arch in并将所有读取路由到slave并写入master。

  4. 你仍然面临问题,然后去分片并在每个分片上分配负载,除了分片 mysql 没有为编写繁重的系统提供任何其他解决方案。

  5. 如果数据量较小,您可以将所有分片保留在一个实例上并利用 CPU 内核。

【讨论】:

  • 感谢您回答我的问题。我们已经在关注 1 和 2。我们将尝试其他选项。
  • 如果您的表已经在使用 InnoDB 引擎并且您仍然经常遇到锁定问题,那么您在算法中做的事情非常糟糕。您有效地描述的是一个消息队列系统,因此您需要从这个角度来考虑它。例如,您需要重新考虑您的工作进程如何在不与其他工作线程发生冲突的情况下获取和处理记录。
  • 您的意思是对数据库系统使用主从配置。写作的主人和阅读的奴隶?消息队列将如何帮助解决我们的问题?
  • @GordanBobic 据我了解,消息队列系统将减少处理所有请求的服务的负载。到目前为止,我们还没有发现我们的 REST 服务有任何重大问题。我们正在使用 Django REST 框架。
  • 我们正在使用 Django REST 框架和 Nginx 服务器。
【解决方案2】:

100 个请求/分钟或 1.667 个插入/秒并不算太忙。

确保您在用于查找未处理行的标志上有一个索引。

确保在每次插入后提交事务。最好使用自动提交。

如果提供更详细的信息(如表结构)会有所帮助,但这是我要开始的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-12-03
    • 2023-04-08
    • 2012-02-07
    • 1970-01-01
    • 2023-03-14
    • 2016-11-14
    相关资源
    最近更新 更多