使用Docker搭建MongoDB 5.0版本副本集叢集

sowler發表於2024-04-23

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進行連線。

選擇新建連線:

配置連線資訊

指定連線型別、節點地址、副本集名稱。輸入賬號密碼:

點選連線

相關文章