docker pull mongodocker network create mongors-clusterdocker network lsdocker run --name=mongodb1 --restart=always --log-opt max-size=1000m -d \ -p 27017:27017 \ -v /data/mongodb/data1:/data/db \ --net mongors-cluster \ mongo --replSet "rs"docker run --name=mongodb2 --restart=always --log-opt max-size=1000m -d \ -p 27018:27017 \ -v /data/mongodb/data2:/data/db \ --net mongors-cluster \ mongo --replSet "rs"
echo "# mongod.confstorage: dbPath: /data/db journal: enabled: truesystemLog: logAppend: truenet: bindIp: 0.0.0.0 port: 27017replication: replSetName: rssecurity: authorization: enabled keyFile: /data/autokeysetParameter: enableLocalhostAuthBypass: true" > /data/mongodb/mongo1/mongod.confcp /data/mongodb/mongo1/mongod.conf /data/mongodb/mongo2/mongod.confopenssl rand -base64 756 > /data/mongodb/mongo1/autokeychmod 400 /data/mongodb/mongo1/autokeycp /data/mongodb/mongo1/autokey /data/mongodb/mongo2/autokeychown 999 /data/mongodb/mongo1/autokey /data/mongodb/mongo2/autokeydocker run --name=mongodb1 --restart=always --log-opt max-size=1000m -d \ -p 27017:27017 \ -v /data/mongodb/mongo1:/data \ -v /data/mongodb/mongo1/db:/data/db \ -v /data/mongodb/mongo1/configdb:/data/configdb \ --net mongors-cluster \ mongo --config /data/mongod.confdocker run --name=mongodb2 --restart=always --log-opt max-size=1000m -d \ -p 27018:27017 \ -v /data/mongodb/mongo2:/data \ -v /data/mongodb/mongo2/db:/data/db \ -v /data/mongodb/mongo2/configdb:/data/configdb \ --net mongors-cluster \ mongo --config /data/mongod.conf# enableLocalhostAuthBypass用于完全没有用户定义但在MongoDB上启用了auth并且您根本不想连接的情况.# 它并不意味着完全关闭localhost的身份验证.# 只要您定义了用户,则enabledLocalhostAuthBypass将不执行任何操作,您必须先进行身份验证.# 第一次登录: 定义用户前$ docker exec -it mongodb1 mongo# 第二次登录: 定义用户后$ docker exec -it mongodb1 mongo -u root -p mongors123456# URI连接字符串mongodb://user:pass@ip1:port1,ip2:port2/?authSource=admin&replicaSet=rs&readPreference=primary&appname=MongoDB%20Compass&ssl=falsemongodb://root:mongors123456@127.0.0.1:27017,127.0.0.1:27018/?authSource=admin&replicaSet=rs&readPreference=primary&appname=MongoDB%20Compass&ssl=false
#1 errorstd::exception::what(): boost::filesystem::status: Permission denied: "/data/mongod.conf"Actual exception type: boost::filesystem::filesystem_error#fix 映射到 /data 的目录必须把所有者设置成 999(mongodb)# -v $HOME/docker/mongo/mongo1:/datachown 999 $HOME/docker/mongo/mongo1chmod 770 $HOME/docker/mongo/mongo1#2 error"error":{"code":30,"codeName":"InvalidPath","errmsg":"permissions on /data/autokey are too open"}#fix 因为权限太大,需要降低权限chmod 600 $HOME/docker/mongo/mongo1/autokey#3 error"error":{"code":30,"codeName":"InvalidPath","errmsg":"error opening file: /data/autokey: bad file"}#fix autokey 文件的所有者必须是 999(mongodb)chown 999 $HOME/docker/mongo/mongo1/autokey#4 error"msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"Error reading file /home/admin/data/mongo1/autokey: No such file or directory"}}大概率是配置文件里写了错误的路径
docker inspect mongodb1
docker inspect mongodb1 | grep IPAddress
docker update --restart=always mongodb1 mongodb2
docker restart mongodb1 mongodb2
docker stop mongodb1 mongodb2 && docker rm mongodb1 mongodb2
mongo --host 172.18.0.2 --port 27017 -u root -p mongors123456
--smallfiles --oplogSize 128
# 启动副本集
> rs.initiate({
"_id" : "rs",
"members" : [
{"_id": 0, "host": "mongodb1:27017"},
{"_id": 1, "host": "mongodb2:27017"},
]
})
{ "ok" : 1 }
> rs.initiate({
"_id" : "rs",
"members" : [
{"_id": 0, "host": "127.0.0.1:27017"},
{"_id": 1, "host": "127.0.0.1:27018"},
]
})
{ "ok" : 1 }
> rs.initiate({
"_id" : "rs",
"members" : [
{"_id": 0, "host": "mongo1:27017"},
{"_id": 1, "host": "mongo2:27017"},
]
})
{ "ok" : 1 }
rs:SECONDARY>
rs:PRIMARY>
rs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
rs:SECONDARY> rs.secondaryOk()
# 创建用户必须在主节点和admin库上
rs:PRIMARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("616fe12aae8ca456ca2144af"),
"counter" : NumberLong(6)
},
"hosts" : [
"mongo1:27017",
"mongo2:27017"
],
"setName" : "rs",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "mongo2:27017",
"me" : "mongo2:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1634723214, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2021-10-20T09:46:54Z"),
"majorityOpTime" : {
"ts" : Timestamp(1634723214, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2021-10-20T09:46:54Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2021-10-20T09:46:54.781Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 16,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1634723214, 1),
"signature" : {
"hash" : BinData(0,"FzJNWuymE1i1yZOd6hE1rQ5Ut+E="),
"keyId" : NumberLong("7021079005520461827")
}
},
"operationTime" : Timestamp(1634723214, 1)
}
rs:PRIMARY>
> use admin
switched to db admin
> db.createUser({
user: "root",
pwd: "mongors123456",
roles: [ { role: "root", db: "admin" } ]
})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
> db.auth("root","mongors123456")
1
> show users
{
"_id" : "admin.root",
"userId" : UUID("143ca2db-1cc7-4b38-921b-7ee121fe4ff4"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.dropUser("root")
true
# 测试复制
> db.getName()
test
> db.test.insert({name : 'sample'})
WriteResult({ "nInserted" : 1 })
# 无密码
> db2 = (new Mongo('mongodb2:27017')).getDB('test')
# 有密码
> db2 = (new Mongo('mongodb://root:mongors123456@mongodb2:27017')).getDB('test')
test
# 废弃,不推荐使用
> db2.setSlaveOk()
WARNING: setSlaveOk() is deprecated and may be removed in the next major release. Please use setSecondaryOk() instead.
> db2.setSecondaryOk()
> db2.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
# 测试事务-回滚
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
> session = db.getMongo().startSession()
session { "id" : UUID("b7f8b918-6754-4eee-8ab0-f0c4e87e1543") }
> db = session.getDatabase('test')
test
> session.startTransaction()
> db.test.insert({"name":"docker in action"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a511273e6a16645764531"), "name" : "docker in action" }
> session.abortTransaction()
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
# 测试事务-提交
> session.startTransaction()
> db.test.insert({"name":"docker in action"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a51cf73e6a16645764532"), "name" : "docker in action" }
> session.commitTransaction()
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a51cf73e6a16645764532"), "name" : "docker in action" }
> rs.conf()
> rs.status()