使用NoSQL数据库为JSON数据提供高效且可扩展的存储

我们正在开发一个项目,该项目应收集日志和审计数据并将其存储在数据存储中以用于存档和一些视图.我们不太确定哪个数据存储区对我们有用.

>我们需要存储小的JSON文档,大约150个字节,例如“audit:{timestamp:’86346512′,host’:’foo’,用户名:’bar’,任务:’foo’,结果:0}”或“journal:{timestamp:’86346512′,host’:’foo ”,terminalid:1,类型= ‘酒吧’,RC = 0}”
>我们预计每天大约有一百万个条目,大约150 MB的数据
>数据将被存储和读取,但从未被修改过
>数据应以有效的方式存储,例如Apache Avro使用的二进制格式
>保留时间后,数据可能会被删除
>自定义查询,例如“获取用户和时间段的审核”或“获取terminalid和时间段的日志”
>复制的故障安全数据库
>可扩展

目前我们正在评估NoSQL数据库,如Hadoop / Hbase,CouchDB,MongoDB和Cassandra.这些数据库对我们来说是正确的数据存储吗?哪个最适合?
有更好的选择吗?

>每天100万次插入约10次插入/秒.大多数数据库都可以解决这个问题,远低于我们从Cassandra在合理硬件上获得的最大插入速率(50k插入/秒)
>您的要求“在保留时间数据可能被删除后”很适合Cassandra的列TTL – 当您插入数据时,您可以指定保留多长时间,然后后台合并进程将在达到该超时时丢弃该数据.
>“数据应以有效的方式存储,例如Apache Avro使用的二进制格式” – Cassandra(与许多其他NOSQL存储一样)将值视为不透明的字节序列,因此您可以根据自己的喜好对值进行编码.您还可以考虑将值分解为一系列列,这样您就可以执行更复杂的查询.
>自定义查询,例如“获取用户和时间段的审核” – 在Cassandra中,您可以通过将行键设置为用户ID并将列键作为事件的时间(很可能是timeuuid)来对此进行建模.然后,您将使用get_slice调用(或更好的CQL)来满足此查询
>或’获取terminalid和time period’ – 如上所述,将行键设为terminalid,列键为时间戳.需要注意的一点是,在Cassandra中(与许多无连接存储一样),通常不止一次(以不同的方式)插入数据以针对不同的查询进行优化.
> Cassandra有一个非常复杂的复制模型,您可以在其中为每个操作指定不同的一致性级别. Cassandra也是一个非常可扩展的系统,没有单点故障或瓶颈.这实际上是Cassandra与MongoDB或HBase之类的主要区别(不是我想要启动火焰!)

说完所有这些后,您可以通过更传统的数据库和简单的主从复制轻松满足您的要求,这里的任何内容都不会太繁琐

相关文章
相关标签/搜索