MySQL服务器负载很高

Ran*_*ama 2 mysql database performance amazon-web-services aws-rds

我运行一个网站500名实时游客〜,〜50K每天游客〜1,3million用户总量.我在AWS上托管我的服务器,在那里我使用了几个不同类型的实例.当我启动网站时,不同的实例成本相同.当网站开始获得用户时,RDS实例(MySQL DB)CPU不断地进入屋顶,我不得不多次升级,现在已经开始占用主要部分的性能和每月成本(约95%的(2,8k $ /月)).我目前使用的是具有16vCPU和64GiB RAM的数据库服务器,我还使用多可用区部署来防止故障.我想知道数据库是否很昂贵,或者我是否做了一些非常错误的事情?

当前设置

在此输入图像描述

数据库信息

目前我的数据库有40个表,其中大多数有100k行,有些有~2百万,1有3000万.我有一个系统档案行,这些行在21天之后不再需要了.

网站信息

该网站主要使用PHP,还有一些NodeJS和python.

网站的大部分功能都是这样的:

  1. 开始交易
  2. 插入行
  3. 获取最后插入的id(lastrowid)
  4. 做一些计算
  5. 更新了插入的行
  6. 更新用户
  7. 提交交易

我还以10-30秒的间隔从数据库中运行大约100个机器人,他们有时也会插入/更新数据库.

额外

我已经做了几件事来尝试降低数据库的负载.例如启用数据库缓存,对某些查询使用redis缓存,尝试删除非常慢的查询,尝试将存储类型升级为"Provisioned IOPS SSD".但似乎没有任何帮助.

这是我对设置参数所做的更改:

在此输入图像描述

我有关于创建一个包含几个较小实例的MySQL集群,但我不知道这是否会有所帮助,而且我也不知道这是否适用于事务.

如果您需要更多信息,请询问,对此问题的任何帮助都非常有用!

Bil*_*win 5

根据我的经验,一旦你问"我怎样才能扩大性能?"这个问题.你知道你已经超出了RDS(编辑:我承认我的经历导致我的观点可能已经过时).

听起来你的查询负载非常重要.大量的插入和更新.如果可以使用您的RDS版本,则应增加innodb_log_file_size.否则,您可能不得不放弃RDS并转移到EC2实例,您可以更轻松地调整MySQL.

我也会禁用MySQL查询缓存.在每次插入/更新时,MySQL都必须扫描查询缓存,以查看是否有任何需要清除的缓存结果.如果您的工作量很大,那就浪费时间了.将查询缓存增加到2.56GB会使情况变得更糟!将高速缓存大小设置为0,将高速缓存类型设置为0.

我不知道你运行了什么查询,或者你对它们的优化程度如何.MySQL的优化器是有限的,因此通常情况下,您可以从重新设计SQL查询中获得巨大的好处.也就是说,更改查询语法,以及添加正确的索引.

您应该进行查询审核,以找出哪些查询会导致您的高负载.一个很好的免费工具是https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html,它可以根据您的慢查询日志为您提供报告.使用http://docs.aws.amazon.com/cli/latest/reference/rds/download-db-log-file-portion.html CLI命令下载RDS慢查询日志.

设置你的long_query_time = 0,让它运行一段时间来收集信息,然后将long_query_time改回你通常使用的值.收集此日志中的所有查询非常重要,因为您可能会发现75%的负载来自2秒以内的查询,但它们运行频繁,以至于它对服务器造成负担.

在您知道哪些查询考虑了负载后,您可以制定一些有关如何解决这些问题的明智策略:

  • 查询优化或重新设计
  • 应用程序中的更多缓存
  • 扩展到更多实例