天天看點

高可用mongodb叢集搭建彙總

高可用mongodb叢集搭建彙總

1. MongoDB複制原理

主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點擷取這些操作,然後對自己的資料副本執行這些操作,進而保證從節點的資料與主節點一緻。

那什麼是副本集呢?主從模式一主一從就是一個副本。MongoDB複制提供了資料的備援備份,并在多個伺服器上存儲資料副本,提高了資料的可用性, 并可以保證資料的安全性;複制還允許您從硬體故障和服務中斷中恢複資料。副本集具有多個副本保證了容錯性,就算一個副本挂掉了還有很多副本存在,并且解決了之前的問題“主節點挂掉了,整個叢集内會自動切換”。

1.1副本集特征

N 個節點的叢集

任何節點可作為主節點

所有寫入操作都在主節點上

自動故障轉移

自動恢複

副本集還有以下幾個需要注意的地方:

  1. 最小構成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
  2. 成員數應該為奇數,如果為偶數的情況下添加arbiter,arbiter不儲存資料,隻投票。
  3. 最大50 members,但是隻能有 7 voting members,其他是non-voting members。
    高可用mongodb叢集搭建彙總

    由圖可以看到用戶端連接配接到整個副本集,不關心具體哪一台機器是否挂掉。主伺服器負責整個副本集的讀寫,副本集定期同步資料備份,一旦主節點挂掉,副本節點就會選舉一個新的主伺服器,這一切對于應用伺服器不需要關心。

    接下來我們看一下主伺服器挂掉後的架構:

    高可用mongodb叢集搭建彙總

    副本集中的副本節點在主節點挂掉後通過心跳機制檢測到後,就會在叢集内發起主節點的選舉機制,自動選舉一位新的主伺服器。

    建高可用mongodb叢集(三)—— 深入副本集内部機制

    官方推薦的副本集機器數量至少為3個,這裡我就以三個節點為例介紹。

2. mongodb高可用叢集的安裝

2.1 環境準備

172.16.2.246位主節點 172.16.2.247和172.16.2.248為備節點

2.2 下載下傳安裝包

到mongodb官網下載下傳對應系統的壓縮包,我下載下傳的是mongodb-linux-x86_64-3.4.19.tgz版本,官網連結https://www.mongodb.com/

如果線上安裝可以使用以下指令下載下傳安裝包:
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.19.tgz
如果離線安裝可以使用浏覽器把安裝包下載下傳下來:
在浏覽器粘貼以下連結就會下載下傳3.4.19的安裝包:
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.19.tgz
           

2.3 到使用者目錄下的Downloads目錄,将其解壓

tar -zxvf mongodb-linux-x86_64-3.4.19.tgz
           

2.4 後的檔案夾移動到/home的mongodb目錄下

mv -r mongodb-linux-x86_64-3.4.19  /home/mongodb
           

2.5 配置系統檔案profile

vi /etc/profile
插入下列内容:
export MONGODB_HOME=/usr/local/mongodb  
export PATH=$PATH:$MONGODB_HOME/bin
注意儲存後要重新開機系統配置:
source /etc/profile
           

2.6 建立用于存放資料和日志檔案的檔案夾,并修改其權限增加讀寫權限

cd  usr/local/mongodb
mkdir -p data/db
chmod -r 777 data/db
mkdir logs
cd logs
touch mongodb.log
           

2.7 mongodb啟動配置

在三172.16.2.246,172..2.247,172.16.2.248這三個節點上操作如下:
在/home/mongodb的路徑下建立一個目錄
mkdir conf
cd conf
vim mongodb.conf
           

在三個節點上依次插入的配置資訊如下:

在172.16.2.246節點上插入
dbpath=/home/mongodb/data/db
logpath=/home/mongodb/logs/mongodb.log 
logappend=true
port=27017 
fork=true
auth=false
nohttpinterface=false
bind_ip=172.16.2.246
journal=true
quiet=true
replSet=repset

在172.16.2.247節點上插入

dbpath=/home/mongodb/data/db
logpath=/home/mongodb/logs/mongodb.log 
logappend=true
port=27017 
fork=true
auth=false
nohttpinterface=false
bind_ip=172.16.2.247
journal=true
quiet=true
replSet=repset

在172.1.6.2.248節點上插入

dbpath=/home/mongodb/data/db
logpath=/home/mongodb/logs/mongodb.log 
logappend=true
port=27017 
fork=true
auth=false
nohttpinterface=false
bind_ip=172.16.2.248
journal=true
quiet=true
replSet=repset
           

2.8 分别啟動三個節點

./mongod -f ../conf/mongodb.conf 
./mongod -f ../conf/mongodb.conf 
./mongod -f ../conf/mongodb.conf
           

檢視172.16.2.246節點上的mongodb日志輸出,沒有找到replica的配置資訊

高可用mongodb叢集搭建彙總

2.9 初始化副本集

任選一個節點登入進去,可以看到show dbs是不可用,因為還沒初始化副本集,這時候我選擇的時候172.16.2.246這個節點:

登入指令為:./mongo 172.16.2.246
> show dbs
2019-08-21T10:48:14.246+0800 E QUERY    [thread1] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk"
} :
> use admin 
switched to db admin
定義副本集配置變量,這裡的 _id:”repset” 和上面配置檔案的參數“ –replSet repset” 要保持一樣:
> config= {_id:"repset",members:[ 
... {_id:0,host:"172.16.2.246:27017"}, 
... {_id:1,host:"172.16.2.247:27017"}, 
... {_id:2,host:"172.16.2.248:27017"}] 
... }
> rs.initiate(config);
{ "ok" : 1 }
檢視叢集節點狀态:
repset:OTHER> rs.status()
這時候可以看到有一個主節點和兩個備節點
整個副本及已經搭建成功了!
           

2.10測試副本集資料複制功能

在主節點登入mongodb
repset:PRIMARY> use test
switched to db test
repset:PRIMARY> db.testdb.insert({"test1":"item1"}) 
WriteResult({ "nInserted" : 1 })
repset:PRIMARY> exit
bye
在副本節點登入檢視資料:
mongodb預設是從主節點讀寫資料的,副本節點上不允許讀,需要設定副本節點可以讀
repset:SECONDARY> use test
switched to db test
repset:SECONDARY> db.getMongo().setSlaveOk()
repset:SECONDARY> db.testdb.find()
{ "_id" : ObjectId("5d5cb3b80ea6fc9174f31b6c"), "test1" : "item1" }
           

2.11 測試副本集failover功能

手動把現在的主節點停掉,檢視叢集狀态:
repset:SECONDARY> rs.status()
可以看到兩個備節點就會變成一個主節點和備節點
           
3. 出現異常的情況

如果出現啟動mongo報錯:couldn’t connect to server 172.16.2.246:27017

原因分析:

一般産生原因是mongodb由于不正常關閉産生了一個mongo.lock檔案,隻要找到并删除這個lock檔案,執行repair指令并重新啟動mongodb就好了,stackoverflow網友給出的解決指令見如下。

關于mongod.lock路徑,取決于你安裝mongodb時的建立資料和日志的目錄。以下是mongodb.lock可能出現的位置:

/home/data/db/mongod.lock
執行的指令如下:
rm /home/data/db/mongod.lock
mongod –repair
關于mongod和mongo指令,如果沒有建立全局路徑,一般先進入/home/mongodb/bin,再執行./mongo或./mongod
           

參考的連結1為:https://www.linuxidc.com/Linux/2017-11/148740p3.htm

參考的連結2為:https://blog.csdn.net/weixin_36094484/article/details/80468077