Mongodb 在正式使用時為了實現高可用,最簡單的辦法就是配置複製集,當主節點發生故障時,能夠自動切換節點,從而儘可能的減少應用的故障時間。典型的複製集架構由3個或以上具有投票權的節點組成,包括:
• 一個主節點(PRIMARY):接受寫入操作和投票選舉;
• 兩個(或多個)從節點(SECONDARY):複製主節點上的資料和投票選舉;
當一個修改操作到達主節點時,它對資料的操作被記錄為 oplog ,從節點根據 oplog 更新自身的資料。
接下來介紹下如何搭建一個最基本的複製集,一個主節點和兩個從節點,為了方便,在一臺機器上根據埠號區分不同的 mongodb 服務,在正式使用時,儘量在不同的伺服器上部署,避免機器出現問題,導致全部節點失效。mongodb 的安裝可以參考我的博文,傳送門。下面的操作在 Centos7 中完成。
1. 建立資料儲存目錄
在 /var
目錄中建立 mongodb 資料夾,mongodb 目錄下建立 db_28017, db_28018, db_28019分別儲存三個節點的配置檔案,日誌檔案和資料檔案等。
$ mkdir -p /var/mongodb/db_{28017,28018,28019}
在三個節點的目錄下建立配置檔案,日誌檔案和資料資料夾
$ cd /var/mongodb/db_28017/ && mkdir data && touch mongod.log mongod.conf
$ cd /var/mongodb/db_28018/ && mkdir data && touch mongod.log mongod.conf
$ cd /var/mongodb/db_28019/ && mkdir data && touch mongod.log mongod.conf
2. 編輯配置檔案
配置檔案示例:
# 系統日誌配置
systemLog:
destination: file
logAppend: true
path: /var/mongodb/db_*/mongod.log
# 儲存資料的配置
storage:
dbPath: /var/mongodb/db_*/data
journal:
enabled: true
#程式執行配置
processManagement:
fork: true
pidFilePath: /var/mongodb/db_*/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
# 網路配置
net:
port: 28017
bindIp: 127.0.0.1
#複製集名稱
replication:
replSetName: rs0
編輯三個節點的配置檔案,修改上方包含 path 的配置項到正確的目錄,以及埠號。
3. 啟動節點
由於是在同一個機器上執行,所以我們需要指定配置檔案啟動mongo服務
# 啟動服務
$ mongod -f /var/mongodb/db_28017/mongod.conf
$ mongod -f /var/mongodb/db_28018/mongod.conf
$ mongod -f /var/mongodb/db_28019/mongod.conf
4. 配置節點
這裡以埠號為 28017 的 mongo 為主節點,進入 mongo cli
# 連線 mongo 服務
$ mongo --port 28017
檢視狀態
新增從節點
5. 配置安全校驗
mongo 預設不啟用安全校驗,任何人在伺服器上可以進行任何操作,這是非常危險的,由於這種機制,發生了很多的資料洩露的事故。因此,安全校驗是必不可少的,我們僅僅設定最簡單的使用者名稱和密碼就可以避免掉大多數的攻擊。在複製集中,只設定使用者名稱和密碼會導致從節點和主節點連線失敗,最簡單的方式就是建立一個 keyFile,就可以解決問題。
# 在 /var/mongodb 目錄下建立keyFile,由於 mongo 對 keyFile 的內容有要求,這裡我們使用 openssl 建立 base64 編碼的字元
$ openssl rand -base64 745 > /var/mongodb/keyFile
# 許可權修改為600
$ chmod 600 /var/mongodb/keyFile
在三個節點的配置檔案中追加配置內容
security:
keyFile: /var/mongodb/keyFile
在配置 keyFile 後需要建立管理員使用者,我們在主節點中進行配置。
root角色為mongo中的超級管理員角色
配置後,重新進入mongo cli
不使用使用者名稱和密碼可以連線到 mongo,但是不能進行任何的操作,使用 auth 可以進行驗證,驗證通過後,可以正常操作。
6. 開啟從節點讀
從節點在配置完成後,主節點的資料變化後,從節點還不能讀取到變化。
在主節點插入一條資料
在從節點讀取資料,會發生錯誤,沒有讀取的許可權
開啟讀許可權 rs.slaveOk()
, 讀取正常
End!
本作品採用《CC 協議》,轉載必須註明作者和本文連結