1、mongodb叢集
首先我們需要了解mongodb的叢集模式,mongodb安裝分為單機安裝和叢集安裝。叢集安裝分為:主從複製(Master-Slaver)叢集、副本集(Replica Set)叢集和分片叢集(Sharded Cluster)。MongoDB的主從複製(Master-Slave Replication)已不再是官方推薦的特性,並且在未來的版本中可能會被移除。MongoDB官方推薦使用副本集(Replica Set)作為高可用性的解決方案。
1.1主從複製存在的問題
- 單點故障:Master節點故障時,沒有自動故障轉移機制。
- 資料量有限:Slave節點資料通常不可寫,限制了資料總量的增長。
- 延遲和同步問題:Slave節點可能會落後於Master,導致資料延遲。
- 資源利用率低:需要額外資源來執行Slave節點。
1.2 副本集的優點
- 自動故障轉移。
- 讀寫分離,能提供更好的讀擴充套件能力。
- 副本整合員可配置為arbiter(仲裁),提供投票決定誰是主節點。
1.3 分片叢集
- 用於跨多個伺服器分佈資料的方法,用於支援非常大的資料集和高吞吐量的操作
2、副本集節點選擇
一個副本集最多有50個節點並且最多支援7個投票節點,其餘節點必須是沒有投票權的節點。副本集透過設定priority決定優先順序,預設優先順序為1,priority值是0到100之間的數字,數字越大優先順序越高,priority=0,則此節點永遠不能成為主節點primay。
副本集的最小推薦配置是三個節點:
- 一個主節點和兩個從節點
- 一個主節點、一個從節點和仲裁節點
如果可能,儘可能在副本集中使用奇數個資料成員,而不要使用仲裁者。所以推薦使用的最低配置為:一個主節點和兩個從節點。副本集在部署時如果當節點數目為偶數個時,需要部署一個仲裁節點,否則偶數個節點,當主節點掛了後,其他節點會變為只讀。不會去選舉其他主節點。
關於仲裁者說明:
仲裁者可隨意部署在網路通的任何地方,不會佔用什麼系統資源,它只提供投票選舉的功能,不儲存資料。
3、拉取mongodb映象
docker pull mongo:5.0
4、建立mongodb資料夾
首先在宿主機裡面建立mongodb的儲存資料資料夾
mkdir mongo01 && cd mongo01
進入mongo01建立conf、data、logs、tmp資料夾
mkdir conf data logs tmp
進入conf資料夾編寫mongod.conf檔案
# 資料庫檔案儲存位置
dbpath = /data/db
# log檔案儲存位置
logpath = /data/log/mongod.log
# 使用追加的方式寫日誌
logappend = true
# 是否以守護程序方式執行
# fork = true
# 全部ip可以訪問
bind_ip = 0.0.0.0
# 埠號
port = 27017
# 是否啟用認證
auth = true
# 設定oplog的大小(MB)
oplogSize=2048
#指定秘鑰檔案
keyFile = /data/key/mongo.key
#指定副本集名稱
replSet = rs
MongoDB 的 mongod.conf
檔案從版本 3.2 開始支援 YAML 格式。可以使用更加簡潔和結構化的語法來配置 MongoDB
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /data/db
journal:
enabled: true
# engine:
wiredTiger:
engineConfig:
cacheSizeGB: 1
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /tmp/mongod.log
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
bindIp: 0.0.0.0
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#開啟認證
security:
keyFile: /data/key/mongo.key
authorization: enabled
#operationProfiling:
#replication: 配副本集名
replication:
replSetName: rs
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
後面使用YAML格式進行配置說明。由於搭建副本集伺服器,開啟認證的同時,必須指定keyFile引數,節點之間的通訊基於該keyFile進行的。否則會啟動失敗。我們透過 docker logs 容器ID
檢視docker日誌可以發現啟動的時候會報錯:
BadValue: security.keyFile is required when authorization is enabled with replica sets
所以開始之前我們先把開啟認證給註釋掉,叢集搭建成功後在開啟認證。配置如下:
#開啟認證
#security:
# keyFile: /data/key/mongo.key
# authorization: enabled
然後把配置好的mongo01資料夾複製兩份
cp -r mongo01 mongo02
cp -r mongo01 mongo03
5、啟動mongodb容器例項
Linux路徑:
docker run -d --name mongo01 -p 27017:27017 --privileged=true -v ~/config/mongodb/mongo01/data:/data/db -v ~/config/mongodb/mongo01/conf:/data/configdb -v ~/config/mongodb/mongo01/logs:/data/log/ -v ~/config/mongodb/mongo01/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo02 -p 27018:27017 --privileged=true -v ~/config/mongodb/mongo02/data:/data/db -v ~/config/mongodb/mongo02/conf:/data/configdb -v ~/config/mongodb/mongo02/logs:/data/log/ -v ~/config/mongodb/mongo02/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo03 -p 27019:27017 --privileged=true -v ~/config/mongodb/mongo03/data:/data/db -v ~/config/mongodb/mongo03/conf:/data/configdb -v ~/config/mongodb/mongo03/logs:/data/log/ -v ~/config/mongodb/mongo03/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
如果為Windows系統把容器卷路徑改為磁碟地址即可:
docker run -d --name mongo01 -p 27017:27017 --privileged=true -v D:/mongo/mongo01/data:/data/db -v D:/mongo/mongo01/conf:/data/configdb -v D:/mongo/mongo01/logs:/data/log/ -v D:/mongo/mongo01/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
啟動成功後透過 docker ps
檢視容器是否執行成功。
6、配置叢集
隨便進入一個容器節點進行叢集配置。
docker exec -it mongo01 bash
進入容器後,登入mongodb命令列
mongo
執行配置副本集命令配置叢集:
rs.initiate({_id: "rs",members: [{ _id: 0, host: "192.168.1.9:27017" },{ _id: 1, host: "192.168.1.9:27018" },{ _id: 2, host: "192.168.1.9:27019" }]})
_id: "rs" 副本集名要和配置檔案中的一致。如果配置仲裁節點需要在改節點裡面加上 arbiterOnly: true屬性 如:
{ _id: 2, host: "192.168.1.9:27019", arbiterOnly: true}
也可以指定其 priority
( 優先順序)。如果不指定,預設優先順序為1。如指定第一個節點優先順序為90:
{"_id":0,"host":"192.168.1.9:27017",priority:90}
執行上面rs.initiate(config)命令後,叢集就搭建成功了。系統會選擇一個節點當主節點。
配置成功後,目前不需要賬號密碼就能夠登入。下面我們需要開啟安全認證以保證資料庫的安全。
7、叢集后開啟安全認證
7.1 建立root許可權使用者
由於我們的副本集已經搭建成功了。我們可以看到有一個PRIMAY節點和兩個SECONDARY節點,進入主節點容器建立使用者資訊。
切到admin庫
use admin
建立使用者,使用者名稱root,密碼1234qwer,許可權root,所屬庫admin
db.createUser({user:"root",pwd:"1234qwer",roles:[{role:'root',db:'admin'}]})
執行上面命令後使用者就建立成功了,我們先退出容器。
7.2 建立金鑰檔案
使用openssl生成key檔案,由於上面已經提到了想要在副本集中開啟認證,必須指定keyFile引數,所有節點使用相同的key。所以我們需要使用openssl生成一個mongo.key檔案,並把檔案複製到容器內部。
首先確保Linux系統安裝了openssl,檢視是否安裝命令:
openssl version
如果沒有輸出軟體包資訊,執行下面命令安裝openssl
yum install openssl
安裝成功後執行命令生成mongo.key檔案。
openssl rand -base64 753 > mongo.key
執行成功後,會生成一個mongo.key檔案。我們使用docker cp命令把檔案複製到容器中。
docker cp ./mongo.key mongo01:/data/key/mongo.key
複製成功後,進入容器內部給檔案授權。
docker exec -it mongo01 bash
進入/data/key命令給檔案授權。
chown 999 mongo.key #設定檔案歸屬權
chmod 400 mongo.key #設定檔案為只讀
上面的授權命令必須要執行,不然容器會啟動失敗。一定要注意!!!
7.3 開啟認證
上面的步驟操作成功後,接下來我們就可以把配置檔案中註釋掉的開啟認證引數給開啟了。
#開啟認證
security:
keyFile: /data/key/mongo.key
authorization: enabled
keyFile指定的路徑為複製到docker容器內部檔案存放的路徑。
7.4 重啟容器
把mongo.key檔案也按照相同的方式複製到另外兩個節點容器內。以上操作都成功後,就可以重新啟動容器了。首先退出容器關閉所有容器副本集節點
docker stop mongo01
docker stop mongo02
docker stop mongo03
在啟動容器
docker start mongo01 mongo02 mongo03
檢視容器是否啟動成功
docker ps
8、副本集相關命令
初始化副本集
rs.initiate(config)
檢視狀態
rs.status()
檢視配置資訊
rs.conf()
檢視是否為主節點
rs.isMaster()
新增從節點
rs.add("192.168.1.9:27020" )
新增仲裁節點
rs.addArb("ip:27017")
刪除節點
rs.remove("192.168.1.9:27020")
降級節點,主節點降級為從節點,並重新選舉新的主節點
rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)
檢視備份節點的複製資訊
db.printSlaveReplicationInfo()
開啟從節點為只讀許可權
rs.secondaryOk()
如果是4.0以下的版本,則是
rs.slaveOk()
每次當機重連之後都需要執行方法,不然在從節點資料庫中無法讀取資料。
測試服務當機
use admin;
db.shutdownServer();
9、視覺化工具連線
我們可以使用mongodb視覺化工具連線副本集,這裡使用Studio 3T進行連線。
選擇新建連線:
配置連線資訊
指定連線型別、節點地址、副本集名稱。輸入賬號密碼:
點選連線