当前位置:  开发笔记 > 前端 > 正文

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

如何解决《使用NoSQL数据库为JSON数据提供高效且可扩展的存储》经验,为你挑选了1个好方法。

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

我们需要存储小的JSON文档,大约150个字节,例如"audit:{timestamp: '86346512',host':'foo',username:'bar',task:'foo',result:0}""journal:{timestamp:'86346512',host':'foo',terminalid:1,type='bar',rc=0}"

我们预计每天大约有一百万个条目,大约150 MB的数据

数据将被存储和读取,但从未被修改过

数据应以有效的方式存储,例如Apache Avro使用的二进制格式

保留时间后数据可能会被删除

自定义查询,例如'get audit for user and time period''get journal for terminalid and time period'

复制数据库以进行故障保护

可扩展性

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



1> tom.wilkie..:

每天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之类的主要区别(不是我想要启动火焰!)

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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有