我是NoSQL世界的新手,正在考虑将我的MS Sql Server数据库替换为MongoDB。我的应用程序(用.Net C#编写)与IP摄像机交互,并将来自摄像机的每个图像的元数据记录到MS SQL数据库中。平均而言,我每天为每个摄像机插入约86400条记录,在当前数据库模式中,我为单独的摄像机图像(例如Camera_1_Images,Camera_2_Images … Camera_N_Images)创建了单独的表。单个图像记录由简单的元数据信息组成。如AutoId,FilePath,CreationDate。为了对此添加更多细节,我的应用程序为每个摄像机启动了一个单独的进程(.exe),每个进程每秒在数据库的相对表中插入1条记录。
我需要(MongoDB)专家针对以下问题的建议:
判断MongoDB是否适合保存此类数据,最终将针对时间范围进行查询(例如,检索指定小时内特定摄像机的所有图像)?关于我的案例的基于文档的架构设计有什么建议吗?
服务器(CPU,RAM,磁盘)的规格应该是什么?有什么建议吗?
我是否应该在这种情况下考虑分片/复制(同时考虑同步复制集的写入性能)?
在同一台计算机上使用多个数据库是否有任何好处,以便一个数据库将保存所有摄像机的当日图像,而第二个数据库将用于存档前一天的图像?我正在考虑在分开的数据库上拆分读写。因为所有读取请求都可能由第二个数据库处理并写入第一个数据库。它会受益吗?如果是,那么任何确保两个数据库始终同步的想法。
欢迎其他任何建议。
我本人是NoSQL数据库的入门者。 因此,我以潜在的否决权为代价来回答这个问题,但这对我来说将是一次很棒的学习经历。
在竭尽全力回答您的问题之前,我应该说,如果MS SQL Server对您而言运行良好,那么请坚持使用它。除了您将MongoDB作为面向文档的数据库了解到之外,您还没有提到为什么要使用MongoDB的任何正当理由。此外,我看到您为每个摄像机捕获的元数据集几乎相同,即您的架构是动态的。
MongoDB的是一个面向文档的数据库,善于查询 中 的集合(你叫它文件)。由于您已经将每个摄像机的数据存储在其自己的表中,因此在MongoDB中,您将为每个摄像机创建一个单独的 集合 。这是执行日期范围查询的方法。
所有NoSQL数据库都可以在商品硬件上进行 横向扩展 。但顺便提一句,您可能正在考虑通过 向上扩展 来提高性能。您可以从一台合理的机器开始,并且随着负载的增加,您可以继续添加更多服务器(向外扩展)。您无需计划和购买高端服务器。
MongoDB一次写入将锁定整个数据库(但会产生其他操作的收益),并且适用于读取次数多于写入次数的系统。因此,这取决于您的系统。分片有多种方式,并且应针对特定领域。通用答案是不可能的。但是,可以提供一些示例,例如按地理位置,按分支等进行分片。
另请阅读CAP定理的简明英语介绍
更新了分片评论的答案
根据他们的文档,如果满足以下条件,则应考虑部署分片群集:
您的数据集接近或超过系统中单个节点的存储容量。 系统活动工作集的大小将很快超过系统最大RAM容量的容量。 您的系统具有大量写入活动,单个MongoDB实例无法足够快地写入数据以满足需求,并且所有其他方法都没有减少争用。
因此,基于最后一点,是的。自动分片功能用于扩展写入。在这种情况下,你必须每一个写锁 碎片 ,而不是每个 数据库 。但是我的是理论上的答案。我建议您咨询10gen.com小组。