我正在使用MERN Stack开发高度I / O密集型应用程序(基于座位可用性的选择)。 该应用程序预计将获得2000个并发用户。 我想知道使用MongoDB的两个实例是明智的,一个在RAM(在内存中),另一个在硬盘上。
用于存储可用座位的RAM。 并且硬盘驱动器之一定期备份数据。 但与此同时,我知道如果服务器崩溃,我的RAM上的MongoDB数据就会丢失。
有人可以指导我吗?
我使用的是Socket IO而不是AJAX ......
答案 0 :(得分:2)
我认为你不需要这个。你可以得到一个好的服务器,有大量的内存,如果你正确地创建索引,一切都应该可以正常工作。
Mongo 3也不会像Mongo 2那样在每次更新时锁定整个数据库。
我认为最好的方法是使用像Memcached之类的东西来改善读取。此外,为了提高数据库性能并使自动故障转移使用分片和副本集。
还要考虑一下,当您的服务器重新启动并丢失数据时,您会感到头痛......
答案 1 :(得分:2)
这似乎是不必要的,因为MongoDB的行为与开箱即用的完全相同。
旧引擎(MMAPv1)正在使用内存映射文件,这意味着如果你有足够的RAM数据,它实际上就像一个内存数据库,具有自动硬盘驱动器支持。
新引擎(有线老虎)的细节有点不同,但总的来说是一样的。它允许您设置缓存大小(config key storage.wiredTiger.engineConfig.cacheSizeGB)。当缓存大小足够大时,您再次拥有一个带有自动硬盘镜像的内存数据库。
the storage FAQ中有关于此的更多信息。
答案 2 :(得分:0)
您所谈论的是缩放问题。在扩展方面,您有两种选择:添加导致现有设置瓶颈的资源(通常更多RAM和更快的磁盘)或扩展您的设置。你应该首先添加资源,几乎到了添加资源不会给你带来额外收益的程度。
在某些时候,这种“向上扩展”将不再可行,你必须在更多节点之间分配负载。
MongoDB附带了一个在(逻辑)节点之间分配负载的功能:sharding。
基本上,它的工作方式如下:多个副本集各自形成一个称为分片的逻辑节点。每个分片依次只保存数据的子集。您不是直接连接到分片,而是通过mongos
query router对数据进行占用,该carefully selecting your shard key知道哪个分片包含数据以回答查询以及在何处编写新数据。
按{{3}},您的读写应均匀分布在分片之间。
附注:将生产数据放在独立实例而不是副本集上会超出我书中疏忽的边界。鉴于今天(租用)硬件的价格,消除单点故障比使用MongoDB副本集更容易。