Mysql MyISAM表崩溃了很多插入和选择,我应该选择什么解决方案?

时间:2014-08-14 08:45:26

标签: mysql innodb myisam large-data database

我有以下情况:

Amazon EC2实例上的MySQL MyISAM数据库,在apache webserver上使用PHP。我们需要在MySql中的json中存储incomming包。为此,我使用一个临时数据库,其中每分钟cronjob移动旧数据,其中DateTime> 'date - 2min'查询到另一个表(名为stage2)。

stage1表只有实际信息,正常情况下包含35k行,繁忙时最多可包含100k。我们每分钟可以达到5万个新行,这应该是大约10k个插入查询。插入内容如下所示:

INSERT DELAYED IGNORE INTO stage1 VALUES(...),(....),(....),(....),(...)

然后我们有大约每10秒运行4个脚本,执行以下操作:

  1. 从stage1(主键)
  2. 获取最大RowID
  3. 将数据导出到该rowID和之前的最大RowId a)2个脚本使用bash并使用mysql export命令行方法 b)node.js中的1个脚本,并使用带有outfile的export方法 c)php中的1个脚本,它使用默认的mysql select语句并遍历每一行。
  4. 将数据发送到外部客户端
  5. 将最后发送时间和最后一个rowid写入mysql表,以便它知道下次的位置。
  6. 然后我们每分钟有一个cronjob将旧数据从stage1移动到stage2。

    所以一切都运作良好很长一段时间,但现在我们的用户越来越多,在高峰期间,stage1表不时崩溃。我们可以很容易地修复它,但这不是正确的方法因为我们会停机一段时间。

    p。在高峰时段内存和CPU都可以,但是当stage1崩溃时,一切都崩溃了。

    另外值得一提的是:我不在乎我是否因为失败而错过了行,所以我不需要任何特殊的备份计划以防万一出错。

    到目前为止我做了什么:

    1. 将延迟和忽略添加到插入语句。
    2. 尝试切换到innoDB,但这更糟糕,主要是想到它需要的大内存。我的EC2目前是t2.medium,具有4GB内存和2个具有突发容量的vCPU。点击:https://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size并运行此查询:

      SELECT CEILING(Total_InnoDB_Bytes * 1.6 / POWER(1024,3))RIBPS FROM (SELECT SUM(data_length + index_length)Total_InnoDB_Bytes FROM information_schema.tables WHERE engine ='InnoDB')A;

      它返回了11gb,我尝试了3gb,这是我实例的最大值(80%)。因为它更不稳定我昨天把每张桌子都换回myISAM

    3. 重新创建stage1表结构

    4. 我有什么限制?

      1. 我无法将所有4个脚本更改为一个导出,因为客户端的输出不同。例如,有些人使用json其他xml。
      2. 我正在考虑的选项

        1. 具有15GB内存的m3.xlarge实例的价格要贵5倍,但如果需要,我愿意提供此优惠。然后再次切换到innoDB并查看它是否稳定?
        2. 我可以将stage1移动到innoDB并使用3gb缓冲池大小运行吗?那剩下的就是myISAM?
        3. 尝试使用nosql数据库或内存类型数据库。应该有用吗?
        4. 将软件包排入内存并让4个脚本从内存中获取数据,并在完成后再保存所有内容。是否有某种工具?
        5. 使用innoDB
        6. 将stage1移动到RDS实例

          喜欢得到一些建议和帮助!也许我错过了简单的答案?或者我不应该考虑哪些选择。

          谢谢, Sjoerd Perfors

1 个答案:

答案 0 :(得分:-1)

今天我们通过以下设置解决了这些问题:

  • AWS Loadbalancer转到T2.Small实例" Worker"其中Apache en PHP处理请求并发送到EC2实例mysql系统调用" Main"。
  • 当T2.small实例的CPU自动超过50%时,将启动连接到负载均衡器的新实例。
  • "主" EC2使用innodb运行mysql。
  • 所有更新到Apache 2.4和PHP 5.5并进行了性能更新。
  • 修正了一个脚本表现得更快的问题。
  • Innodb现在有6GB

我们尝试过的但没有奏效的事情: - 设置DynamoDB但发送到此数据库的成本几乎为5秒。

我们正在考虑的事情: - 删除stage2数据库并直接从Stage1进行备份。似乎有这种行并不会对性能造成影响。