我已经在 MMAPv1 存储引擎下运行 MongoDB 好几年了,但现在需要升级到 WiredTiger。(主要是因为我可以使用事件流,也是因为 mmapv1 已经已弃用)。
我的应用程序为每个客户使用少量集合,这意味着有很多集合。由于 MMAPv1 的命名空间文件限制,这些集合被拆分到多个数据库中。分片不是必需的,因为虽然有很多集合,但它们并不大。基本上,这工作正常且稳定。
然而,在我的开发环境(Mac OS)中切换到 WiredTiger 后,我注意到 WiredTiger 不仅对每个集合和每个索引使用单独的文件,而且启动该mongod
过程时我发现在访问任何集合之前所有文件都已打开。
我估计将我的生产环境(CentOS 7)迁移到使用 wiredTiger 最终可能会得到近一百万个文件,而且这个数字还会增长。
我已意识到 ulimit 问题,并已阅读文档。该建议称受到推崇的ulimit 为 64,000。令我担心的是,这比我最终得到的结果要低得多。
所以我的问题是......
所有文件同时打开是正常的吗?或者听起来我做错了什么?
这仅仅是 Mac 的问题吗?(我还没有在 Linux 上测试迁移)
如果我设置得过高
ulimit
,这会对服务器产生任何负面影响吗?
答案1
通常,mongodb 使用连接池,您可以使用 net.maxIncomingConnections 运行时选项限制传入连接的数量。通过限制传入连接的数量,您可以防止 mongos 在 mongod 实例上创建过多连接的级联效应。
关于你的问题我的回答如下:
一次打开所有文件是否正常?或者听起来我做错了什么?我的回答:建立持久连接(池)的过程并没有错,因为建立连接是成本更高的操作。
这仅仅是 Mac 的问题吗?(我还没有在 Linux 上测试迁移):我的回答:它将以相同的方式工作,只有变化会对每个环境造成限制。
如果我设置了一个非常高的 ulimit,这会对服务器产生任何负面影响吗?我的回答:一旦更改限制,它肯定会影响系统资源消耗,请尝试获取应用程序所需的具有打开线程的连接数并相应地调整设置。
希望以上解答能够帮助到您。