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