Mongodb WiredTiger-和#x201C;打开的文件太多错误”;在次副本集成员的重新同步期间

Mongodb WiredTiger-和#x201C;打开的文件太多错误”;在次副本集成员的重新同步期间,mongodb,wiredtiger,Mongodb,Wiredtiger,我正在将辅助副本集成员升级到wiredTiger。我已经将它从MongoDB 2.6.3升级到3.0.4,并将存储引擎更改为wiredTiger。现在它正在重新同步主服务器上的所有数据。 在某个时刻,接收到以下错误,并且该过程重新开始: 2015-07-22T13:18:55.658+0000指数[rsSync]批量法建筑指数 2015-07-22T13:18:55.664+0000 I索引[rsSync]生成索引完成。共扫描了1591条记录。0秒 2015-07-22T13:18:56.397

我正在将辅助副本集成员升级到wiredTiger。我已经将它从MongoDB 2.6.3升级到3.0.4,并将存储引擎更改为wiredTiger。现在它正在重新同步主服务器上的所有数据。 在某个时刻,接收到以下错误,并且该过程重新开始:

2015-07-22T13:18:55.658+0000指数[rsSync]批量法建筑指数

2015-07-22T13:18:55.664+0000 I索引[rsSync]生成索引完成。共扫描了1591条记录。0秒

2015-07-22T13:18:56.397+0000 E存储[rsSync]WiredTiger(24)[1437571136:397083][20413:0x7f3d9ed29700],文件:WiredTiger.wt,session.create:WiredTiger.turtle:fopen: 打开的文件太多

2015-07-22T13:18:56.463+0000 E REPL[rsSync]8 24:打开的文件太多

2015-07-22T13:18:56.463+0000 E REPL[rsSync]初始同步尝试失败,剩余9次尝试

同一台计算机以前运行的是2.6.3版本,没有任何打开的文件限制问题。我知道wiredTiger可能会创建更多的文件,所以一定是这样,但它会同时打开所有文件吗

供参考:

cat/proc/sys/fs/file max

10747371

在/etc/init.d/mongod中,配置为:

乌利米特-n 64000

根据文档,mongo似乎为每个数据文件保存了一个文件描述符。在wiredTiger中,根据我们用例的计算,这会导致每个集合有一个文件+每个索引有一个文件,加起来可能超过700K

因此,我可以将ulimit更改为700000或更高,但我想知道这是否是最正确的解决方案,以及存在哪些替代方案。

WiredTiger将根据它们空闲的时间长短来确定,但在大量集合和索引的繁重活动中,您最终将受到打开文件上ulimit的限制


所以,是的,基本上你需要增加限制,直到你不再遇到问题,坚持使用MMAPv1,或者合并一些集合。我还建议提交一个功能请求,概述您的用例和示例编号,以防止这种模式(例如,每个文件有多个集合)。

您需要检查对流程本身施加的限制(不一定是系统范围的设置)。这里有一个方便的脚本可以为您实现这一点:我也检查了这个脚本-目前我的/etc/init.d/mongod脚本限制为64000。我认为这是不够的-就像wiredTiger一样,每个集合+每个索引都有一个单独的文件,因此对于100个集合的数据库和平均每个集合10-20个索引,我得到的是每个数据库1000-2000个文件,我们谈论的是数百个数据库。