快速数据库存储10亿条logging

我正在编写一个存储数据的代码,并希望存储10亿到10亿条logging甚至更多。 最重要的是速度(近似10000 – 20000 /logging每秒),SPACE使用和CRASH打样。 现在我一直在玩MySQL MyISAM,它的工作速度非常快,并且符合我们所需要的速度。 MyISAM也具有最佳的SPACE使用率,MySQL数据文件夹中的数据库文件几乎等于我插入的数据量,例如,对于每个30个字符的100000条logging,只需要3MB。 但唯一的问题是,它不是ACID,并可能导致数据丢失的崩溃。

所以我想知道任何替代品(我甚至不介意将数据库软件改为其他任何东西),这可以帮助我们存储如此多的数据并将其存储在FAST中。

我已经尝试MySQL INNODB,它的插入非常缓慢。 我每秒只能达到800-1000个/logging。 INNODB中存储数据的空间也非常大。 存储每个30个字符的相同的100000条logging需要将近8 MB。

我也尝试了MongoDB作为替代scheme,但是它又需要太多空间来存储相同的数据。

即使SQLITE3数据库是非常非常慢写100000条logging。 我在for循环中用PHP试了一下。 它也错过了20个logging,并给出了数据库不可用的错误。

所以我想知道任何可以满足我的要求的开源数据库软件。 我听说MariaDB的ARIA符合ACID标准。 这是真的吗? 或者,PostgreSQL也是一个很好的select,具有最佳的空间利用率。

我对任何FAST解决scheme都是开放的,利用最佳空间并且是防止破坏。 期待回复。

===更新MariaDB咏叹调===它甚至比插入速度和空间的InnoDB还差。 它比InnoDB花费了1.5倍的时间来插入相同的数据和MyISAM使用的近2.5倍的空间。

这不是任何人在5分钟内100%“钉子”的事情,但如果你想要达到这样的性能和function水平,那么我强烈怀疑你将不得不花钱。

如果您有这方面的预算,那么我会考虑将Oracle的“TimesTen”引擎,可能与企业级SSD或PCIe闪存(如FusionIO)结合起来,如果你走得太远,我推荐使用Intel Xeon E7-xxxx系列,因为它们具有出色的RRASfunction,可以在发生故障时尽可能长时间地保持服务器正常运行。

如果获得更多的function和更好的performance只是使用不同的软件的问题,那么每个人都会这样做(至less还有less数人还在IT上)

如果你需要ACID支持 – 那么为什么要尝试mongoDB?

使用innodb(但是myisam更快)可以获得所需的吞吐量,只要您在硬件上花费足够的时间并正确调整系统即可。 但是,你的第一个约束是尽量减less占用空间,这意味着你没有预算去购买SSD RAID。

可能会导致数据丢失的崩溃

我已经看到甲骨文和Sybase的崩溃数据丢失 – 但是从理论上讲,这些数据应该更加强大。 我通常会花费一些时间,精力和金钱来避免首先出现的故障(专用服务器,使用合理质量的硬件,UPS,稳定的软件)。

即使SQLITE3数据库是非常非常慢

SQLite对底层文件系统特别敏感(但这会影响所有的数据库)。 你没有提到它运行的是什么文件系统(甚至是哪个操作系统),这让我觉得你没有花很多时间来调整安装。

如果是我,我会看看MariaDB – 这是一个mysql的分支,包括改进的ISAM引擎( Aria ),它具有一些性能优势并支持事务。 (在Linux上运行,使用nobarriers和截止date调度程序的xfs)。

但是你需要看看你的硬件才能真正实现飞行。

从我的经验来看,InnoDB(如果configuration正确和使用的话)只比MyISAM慢一些(当然不是一个数量级)。 我想到了一些提高性能的build议:

  • 你应该使用最新版本的MySQL InnoDB存储引擎。
  • 您应该使用较大的缓冲池大小(〜80%可用RAM)和较大的日志文件大小。
  • 您应该使用事务和批量插入来获得高吞吐量。 批量大小是一个重要的性能因素(不是太小,但不是太大)。
  • 您应该使用AUTOINCREMENT ID作为PRIMARY KEY。 任何索引都会降低插入速度,特别是UNIQUE。
  • 您应该使用适合您的最低事务隔离级别。
  • 调整你的系统的innodb_flush_method。
  • 如果您不需要完整的ACID保证,请查看更改innodb_flush_logs_at_trx_commit的值
  • 使用适当的硬件,调整您的操作系统/存储/文件系统

你会在这里find好的指针:

有很多参数可以用来调整innodb。 myisam的数据量是不合适的 – 例如它需要在发生崩溃后进行修复。

看看mysqltuner或percona的sqlconfiguration向导 ; 在它上面扔很多ram和快速的io子系统,innodb可以给你很好的performance。

innodb允许实时压缩数据 。 它不会让事情变得更快,但可以为您节省一些存储空间。

不pipeselect的数据库引擎如何

  • 尝试批量插入,如果可能的话,在数据生产者和数据库之间有一个排队系统
  • 考虑分解你的数据
  • 考虑平行插入过程。 它不会帮助你myisam,但可以给你更好的性能与MySQL和其他数据库服务器innodb

一个非常非常非常快速的DB: MemSQL