在性能关键型解决方案中使用哪种方法和数据库

时间:2013-06-12 20:57:37

标签: database performance nosql eventual-consistency

我有以下情况:

  • 大约7000万台设备每隔3~5分钟发送一次信号 服务器发送其ID,状态(在线或非在线),IP,位置 (纬度和经度),父节点和其他一些信息。

  • 其他信息可能不是标准格式(因此我没有架构),但我仍然需要查询它。

  • 设备可能会消失一段时间(或永远)不发送 这个过程中的信号。所以我需要一种“忘记”设备的方法 他们在过去的X天没有发出信号。也是新设备 可能随时上线。

  • 我需要查询所有这些数据。就像知道特定区域或以上有多少设备离线一样 IP范围。不会有很多查询同时运行。

  • 有些查询需要快速运行(每个查询少于3分钟)和 在数据库更新的同时。所以我需要索引 主要属性(id,status,IP,location和parent node)。该 查询结果不需要100%准确,最终一致 只要它不需要太长时间(超过20分钟)就可以了 avarage)让他们出现在查询结果中。

  • 我不需要 坚持不懈,如果力量消失,可以输掉 一切。

鉴于所有这些,我想到使用noSQL方法可能是MongoDB或CouchDB,因为我有MapReduce和Javascript的经验,但我不知道哪个更适合我的问题(我倾向于CouchDB)或者如果它们是完全适合处理这种巨大的工作量。我甚至不知道我是否真的需要一个“传统”数据库,因为我不需要持久化到磁盘(也许主内存方法会更好?),但我确实需要一种方法来轻松构建自定义查询。 / p>

我发现的主要问题如下:

  • 需要快速插入/更新大量元组,我不知道 如果我收到的信号已经在数据库中,请事先预先。 几乎所有信号都处于与它们相同的状态 最后一次,也许可以通过id进行查询并检查元组是否发生变化,如果没有做任何事情,如果它确实更新了吗?

  • 伪造离线设备。在夜间运行的批处理作业 删除过期的元组可以解决这个问题。

  • 不会有很多查询同时运行,但是需要它们 跑得快。所以我想我需要一个集群来执行一个 在群集的多个节点上进行单一查询(CouchDB MapReduce 将工作负载拆分到集群的多个节点?)。我不是 肯定我需要一个集群,可能会更贵 机器处理所有负载?

  • 我之前从未使用过noSQL系统,但我有理论上的 该主题的知识。

2 个答案:

答案 0 :(得分:1)

这有意义吗?

Apache Flume收集信号。

它是一个分布式,可靠且可用的系统,用于有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。易于配置和扩展。使用Flume将数据作为文件存储在HDFS中。

Hive用于批量查询。

将HDFS中的数据文件映射为Hive仓库中的外部表。无论何时需要离线批量处理,都要使用HiveQL编写类似SQL的查询。

HBase用于随机实时读/写。

由于作为FS的HDFS缺乏随机读/写功能,因此您需要一个DB来实现此目的。看看你的用例HBase对我来说似乎很好。我不会说MongoDB或CouchDB,因为你不在这里处理文档,这些都是面向文档的数据库。

Impala用于快速互动查询。

Impala允许您直接对存储在HDFS或HBase中的数据运行快速,交互式SQL查询。与Hive不同,它不使用MapReduce。相反,它利用了MPP的强大功能,因此它对实时的东西很有用。并且它易于使用,因为它使用相同的元数据,SQL语法(Hive SQL),ODBC驱动程序等作为Hive。

HTH

答案 1 :(得分:0)

根据分析的类型,CouchDB,Flume的HBase可能都是不错的选择。对于严格的数字“一次写入”指标数据,石墨是一种非常流行的开源解决方案。