1

I am working on a highly I/O Intensive application (A selection based on the availability of seats) using MERN Stack. The app is expected to get 2000 concurrent users. I want to know whether it's wise to use two instances of MongoDB, one on the RAM (in memory) and another on the Hard drive.

The RAM one to be used to store the available seats. And the Hard drive one to backup the data after regular intervals. But at the same time I know that if the server crashes my MongoDB data on the RAM is lost.

Could anyone guide me please?

I am using Socket IO instead of AJAX...

4

3 回答 3

2

我认为你不需要这个。您可以获得一台具有大量 RAM 的优质服务器,并且如果您正确创建索引,那么一切都应该可以正常工作。

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

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

还要考虑当您的服务器重新启动并且您丢失数据时您会头疼......

于 2016-10-16T21:31:51.093 回答
2

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

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

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

有关存储常见问题的更多信息。

于 2016-10-16T22:04:00.717 回答
0

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

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

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

基本上,它是这样工作的:多个副本集每个都形成一个称为分片的逻辑节点。反过来,每个分片仅保存您数据的一个子集。您无需直接连接到分片,而是通过mongos查询路由器获取数据,该路由器知道哪个分片保存数据以回答查询以及在哪里写入新数据。

通过仔细选择您的 shard key,您的读取和写入应该在分片之间均匀分布。

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

于 2016-10-17T05:51:14.820 回答