降低MySQL的持久性以提高性能

5

我的网站偶尔会有相当可预测的爆发式流量,将吞吐量提高超过正常水平100倍。例如,我们将在一档电视节目中亮相,我预计在节目后的一个小时内,访问量将比平时高出100倍以上。

我的理解是,MySQL(InnoDB)通常会将我的数据存储在不同的位置:

  • RAM缓冲区
  • 提交日志
  • 二进制日志
  • 实际表格
  • 上述所有位置均在我的DB从属副本上

这种“耐用性”太多了,因为我在EC2节点上,大部分东西都通过同一网络管道传输(文件系统附加到网络)。另外,驱动器速度很慢。这些数据并不是高价值的,而我宁愿冒少量数据丢失几分钟的风险,也不愿意在人群到达时有高概率的停机时间。

在这些流量突发期间,我希望仅在负担得起的情况下进行所有I / O操作。我希望尽可能地保留在RAM中的内容(与一个小时内触摸的数据大小相比,我有很多RAM)。如果缓冲区变得不足,或者I / O通道没有过载,那么当然,我希望将事物记录提交日志或二进制日志发送到从属副本。只有在I / O通道不过载的情况下,我才想写回实际表格。

换句话说,我希望MySQL / InnoDB使用“写回”缓存算法而不是“写入”缓存算法。我能说服它这样做吗?

如果这不可能,我对一般的MySQL写性能优化技巧很感兴趣。大多数文档都是关于优化读取性能的,但当我有一群用户时,我正在为他们创建账户,因此工作负载是以写入为重的。

2个回答

3
如果您可以接受一些额外的风险,这两个更改将极大地提高您的写入性能。
设置innodb_flush_log_at_trx_commit=0 设置sync_binlog=0
此外,您的缓冲池大小应该在服务器内存的70-80%左右。增加日志文件大小和日志缓冲区大小也可以在一定程度上帮助。

谢谢。我会调整它们的。 - Paul Prescod

1

在很大程度上,InnoDB已经做到了这一点。

当您提交数据时,它会被写入日志文件以进行恢复,但是对表空间(数据)的修改只会作为后台进程(“检查点”)稍后完成。

您可以在较新的InnoDB版本(innodb_io_capacity)中指定要专用于该后台进程的IOPS数量(http://en.wikipedia.org/wiki/IOPS),并且只要您将innodb_log_file_size设置得足够大,InnoDB就会暂时落后一段时间,稍后再赶上。

如果InnoDB在后台工作方面落后太多,当您到达日志文件末尾并不得不循环回来时,它可能会导致性能急剧下降。请参见这些基准测试中的“none”行: http://www.mysqlperformanceblog.com/2009/09/15/which-adaptive-should-we-use/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接