【发布时间】:2013-06-12 20:57:37
【问题描述】:
我有以下场景:
大约 7000 万台设备每 3~5 分钟发送一个信号到 服务器发送其 id、状态(在线或离线)、IP、位置 (经纬度)、父节点等一些信息。
其他信息可能不是标准格式(所以我没有架构)但我仍然需要查询它。
设备可能会消失一段时间(或永远)不发送 过程中的信号。所以我需要一种方法来“忘记”这些设备,如果 他们在过去 X 天内没有发出信号。还有新设备 随时可能上线。
我需要查询所有这些数据。就像知道特定区域或以上有多少设备离线 IP 范围。不会有很多查询同时运行。
一些查询需要快速运行(每个查询少于 3 分钟)并且 在数据库更新的同时。所以我需要索引 主要属性(id、状态、IP、位置和父节点)。这 查询结果不需要100%准确,最终一致 只要不需要太长时间(超过 20 分钟)就可以了 平均),以便它们出现在查询结果中。
我不需要 坚持到底,停电就算输了 一切。
考虑到这一切,我考虑过使用 noSQL 方法,可能是 MongoDB 或 CouchDB,因为我有使用 MapReduce 和 Javascript 的经验,但我不知道哪个更适合我的问题(我倾向于 CouchDB)或者它们是否适合完全适合处理如此庞大的工作量。我什至不知道我是否真的需要一个“传统”数据库,因为我不需要持久性到磁盘(也许主内存方法会更好?),但我确实需要一种轻松构建自定义查询的方法。
我发现的主要问题如下:
需要非常快速地插入/更新大量元组,我不知道 如果我收到的信号已经在数据库中,请事先说明。 几乎所有的信号都将处于与之前相同的状态 上次,所以也许可以通过 id 查询并检查元组是否改变了,如果没有做任何事情,如果它确实更新了?
忘记离线设备。夜间运行的批处理作业 删除过期的元组可以解决这个问题。
不会有很多查询同时运行,但它们需要 跑得快。所以我想我需要一个集群来执行 集群多个节点上的单个查询(CouchDB MapReduce 将工作负载拆分到集群的多个节点?)。我不是 我很确定我需要一个集群,但可以单独一个更贵 机器处理所有负载?
我以前从未使用过noSQL系统,但我有理论 对主题的了解。
【问题讨论】:
标签: database performance nosql eventual-consistency