我在 MongoDB 和空间使用方面遇到了一些麻烦。特别是,我曾经在磁盘上收集了大约 6 亿条记录,总计 110+ GB。最近我决定放弃它,因为数据已经过时了,为此我通过 Rockmongo 的 Web 界面放弃了收藏。因此,rockmongo 不再向我显示该集合,但是我的磁盘使用情况根本没有改变。
是否有任何我不知道的清理操作,必须运行这些操作才能将数据库与磁盘上的数据库文件同步?
我试图执行“修复”,但系统抱怨磁盘空间不足……那是因为它都被 MongoDB 使用了。
我正在遵循中提到的说明:
在 Ubuntu 中安装和配置 MongoDB 的基本元素。在“配置 MongoDB 用户名和密码”期间,在第 4 阶段“第 4 步 - 启用 mongodb 身份验证”中出现错误。
$ systemd daemon-reload
Excess arguments.
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
这是非常依赖于系统的,但很有可能我们会跨越某个任意的悬崖并进入真正的麻烦。我很好奇对于良好的 RAM 与磁盘空间比率存在什么样的经验法则。我们正在计划我们的下一轮系统,需要就 RAM、SSD 以及每个新节点将获得多少做出一些选择。
但是现在要了解一些性能细节!
在单个项目运行的正常工作流中,MongoDB 的写入百分比非常高(70-80%)。一旦处理管道的第二阶段命中,它的读取量就会非常高,因为它需要对处理的前半部分中识别的记录进行重复数据删除。这是“将您的工作集保存在 RAM 中”的工作流程,我们正在围绕该假设进行设计。
整个数据集不断受到来自最终用户派生源的随机查询的影响;尽管频率不规则,但大小通常很小(10 个文档为一组)。由于这是面向用户的,因此回复需要低于 3 秒的“现在无聊”阈值。这种访问模式在缓存中的可能性要小得多,因此很可能会导致磁盘命中。
二次处理工作流是对可能长达数天、数周甚至数月的先前处理运行的大量读取,并且不经常运行但仍需要快速运行。将访问上次处理运行中多达 100% 的文档。我怀疑,再多的缓存预热也无济于事。
完成的文档大小差异很大,但平均大小约为 8K。
正常项目处理的高读取部分强烈建议使用副本来帮助分配读取流量。我在别处读到1:10 RAM-GB 到 HD-GB 是慢磁盘的一个很好的经验法则,因为我们正在认真考虑使用更快的 SSD,我想知道是否有类似的规则快速磁盘的拇指。
我知道我们使用 Mongo 的方式是缓存所有东西真的不会飞,这就是为什么我正在寻找方法来设计一个可以在这种使用中幸存下来的系统。在整个数据集将可能是最结核病的半年内,并保持增长。
正如问题标题所暗示的那样,我很难弄清楚可以在我的应用程序上进行哪些改进(或在 os、ubuntu 中进行调整)以达到可接受的性能。但首先我将解释架构:
前端服务器是一台运行 Ubuntu 12.04 的 8 核机器,具有 8 个演出内存。该应用程序完全用 javascript 编写并在 node.js v 0.8.22 中运行(因为某些模块似乎在较新版本的节点上抱怨)我使用 nginx 1.4 将 http 流量从端口 80 和 443 代理到被管理的 8 个节点工作器并开始使用节点集群 api。我使用最新版本的 socket.io 0.9.14 来处理 websocket 连接,我只启用了 websockets 和 xhr-polling 作为可用传输。在这台机器上,我还运行了一个 Redis(2.2) 实例
我将持久数据(如用户和分数)存储在 mongodb(3.6) 上的第二台服务器上,具有 4gigs RAM 和 2 个内核。
该应用程序从几个月开始就投入生产(直到几周前它一直在一个机器上运行)并且每天有大约 18,000 名用户使用它。除了一个主要问题:性能下降之外,它一直工作得很好。随着使用,每个进程使用的 cpu 量会增加,直到它达到工作人员(不再为请求提供服务)为止。我暂时解决了它每分钟检查每个工人正在使用的cpu,如果达到98%则重新启动它。所以这里的问题主要是cpu,而不是RAM。RAM不再是问题,因为我已经更新到socket.io 0.9.14(早期版本正在泄漏内存)所以我怀疑这是一个内存泄漏问题,特别是因为现在它是cpu增长相当快(我必须每天重启每个工人大约 10-12 次!)。老实说,正在使用的 RAM 也在增长,但是很慢,每使用 2-3 天 1 gig,奇怪的是,即使我完全重新启动整个应用程序,它也没有发布。只有在我重新启动服务器时才会释放它!这我真的无法理解......
我现在发现nodefly很棒,所以我终于可以看到我的生产服务器上发生了什么,并且我从几天开始收集数据。如果有人想查看图表,我可以让您访问,但基本上我可以看到我有 80 到 200 个并发连接!我期待 node.js 处理数千个请求,而不是数百个请求。此外,http 流量的平均响应时间在 500 到 1500 毫秒之间浮动,我认为这确实很多。此外,在这个有 1300 个用户在线的时刻,这是“ss -s”的输出:
Total: …Run Code Online (Sandbox Code Playgroud) 在生产集群架构的 mongoDB 文档中,我读到运行的生产 mongoDB 集群的最小服务器数量是 7:
是否可以在同一台服务器上共享路由器、配置服务器和分片(总共有 3 个服务器,每个服务器都有一个路由器、配置和分片服务)?
我有一个专用服务器,其中包含大约 10GB 的 MongoDB 数据库。我需要每天进行备份,但我不能让数据库停机。是否可以在单个磁盘上使用副本集(在不同端口上运行 2 个 mongod 实例),并且只需将辅助磁盘脱机并将数据文件备份到 S3 等异地存储(日志已打开)?或者使用主/从比副本集更好?
这是否可行,如果可行,我可能会遇到哪些潜在问题?如果没有,我如何将其概念化以使其起作用?
我不是在谈论分片。我们有一个测试服务器 (linux),并且已经有一个mongo属于另一个项目/子团队。是否有可能运行多个孤立事件的mongodb一台机器上?我该怎么做?
从文档中,它说
“为了获得最佳性能,您的大部分活动集应该适合 RAM。”
例如,我db.stats()给我
{
"db" : "mydb",
"collections" : 16,
"objects" : 21452,
"avgObjSize" : 768.0516501957859,
"dataSize" : 16476244,
"storageSize" : 25385984,
"numExtents" : 43,
"indexes" : 70,
"indexSize" : 15450112,
"fileSize" : 469762048,
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
哪个值是working set size?
我有一个 Node.js 应用程序和一个在 AWS ECS 上运行的 MongoDB 数据库。我目前的设置由 2 个 ELB 和 2 个实例组成,每个实例运行一个 Docker 容器及其分配的服务(节点/mongo):
Elastic Load Balancer -> Dockerized Node -> Elastic Load Balancer -> Dockerized MongoDB
Run Code Online (Sandbox Code Playgroud)
我正在运行 MongoDB 的官方 Docker 映像:https : //registry.hub.docker.com/_/mongo/
关于如何使用 Docker 和 ECS 为 MongoDB 部署副本集的任何指示,每个副本都运行在不同的实例上?