我经营的网站有~500实时访问者,~50k日访问者和~13.3亿总用户。我将我的服务器托管在AWS上,在那里我使用了几个不同类型的实例。当我开始这个网站的时候,不同的例子的代价是相同的。当网站开始吸引用户使用RDS实例(MySQL DB) CPU时,我不得不多次升级它,现在它已经开始承担性能和每月成本的主要部分(约为每月2,8k美元)的95%。我目前使用的数据库服务器的16 16vCPU和64 RAM的RAM,我还使用多AZ部署,以防止故障。,我想知道数据库这么昂贵是正常的,还是我做错了什么?


数据库信息
目前,我的数据库有40个表,其中大多数有100 K行,有些有200万行,还有1张有3000万行。我有一个系统,档案行比不再需要的21天更旧的档案行。
网站信息
该网站主要使用PHP,也有一些NodeJS和python。
该网站的大部分功能如下:
我还以10-30秒的间隔从数据库运行了大约100个机器人轮询,它们有时还会插入/更新数据库。
额外
为了降低数据库的负载,我做了几件事。例如启用数据库缓存,对一些查询使用redis缓存,尝试删除非常慢的查询,尝试将存储类型升级到“供应的IOPS SSD”。但似乎什么也帮不上忙。
这是我对设置参数所做的更改:

我曾经考虑过创建一个包含几个较小实例的MySQL集群,但我不知道这是否有帮助,我也不知道这是否适合于事务处理。
如果您需要更多的信息,请询问,在这个问题上的任何帮助都是非常有用的!
发布于 2016-07-10 15:43:08
根据我的经验,一旦你问到“我怎样才能提高绩效?”你知道你已经超过了RDS (编辑:我承认我的经验可能已经过时了)。
听起来您的查询负载非常重。大量的插入和更新。如果可以的话,您应该在您的RDS版本上增加innodb_log_file_size。否则,您可能不得不放弃RDS,转而使用EC2实例,在那里您可以更容易地优化MySQL。
我还将禁用MySQL查询缓存。对于每个insert/update,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秒以下的查询,但是它们的运行频率太高了,这对服务器来说是一个负担。
在您知道哪些查询计算了负载之后,您可以制定一些关于如何解决这些查询的明智策略:
发布于 2016-07-10 20:06:20
我认为答案是“你做错了什么”。这是非常不可能的,你已经达到了一个RDS的限制,虽然你可能是在它的某些部分的极限。
首先启用详细的监视。这将给您一些操作系统级别的信息,这将有助于确定您的限制因素是什么。看看您缓慢的查询日志和数据库统计数据--您可能有一些导致问题的查询。
一旦您理解了问题--这可能是糟糕的查询、I/O限制或其他问题--那么您就可以解决它们了。RDS允许您创建多个读取副本,因此您可以将部分读取负载转移到从服务器上。
您还可以迁移到Aurora,这将给您提供更好的I/O性能。或者使用PIOPS (或分配更多磁盘,这将提高性能)。你用的是SSD存储器,对吧?
另一个建议--如果您的计算(上面的步骤4)花费了大量的时间,您可能需要考虑将其分解为两个或多个事务。
https://stackoverflow.com/questions/38293292
复制相似问题