运行 MongoDB 的两个实例

Running two instances of MongoDB

我正在使用 MERN Stack 开发高度 I/O 密集型应用程序(根据座位的可用性进行选择)。 该应用程序预计将获得 2000 个并发用户。 我想知道使用 MongoDB 的两个实例是否明智,一个在 RAM(内存)上,另一个在硬盘驱动器上。

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

有人可以指导我吗?

我正在使用 Socket IO 而不是 AJAX...

我认为你不需要这个。您可以获得一台性能良好的服务器,配备大量 RAM,如果您正确创建索引,一切都应该正常工作。

另外 Mongo 3 不会在每次更新时锁定整个数据库,就像 Mongo 2 过去那样。

我认为最好的方法是使用 Memcached 之类的方法来提高读取率。此外,为了提高数据库性能并实现自动故障转移,请使用分片和副本集。

还请考虑一下,当您的服务器重新启动并丢失数据时您会感到头疼...

这似乎没有必要,因为 MongoDB 的行为已经与开箱即用的完全一样。

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

新引擎 (Wired Tiger) 的工作原理在细节上略有不同,但大体相同。它允许您设置缓存大小(配置键 storage.wiredTiger.engineConfig.cacheSizeGB)。当缓存大小足够大时,您将再次拥有一个具有自动硬盘驱动器镜像的内存数据库。

the storage FAQ.

中有更多相关信息

你说的是缩放问题。在扩展方面,您有两个选择:添加导致现有设置瓶颈的资源(通常是更多 RAM 和更快的磁盘)或扩展您的设置。您应该首先添加资源,几乎到了添加资源不会给您带来相应收益的地步。

在某些时候,这个 "scaling up" 将不再可行,您必须在更多节点之间分配负载。

MongoDB 具有在(逻辑)节点之间分配负载的功能:sharding.

基本上,它是这样工作的:多个副本集各自形成一个称为分片的逻辑节点。每个分片依次仅包含您数据的一个子集。您无需直接连接到分片,而是通过 mongos query router 获取数据,它知道哪个分片保存数据以回答查询以及写入新数据的位置。

carefully selecting your shard key,您的读取和写入应该在分片之间均匀分布。

旁注:将生产数据放在独立实例而不是副本集上跨越了我书中的疏忽边界。鉴于当今(租用)硬件的价格,消除单点故障从未像 MongoDB 副本集那样容易。