运行两个MongoDB实例

我正在使用MERN堆栈开发一个高度I / O密集型应用程序(基于可用性的select)。 该应用程序预计将获得2000个并发用户。 我想知道使用MongoDB的两个实例是明智的,一个在RAM上(在内存中),另一个在硬盘上。

一个用来存储可用座位的RAM。 而硬盘驱动器则定期备份数据。 但同时我知道,如果服务器崩溃我的MongoDB数据在RAM上丢失。

任何人都可以引导我吗?

我使用的是Socket IO而不是AJAX …

我不认为你需要这个。 你可以得到一个好的服务器,具有大量的RAM,如果你正确地创build索引,一切都应该正常工作。

Mongo 3也不会像Mongo 2那样在每次更新时locking整个数据库。

我相信最好的方法是使用类似Memcached的东西,以提高阅读。 此外,为了提高数据库性能并使自动故障转移使用分片和副本集。

还要考虑到,当你的服务器重新启动,你会失去你的数据头痛…

这看起来没有必要,因为MongoDB的行为完全像开箱即用。

旧的引擎(MMAPv1)正在使用内存映射文件,这意味着如果您拥有的数据量与RAM数量相同,则其实际上就像内存数据库一样,具有自动硬盘驱动器支持。

新的引擎(有线老虎)的工作细节有点不同,但总的来说是一样的。 它允许你设置一个caching大小(configuration密钥storage.wiredTiger.engineConfig.cacheSizeGB)。 当caching大小足够大时,您将再次拥有带有自动硬盘镜像的内存数据库。

更多关于存储FAQ的信息 。

你所说的是一个缩放问题。 在扩展方面,您有两个select:将导致瓶颈的资源添加到现有设置(通常更多的RAM和更快的磁盘)或扩展您的设置。 您应该首先添加资源,几乎可以达到添加资源不会让您大跌眼镜的地步。

在某些时候,这种“扩大规模”将不再可行,您必须将负载分配给更多的节点。

MongoDB具有在(逻辑)节点之间分配负载的function: 分片 。

基本上,它是这样工作的:多个副本集合形成一个称为碎片的逻辑节点。 每个碎片反过来只包含您的数据的一个子集。 而不是直接连接到分片,而是通过mongos查询路由器获取数据,该路由器知道哪个分片拥有数据来回答查询以及写入新数据的位置。

通过仔细select分片键 ,读写操作应该均匀分布在分片之间。

附注:将生产数据放在单独的实例上,而不是复制品集合,跨越我书中疏忽的边界。 考虑到今天(租用)硬件的价格,消除单点故障比使用MongoDB副本集更容易。