原文:https://www.yuque.com/wfzx/ninzck/dagu5akm0ztfuobw?singleDoc# 《基于Docker的MongoDB集群搭建》
實(shí)驗(yàn)環(huán)境
虛擬主機(jī)
在Window 10上使用 VMware 開啟四個(gè) Ubuntu 18 的虛擬主機(jī)。
MongoDB A:192.168.204.156(主節(jié)點(diǎn))
MongoDB B:192.168.204.157
MongoDB C:192.168.204.158
MongoDB D:192.168.204.159
host 配置
host文件位于 C:\Windows\System32\drivers\etc\hosts
192.168.204.156 mongodba
192.168.204.157 mongodbb
192.168.204.158 mongodbc
192.168.204.159 mongodbd
拉取MongDB 的鏡像
實(shí)驗(yàn)的MongoDB版本:MongoDB server version: 5.0.5
# 查詢鏡像
root@ubuntu:/home/liangshijie/mongodb-docker-file# docker search mongodb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mongo MongoDB document databases provide high avai… 9439 [OK]
mongo-express Web-based MongoDB admin interface, written w… 1279 [OK]
bitnami/mongodb Bitnami MongoDB Docker Image 205 [OK]
percona/percona-server-mongodb Percona Server for MongoDB docker images 36
rapidfort/mongodb RapidFort optimized, hardened image for Mong… 15
circleci/mongo CircleCI images for MongoDB 12 [OK]
bitnami/mongodb-sharded 9
...
# 拉取第一個(gè)
docker pull mongo
集群配置
官方文檔:https://www.mongodb.com/compatibility/docker
一、配置主節(jié)點(diǎn)
1.準(zhǔn)備
# 創(chuàng)建基本目錄
cd /home/liangshijie/mongodb-docker-file
# 要注意創(chuàng)建的文件夾docker進(jìn)程是否有權(quán)限操作
mkdir data
mkdir log
mkdir conf
chmod 777 data
# 創(chuàng)建日志文件。 # 提高權(quán)限,不然權(quán)限錯(cuò)誤
touch ./log/mongod.log
chmod 777 ./log/mongod.log
# 生成密鑰文件。
# 后續(xù)要將密鑰文件拷貝到從服務(wù)器,所以在降低key.file密鑰文件權(quán)限前,你可能需要先將其拷貝到其它服務(wù)器。
openssl rand -base64 756 > ./conf/key.file
# 降低權(quán)限,不然權(quán)限錯(cuò)誤
chmod 400 ./conf/key.file
# 創(chuàng)建配置文件。具體內(nèi)容看后面
vim ./conf/mongod.conf.orig
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb # 數(shù)據(jù)存儲(chǔ)的目錄,默認(rèn)就好
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file # 日志寫入到文件
logAppend: true # 追加的方式
path: /var/log/mongodb/mongod.log # 日志文件位置,默認(rèn)就好
# network interfaces
#net:
# port: 27017
# bindIp: 127.0.0.1
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#security:
#security:
# keyFile: /data/configdb/key.file # 集群節(jié)點(diǎn)之間使用我們生成的密鑰進(jìn)行權(quán)限驗(yàn)證
#replication:
# replSetName: mongoCluster # 指定集群名稱
net:
bindIp: mongodba # 要綁定的地址,一般不寫IP
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
??溫馨提示,后續(xù)要將密鑰文件拷貝到服務(wù)器,所以在降低
key.file
密鑰文件權(quán)限前,你可能需要先將其拷貝到其它服務(wù)器。
2.啟動(dòng)
docker run -u root --name mongodb -d -p 27017:27017 \
-v /home/liangshijie/mongodb-docker-file/data:/var/lib/mongodb \
-v /home/liangshijie/mongodb-docker-file/conf:/data/configdb \
-v /home/liangshijie/mongodb-docker-file/log:/var/log/mongodb \
--hostname="mongodba" \
mongo --config /data/configdb/mongod.conf.orig
??由于指定了日志文件的位置,所以使用容器命令
docker logs -f
是不會(huì)打印日志的,日志輸出到這個(gè)位置了:./log/mongod.log。
??配置文件mongod.conf.orig
的位置指定的是容器內(nèi)的位置。
??如果只是想快速啟動(dòng)一個(gè) MongoDB 容器,可以使用這條命令:docker run --name mongodb -d -p 27017:27017 -v /home/liangshijie/mongodb-docker-file/data:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo
3.創(chuàng)建用戶
# 進(jìn)入容器
docker exec -it <容器ID> bash
cd /usr/bin
mongo --host mongodba
# 創(chuàng)建管理員用戶(用于登錄主節(jié)點(diǎn)初始化集群)
db.createUser( {
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
});
# 創(chuàng)建讀寫用戶(可以后面再創(chuàng)建,用于主節(jié)點(diǎn)的讀寫操作,在從節(jié)點(diǎn)登錄只能只讀)
db.createUser({ user:'user',pwd:'123456',roles:[ { role:'readWrite', db: 'study'}]});
# 退出
exit
4.配置密鑰
集群通信需要密鑰。
vim ./conf/mongod.conf.orig
# 在上面的配置文件中,我已經(jīng)寫好了配置,只需要把下面的注釋放開即可:
security:
keyFile: /data/configdb/key.file # 集群節(jié)點(diǎn)之間使用我們生成的密鑰進(jìn)行權(quán)限驗(yàn)證
replication:
replSetName: mongoCluster # 指定集群名稱
# 可選,降低配置文件的權(quán)限
chmod 400 ./conf/mongod.conf.orig
??為什么之前不放開配置?因?yàn)橐辉绶砰_的話沒有權(quán)限創(chuàng)建用戶,等創(chuàng)建好用戶再放開。
5.重啟
docker restart <容器ID>
6.初始化集群
# 進(jìn)入容器
docker exec -it <容器ID> bash
cd /usr/bin
# 登錄
mongo --host mongodba
# 認(rèn)證
db.auth("root","123456")
# 初始化
rs.initiate()
# 結(jié)果如下:
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "mongodba:27017",
"ok" : 1
}
# 查看狀態(tài)
rs.status()
# 在從節(jié)點(diǎn)已經(jīng)就緒的情況下,我們也可以通過下面配置初始化集群。
var cfg ={"_id":"heroMongoCluster",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"mongodba:27017","priority":10},
{"_id":2,"host":"mongodbb:27017","priority":1},
{"_id":2,"host":"mongodbc:27017","priority":1},
{"_id":2,"host":"mongodbd:27017","priority":1}
]
};
rs.initiate(cfg)
二、配置從節(jié)點(diǎn)
1.準(zhǔn)備
從節(jié)點(diǎn)跳過生成密鑰的步驟。
# 創(chuàng)建基本目錄
cd /home/liangshijie/mongodb-docker-file
# 要注意創(chuàng)建的文件夾docker進(jìn)程是否有權(quán)限操作
mkdir data
mkdir log
mkdir conf
chmod 777 data
# 創(chuàng)建日志文件。 # 提高權(quán)限,不然權(quán)限錯(cuò)誤
touch ./log/mongod.log
chmod 777 ./log/mongod.log
# 創(chuàng)建配置文件。具體復(fù)制后面的
vim ./conf/mongod.conf.orig
# 最后降低權(quán)限(可選)
chmod 400 ./conf/mongod.conf.orig
跟主節(jié)點(diǎn)配置不一樣的地方就是,一開始就放開 security 的注釋,在這里,需要注意修改bindIp的值,完整配置如下:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb # 數(shù)據(jù)存儲(chǔ)的目錄,默認(rèn)就好
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file # 日志寫入到文件
logAppend: true # 追加的方式
path: /var/log/mongodb/mongod.log # 日志文件位置,默認(rèn)就好
# network interfaces
#net:
# port: 27017
# bindIp: 127.0.0.1
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#security:
security:
keyFile: /data/configdb/key.file # 集群節(jié)點(diǎn)之間使用我們生成的密鑰進(jìn)行權(quán)限驗(yàn)證
replication:
replSetName: mongoCluster # 指定集群名稱
net:
bindIp: mongodbb # 要綁定的地址,一般不寫IP
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
2.復(fù)制主節(jié)點(diǎn)的密鑰文件
將主節(jié)點(diǎn)的 key.file 文件復(fù)制到從節(jié)點(diǎn)的 ./conf 目錄下。(不拷貝文件也行,cat輸出文件內(nèi)容,復(fù)制粘貼也是可以的)
??遇到拷貝不進(jìn)conf的情況,請檢查目錄權(quán)限。 chmod 777 ./conf 開放上傳之后,再 chmod 755 ./conf 收回。
注意,conf目錄下的 key.file 權(quán)限是 400。 配置文件是 755
3.啟動(dòng)
docker run --name mongodb -d -p 27017:27017 \
-v /home/liangshijie/mongodb-docker-file/data:/var/lib/mongodb \
-v /home/liangshijie/mongodb-docker-file/conf:/data/configdb \
-v /home/liangshijie/mongodb-docker-file/log:/var/log/mongodb \
--hostname="mongodbb" \
mongo --config /data/configdb/mongod.conf.orig
同理,其它幾個(gè)從節(jié)點(diǎn)也是這樣配置,注意,要改一下配置文件中 bindIp
屬性,以及啟動(dòng)命令中--hostname
的屬性。
三、在主節(jié)點(diǎn)中新增、刪除從節(jié)點(diǎn)
新增從節(jié)點(diǎn)
??你需要確保主、從節(jié)點(diǎn)容器之間能正常通信。如果你想在容器內(nèi)測試能不能ping同其它主機(jī)的mongo服務(wù),可以在容器內(nèi)安裝ping:
apt-get update
apt-get install iputils-ping
# 進(jìn)入主節(jié)點(diǎn)的mongodb容器
docker exec -it <容器ID> bash
cd /usr/bin
# 登錄
mongo --host mongodba
# 認(rèn)證
db.auth("root","123456")
# 增加從節(jié)點(diǎn)
rs.add("mongodbb:27017")
# 執(zhí)行結(jié)果:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1675486280, 1),
"signature" : {
"hash" : BinData(0,"cwO0f4QXhKNfNGKZstysMTqrQ9w="),
"keyId" : NumberLong("7196151896959090692")
}
},
"operationTime" : Timestamp(1675486280, 1)
}
rs.add("mongodbc:27017")
rs.add("mongodbd:27017")
刪除從節(jié)點(diǎn)(選看)
# 刪除slave 節(jié)點(diǎn)
rs.remove("172.17.187.80:37019")
查看配置(選看)
rs.conf()
{
"_id" : "mongoCluster",
"version" : 9,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "mongodba:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongodbb:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "mongodbc:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "mongodbd:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
],
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("63ddde05097f7140da2e9c0a")
}
}
查看狀態(tài)(選看)
執(zhí)行 rs.status()
查看狀態(tài),在 members
屬性中可以看到節(jié)點(diǎn)列表信息。
rs.status()
{
"set" : "mongoCluster",
"date" : ISODate("2023-02-04T04:52:11.084Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 2,
"writableVotingMembersCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"lastDurableWallTime" : ISODate("2023-02-04T04:52:08.443Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1675486292, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2023-02-04T04:24:38.141Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1675484677, 1),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1675484677, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2023-02-04T04:24:38.243Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2023-02-04T04:24:38.285Z")
},
"members" : [
{
"_id" : 0,
"name" : "mongodba:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1932,
"optime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-02-04T04:52:08Z"),
"lastAppliedWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"lastDurableWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1675484678, 1),
"electionDate" : ISODate("2023-02-04T04:24:38Z"),
"configVersion" : 4,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "172.17.187.80:37019",
"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"),
"lastAppliedWallTime" : ISODate("1970-01-01T00:00:00Z"),
"lastDurableWallTime" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2023-02-04T04:52:09.266Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Error connecting to 172.17.187.80:37019 :: caused by :: No route to host",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : -1,
"configTerm" : -1
},
{
"_id" : 2,
"name" : "mongodbb:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 50,
"optime" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1675486328, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-02-04T04:52:08Z"),
"optimeDurableDate" : ISODate("2023-02-04T04:52:08Z"),
"lastAppliedWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"lastDurableWallTime" : ISODate("2023-02-04T04:52:08.443Z"),
"lastHeartbeat" : ISODate("2023-02-04T04:52:10.446Z"),
"lastHeartbeatRecv" : ISODate("2023-02-04T04:52:11.046Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "mongodba:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 4,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1675486328, 1),
"signature" : {
"hash" : BinData(0,"qdS8hsuZZ6jdGUDjvFV2bKIFxkE="),
"keyId" : NumberLong("7196151896959090692")
}
},
"operationTime" : Timestamp(1675486328, 1)
}
四、從節(jié)點(diǎn)跟主節(jié)點(diǎn)進(jìn)行同步
??容器重啟一般要重新進(jìn)行同步文章來源:http://www.zghlxwxcb.cn/news/detail-472387.html
use study
# 登錄從節(jié)點(diǎn), 執(zhí)行同步語句
db.auth("user", "123456")
# 同步。低版本的命令: rs.slaveOk()
rs.secondaryOk()
show dbs
五、測試
# 進(jìn)入主節(jié)點(diǎn)執(zhí)行
docker exec -it <容器ID> bash
cd /usr/bin
mongo --host mongodba
db.auth("user","123456")
use study
db.myt.insertMany([
{xm:"李四",age:24},
{xm:"王五",age:25},
{xm:"趙六",age:26},
{xm:"李四",age:34},
{xm:"王五",age:35},
{xm:"趙六",age:36}
])
db.myt.insertMany([
{xm:"孫七",age:44},
])
# 登錄從節(jié)點(diǎn)
use study
db.auth("user", "123456")
use study
db.myt.find()
補(bǔ)充:重新加載集群配置,重新生成集群節(jié)點(diǎn)
var cfg ={"_id":"heroMongoCluster",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"172.17.187.80:37017","priority":10},
{"_id":2,"host":"172.17.187.80:37018","priority":0},
{"_id":3,"host":"172.17.187.80:37019","priority":5},
{"_id":4,"host":"172.17.187.80:37020","arbiterOnly":true}
]
};
// 重新裝載配置,并重新生成集群節(jié)點(diǎn)。
rs.reconfig(cfg)
補(bǔ)充:添加仲裁節(jié)點(diǎn)
rs.addArb("172.17.187.80:37020")
附:復(fù)制集成員的配置參數(shù)
文章來源地址http://www.zghlxwxcb.cn/news/detail-472387.html
附:關(guān)于常見角色
內(nèi)置角色
- read:允許用戶讀取指定數(shù)據(jù)庫
- readWrite:允許用戶讀寫指定數(shù)據(jù)庫
- dbAdmin:允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問
- userAdmin:允許用戶向system.users集合寫入,可以找指定數(shù)據(jù)庫里創(chuàng)建、刪除和管理用戶
- clusterAdmin:只在admin數(shù)據(jù)庫中可用,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限
- readAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限
- readWriteAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限
- userAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限
- dbAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的dbAdmin權(quán)限
- root:只在admin數(shù)據(jù)庫中可用。超級賬號,超級權(quán)限
- dbOwner:庫擁有者權(quán)限,即readWrite、dbAdmin、userAdmin角色的合體
角色分類
- 數(shù)據(jù)庫用戶角色:read、readWrite
- 數(shù)據(jù)庫管理角色:dbAdmin、dbOwner、userAdmin
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
- 備份恢復(fù)角色:backup、restore;
- 所有數(shù)據(jù)庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級用戶角色:root
- 這里還有幾個(gè)角色間接或直接提供了系統(tǒng)超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
到了這里,關(guān)于基于Docker的MongoDB集群搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!