MongoDB坚持使用“索引构建:耗尽构建期间收到的写入”消息创建索引

问题描述

我在test集合中有4行:

{ "_id" : ObjectId("5f4ce50e19b13337216dd477"),"test" : 1 }
{ "_id" : ObjectId("5f4ce50e19b13337216dd478"),"test" : 2 }
{ "_id" : ObjectId("5f4ce50e19b13337216dd479"),"test" : 3 }
{ "_id" : ObjectId("5f4ce50e19b13337216dd47a"),"test" : 4 }

运行db.test.createIndex({test:1},{background:1});创建索引后,它会挂起。它挂了至少几个小时。这是我在db.currentOp()中找到的有关此操作的信息:

{
    "type" : "op","host" : "HOSTNAME:27017","desc" : "IndexBuildsCoordinatorMongod-13","active" : true,"currentOpTime" : "2020-08-31T12:11:13.159+00:00","opid" : 8721867,"secs_running" : NumberLong(20),"microsecs_running" : NumberLong(20888590),"op" : "command","ns" : "test.test","command" : {
        "createIndexes" : "test","indexes" : [
            {
                "v" : 2,"key" : {
                    "test" : 1
                },"name" : "test_1","background" : 1
            }
        ],"lsid" : {
            "id" : UUID("07b43083-8ab9-4bcb-8768-919a3f27655f")
        },"$clusterTime" : {
            "clusterTime" : Timestamp(1598875647,409),"signature" : {
                "hash" : BinData(0,"+/YcdPyQriT8RL1LtFUhxe2BtCE="),"keyId" : NumberLong("6861636045532823556")
            }
        },"$db" : "test"
    },"msg" : "Index Build: draining writes received during build","numYields" : 0,"locks" : {

    },"waitingForLock" : false,"lockStats" : {
        "ReplicationStateTransition" : {
            "acquireCount" : {
                "w" : NumberLong(6)
            }
        },"Global" : {
            "acquireCount" : {
                "r" : NumberLong(1),"w" : NumberLong(4)
            }
        },"Database" : {
            "acquireCount" : {
                "r" : NumberLong(1),"Collection" : {
            "acquireCount" : {
                "r" : NumberLong(1),"w" : NumberLong(3),"W" : NumberLong(1)
            }
        },"Mutex" : {
            "acquireCount" : {
                "r" : NumberLong(4)
            }
        }
    },"waitingForFlowControl" : false,"flowControlStats" : {
        "acquireCount" : NumberLong(3),"timeAcquiringMicros" : NumberLong(1)
    }
}

Index Build: draining writes received during build毫无意义,因为在创建索引期间没有对test集合进行读写操作。

索引创建也仅挂在非空集合中。索引在空集合中成功创建。

在这种情况下可能是什么问题?我没主意了。

解决方法

最后在MongoDB团队的帮助下解决了这个问题。 The node can't communicate with itself so it will hang trying to commit the index build.这就是原因。添加密钥文件解决了该问题:

rm -f mongo.keyfile
openssl rand -base64 756 > mongo.keyfile
chmod 400 mongo.keyfile
 
bin/mongod --config mongo.conf --keyFile mongo.keyfile

以下是涉及此主题的MongoDB的Jira问题的链接: https://jira.mongodb.org/browse/SERVER-50665https://jira.mongodb.org/browse/SERVER-48516

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...