«
MongoDB复制集

时间:2022-8-28     作者:李泽信     分类: MongoDB


一、MongoDB复制集概述

二、MongoDB复制集原理

三、部署MongoDB实现应用复制集

系统 主机名 IP 所需软件
centos7.8 mongodb 192.168.100.105 mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@mongodb ~]# tar xf mongodb-linux-x86_64-rhel70-3.6.3.tgz 
[root@mongodb ~]# mv mongodb-linux-x86_64-rhel70-3.6.3 /usr/local/mongodb
[root@mongodb ~]# echo "export PATH=/usr/local/mongodb/bin:\$PATH" >>/etc/profile
[root@mongodb ~]#  source /etc/profile
[root@mongodb ~]# ulimit -n 25000
[root@mongodb ~]# ulimit -u 25000
[root@mongodb ~]# echo 0 >/proc/sys/vm/zone_reclaim_mode
[root@mongodb ~]# sysctl -w vm.zone_reclaim_mode=0
vm.zone_reclaim_mode = 0
[root@mongodb ~]# echo never >/sys/kernel/mm/transparent_hugepage/enabled 
[root@mongodb ~]# echo never >/sys/kernel/mm/transparent_hugepage/defrag
[root@mongodb ~]# cd /usr/local/mongodb/bin/
[root@mongodb bin]# mkdir  {../mongodb1,../mongodb2,../mongodb3,../mongodb4}
[root@mongodb bin]# mkdir ../logs
[root@mongodb bin]# touch ../logs/mongodb{1..4}.log
[root@mongodb bin]# chmod 777 ../logs/mongodb*
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb1.conf
 bind_ip=192.168.100.105
 port=27017
 dbpath=/usr/local/mongodb/mongodb1/
 logpath=/usr/local/mongodb/logs/mongodb1.log
 logappend=true
 fork=true
 maxConns=5000
 replSet=haha
 #replication name
 END
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb2.conf
 bind_ip=192.168.100.105
 port=27018
 dbpath=/usr/local/mongodb/mongodb2/
 logpath=/usr/local/mongodb/logs/mongodb2.log
 logappend=true
 fork=true
 maxConns=5000
 replSet=haha
 END
[root@mongodb bin]# vi /usr/local/mongodb/bin/mongodb2.conf 
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb3.conf
 bind_ip=192.168.100.105
 port=27019
 dbpath=/usr/local/mongodb/mongodb3/
 logpath=/usr/local/mongodb/logs/mongodb3.log
 logappend=true
 fork=true
 maxConns=5000
 replSet=haha
 END
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb4.conf
 bind_ip=192.168.100.105
 port=27020
 dbpath=/usr/local/mongodb/mongodb4/
 logpath=/usr/local/mongodb/logs/mongodb4.log
 logappend=true
 fork=true
 maxConns=5000
 replSet=haha
 END
[root@mongodb bin]# cd 
[root@mongodb ~]# mongod -f  /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongod -f  /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# mongod -f  /usr/local/mongodb/bin/mongodb3.conf
[root@mongodb ~]# mongod -f  /usr/local/mongodb/bin/mongodb4.conf
[root@mongodb ~]# netstat -utpln |grep mongod
tcp        0      0 192.168.100.105:27019   0.0.0.0:*               LISTEN      1224/mongod         
tcp        0      0 192.168.100.105:27020   0.0.0.0:*               LISTEN      1252/mongod         
tcp        0      0 192.168.100.105:27017   0.0.0.0:*               LISTEN      1168/mongod         
tcp        0      0 192.168.100.105:27018   0.0.0.0:*               LISTEN      1196/mongod         
[root@mongodb ~]# echo -e "/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb1.conf \n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb2.conf\n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb3.conf\n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb4.conf">>/etc/rc.local
[root@mongodb ~]#  chmod +x /etc/rc.local
[root@mongodb ~]# cat <<END >>/etc/init.d/mongodb
 #!/bin/bash
 INSTANCE=\$1
 ACTION=\$2
 case "\$ACTION" in
 'start')
 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;
 'stop')
 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown;;
 'restart')
 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown
 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;
 esac
 END
[root@mongodb ~]# chmod +x /etc/init.d/mongodb
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 stop
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 start
[root@mongodb ~]# mongo --port 27017 --host 192.168.100.105
##添加节点
> cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.105:27017"},{"_id":1,"host":"192.168.100.105:27018"},{"_id":2,"host":"192.168.100.105:27019"}]}
{
    "_id" : "haha",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.100.105:27017"
        },
        {
            "_id" : 1,
            "host" : "192.168.100.105:27018"
        },
        {
            "_id" : 2,
            "host" : "192.168.100.105:27019"
        }
    ]
}

