AWS RDS MYSQL写入操作每秒计数

时间:2016-02-23 02:02:35

标签: php mysql amazon-web-services mariadb aws-rds

我正在创建一个mysql表并编写一个API,以便每秒接收和存储1000多个设备的数据。每个设备都会向这个PHP服务器推送100多个数据点。我正在测试360个设备,每个设备有10个数据点,它每秒有3600个写入计数,这是可以理解的。但是,我注意到写入操作每秒计数随着设备数量的增加而增加。我试图谷歌每秒写入计数的饱和点,但无法找到任何。每秒最多写入次数是多少?当写入次数达到每秒10万次时,系统性能如何。有没有关于mysql数据库的专家请指教,谢谢。

2 个答案:

答案 0 :(得分:2)

可能能够在非常有限的测试用例中找到显示某些高数字的基准。但是有太多因素影响每秒的写入次数':

  • 旋转驱动器与SSD,以及品牌等
  • RAID
  • 批量插入/ LOAD DATA /单行插入/ MyISAM
  • 索引数
  • BEGIN ... COMMIT / autocommit
  • 并发 - 多次写入以及同时读取
  • 设置:innodb_flush_log_at_trx_commit,sync_binlog等
  • 版本(5.6做了一些改进; 5.7做了更多; MariaDB有一些改进,加上其他改进)
  • 模式
  • 客户端和服务器争夺资源

我听说有一个基准显示了一百万个"交易"每秒5.7。

但是,获得100K是一个相当大的挑战。这就是我的建议:

  • SSD(可能存在于AWS中;获得最大IOP)
  • RAID条带化(奇偶校验会伤害一些,但可能值得拥有)
  • MyISAM,由于表锁定,如果使用多线程插入,可能不是一个好主意。 (我在本次讨论的其余部分假设InnoDB。)
  • 您将对数据做些什么?如果您不需要 SQL 来查看单个值,请将100个值存储在JSON字符串中并将其压缩为BLOB。现在你可以悠闲地写下1000次/秒。
  • FusionIO SSD可能会为您进行压缩。我不喜欢InnoDB的自动压缩功能。在客户端中执行此操作会卸载服务器。
  • 索引:一旦掌握了大量数据,索引的随机更新将会扼杀您。设计PRIMARY KEY以便插入可以在表格的末尾"。
  • 每批插入100-10K行 - 少于此导致管理费用;超过这导致超越撤销日志等效率低下。
  • innodb_flush_log_at_trx_commit=2sync_binlog可能无关紧要因为批处理。
  • 5.7,可能是MariaDB 10.1
  • 如有必要,请将客户端移至单独的服务器。

至于如何快速收集大量数据,可能有多个线程,请阅读我的"High speed ingestion"博客。它讨论了ping一对表 - 一个用于接收数据,另一个用于处理(规范化,压缩,汇总)和铲入Fact表。

另一个问题......你正试图每秒将几MB推入一个表;每天加起来几乎是1TB。你会保留多长时间的数据?你有多少磁盘空间?如果您要删除旧版'数据,然后PARTITION BY RANGE是必须的。我的Partitioning blog详细介绍了如何以非常便宜的方式执行DROP PARTITIONREORGANIZE PARTITION删除操作。

这导致另一个建议 - 处理数据,但不保存。好的,也许你需要一个小时的数据来处理。在这种情况下,上述所有讨论仍然适用(INDEX限制除外)。我的高速摄取可能仍然值得做。你可以每小时一次乒乓球。一小时可能是10GB - 足以保留在RAM中,从而避免了I / O瓶颈。

答案 1 :(得分:1)

还要考虑所配置的RDS的基础EC2实例大小。