##初始化节点
> rs.initiate(cfg)
{
    "ok" : 1,
    "operationTime" : Timestamp(1661686022, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661686022, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
##查看复制群状态
haha:OTHER> rs.status()
{
    "set" : "haha",
    "date" : ISODate("2022-08-28T11:27:19.065Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1661686035, 3),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1661686035, 3),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1661686035, 3),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1661686035, 3),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.100.105:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",         ##主节点
            "uptime" : 452,
            "optime" : {
                "ts" : Timestamp(1661686035, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-08-28T11:27:15Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1661686033, 1),
            "electionDate" : ISODate("2022-08-28T11:27:13Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.100.105:27018",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",           ##从节点
            "uptime" : 16,
            "optime" : {
                "ts" : Timestamp(1661686035, 3),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1661686035, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-08-28T11:27:15Z"),
            "optimeDurableDate" : ISODate("2022-08-28T11:27:15Z"),
            "lastHeartbeat" : ISODate("2022-08-28T11:27:17.897Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:27:15.023Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.100.105:27017",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.100.105:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",           ##从节点
            "uptime" : 16,
            "optime" : {
                "ts" : Timestamp(1661686035, 3),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1661686035, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-08-28T11:27:15Z"),
            "optimeDurableDate" : ISODate("2022-08-28T11:27:15Z"),
            "lastHeartbeat" : ISODate("2022-08-28T11:27:17.896Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:27:15.018Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.100.105:27017",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1661686035, 3),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661686035, 3),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

##添加仲裁节点
haha:PRIMARY> rs.addArb("192.168.100.105:27020")
{
    "ok" : 1,
    "operationTime" : Timestamp(1661686116, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661686116, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

haha:PRIMARY> rs.status()
...
{
            "_id" : 3,
            "name" : "192.168.100.105:27020",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 19,
            "lastHeartbeat" : ISODate("2022-08-28T11:28:54.331Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:28:51.329Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 2
        }
        ...

注:rs.add()和rs.remove()命令分别用于添加和删除标准节点

haha:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
haha:PRIMARY> use cloud
switched to db cloud
haha:PRIMARY> db.users.insert({"id":"1","name":"xiaoming"})
WriteResult({ "nInserted" : 1 })
haha:PRIMARY> db.users.find()
{ "_id" : ObjectId("630b53a4c821b079238237d4"), "id" : "1", "name" : "xiaoming" }
haha:PRIMARY> exit
bye

[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:SECONDARY> show dbs        ##secondary节点默认无法读取
2022-08-28T19:39:49.549+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "operationTime" : Timestamp(1661686785, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661686785, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1
shellHelper.show@src/mongo/shell/utils.js:816:19
shellHelper@src/mongo/shell/utils.js:706:15

#通过以下方式或者驱动方式实现
haha:SECONDARY> db.getMongo().setSlaveOk();
haha:SECONDARY> show dbs
admin   0.000GB
cloud   0.000GB
config  0.000GB
local   0.000GB
haha:SECONDARY> use cloud
switched to db cloud
##secondary节点无法写入
haha:SECONDARY> db.users.insert({"id":"2","name":"xiaohong"})
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
haha:SECONDARY> db.users.find()
{ "_id" : ObjectId("630b53a4c821b079238237d4"), "id" : "1", "name" : "xiaoming" }
haha:SECONDARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown
[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:PRIMARY> rs.status()
{
    "set" : "haha",
    "date" : ISODate("2022-08-28T11:46:53.956Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1661687175, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1661687175, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1661687212, 1),
            "t" : NumberLong(2)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1661687212, 1),
            "t" : NumberLong(2)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.100.105:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",     ##无法访问
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2022-08-28T11:46:53.225Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:46:19.785Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "Connection refused",
            "configVersion" : -1
        },
        {
            "_id" : 1,
            "name" : "192.168.100.105:27018",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",     ##主节点
            "uptime" : 1748,
            "optime" : {
                "ts" : Timestamp(1661687212, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2022-08-28T11:46:52Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1661687191, 1),
            "electionDate" : ISODate("2022-08-28T11:46:31Z"),
            "configVersion" : 2,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "192.168.100.105:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",       ##从节点
            "uptime" : 1189,
            "optime" : {
                "ts" : Timestamp(1661687212, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1661687212, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2022-08-28T11:46:52Z"),
            "optimeDurableDate" : ISODate("2022-08-28T11:46:52Z"),
            "lastHeartbeat" : ISODate("2022-08-28T11:46:53.218Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:46:53.380Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.100.105:27018",
            "configVersion" : 2
        },
        {
            "_id" : 3,
            "name" : "192.168.100.105:27020",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",         ##仲裁节点
            "uptime" : 1097,
            "lastHeartbeat" : ISODate("2022-08-28T11:46:53.213Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T11:46:51.915Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 2
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1661687212, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661687212, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
haha:PRIMARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:PRIMARY> cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.105:27017","priority":100},{"_id":1,"host":"192.168.100.105:27018","priority":10},{"_id":2,"host":"192.168.100.105:27019","priority":10}]}
haha:PRIMARY> rs.reconfig(cfg)
haha:PRIMARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# mongo --port 27017 --host 192.168.100.105
haha:PRIMARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:SECONDARY> rs.status()
{
    "set" : "haha",
    "date" : ISODate("2022-08-28T12:04:41.351Z"),
    "myState" : 2,
    "term" : NumberLong(4),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1661688219, 1),
            "t" : NumberLong(4)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1661688219, 1),
            "t" : NumberLong(4)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1661688219, 1),
            "t" : NumberLong(4)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1661688219, 1),
            "t" : NumberLong(4)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.100.105:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2022-08-28T12:04:39.126Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T12:03:47.988Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "Connection refused",
            "configVersion" : -1
        },
        {
            "_id" : 1,
            "name" : "192.168.100.105:27018",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2022-08-28T12:04:39.126Z"),
            "lastHeartbeatRecv" : ISODate("2022-08-28T12:03:53.292Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "Connection refused",
            "configVersion" : -1
        },
        {
            "_id" : 2,
            "name" : "192.168.100.105:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 125,
            "optime" : {
                "ts" : Timestamp(1661688219, 1),
                "t" : NumberLong(4)
            },
            "optimeDate" : ISODate("2022-08-28T12:03:39Z"),
            "infoMessage" : "could not find member to sync from",
            "configVersion" : 4,
            "self" : true
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1661688219, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1661688219, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
haha:SECONDARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# netstat -utpln |grep mongod
tcp        0      0 192.168.100.105:27019   0.0.0.0:*               LISTEN      1918/mongod         
tcp        0      0 192.168.100.105:27020   0.0.0.0:*               LISTEN      1252/mongod         
tcp        0      0 192.168.100.105:27017   0.0.0.0:*               LISTEN      2024/mongod         
tcp        0      0 192.168.100.105:27018   0.0.0.0:*               LISTEN      2103/mongod
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> use local
switched to db local
haha:PRIMARY> rs.printSlaveReplicationInfo()        ##查看节点信息
source: 192.168.100.105:27017
    syncedTo: Sun Aug 28 2022 20:08:17 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
source: 192.168.100.105:27018
    syncedTo: Sun Aug 28 2022 20:08:17 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary
haha:PRIMARY> rs.printReplicationInfo()
configured oplog size:   990MB          ##oplog大小为990M
log length start to end: 2535secs (0.7hrs)
oplog first event time:  Sun Aug 28 2022 19:27:02 GMT+0800 (CST)
oplog last event time:   Sun Aug 28 2022 20:09:17 GMT+0800 (CST)
now:                     Sun Aug 28 2022 20:09:18 GMT+0800 (CST)
haha:PRIMARY> db.oplog.rs.stats()
{
    "ns" : "local.oplog.rs",
    "size" : 28427,
    "count" : 249,
    "avgObjSize" : 114,
    "storageSize" : 45056,
    "capped" : true,
    "max" : -1,
    "maxSize" : 1038090240,     ##单位是字节
...
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> use admin
switched to db admin
haha:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
haha:PRIMARY> exit
bye
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey1" >>/usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey2" >>/usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey3" >>/usr/local/mongodb/bin/mongodb3.conf
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey1
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey2
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey3
[root@mongodb ~]# chmod 600 /usr/local/mongodb/bin/cloudkey*
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 restart
[root@mongodb ~]# /etc/init.d/mongodb mongodb2 restart
[root@mongodb ~]# /etc/init.d/mongodb mongodb3 restart
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> show dbs
2022-08-28T20:15:53.475+0800 E QUERY    [thread1] Error: listDatabases failed:{
...
haha:PRIMARY> use admin
switched to db admin
haha:PRIMARY> db.auth("root","123")
1
haha:PRIMARY> show dbs
admin   0.000GB
cloud   0.000GB
config  0.000GB
local   0.000GB
haha:PRIMARY> exit
bye