MongoDB 搭建可複製群集

pursuer.chen發表於2018-03-01

一、概述

MongoDB複製群集支援節點故障自動切換,最小配置應包含3個節點,正常情況下應該至少包含兩個資料節點,第三個節點可以是資料節點也可以是仲裁節點。仲裁節點的作用是當出現偶數節點導致無法仲裁的時候參與進來進行投票使之變成奇數個投票點,仲裁節點可以看成是不包含任何資料集的副本節點。仲裁節點並不需要太多系統資源,僅僅只是參與投票,可隨意部署在網路通的地方不會佔用什麼系統資源;而資料節點儲存了資料,需要佔用比較大的磁碟空間、記憶體等硬體資源,成本比仲裁節點高很多,但是額外提供了一個資料副本,相當於更多一層保障。

 

 

版本:MongoDB3.6.2

OS:Centos6.7

節點1:192.168.137.10:27010 ;目錄/mongos27010

節點2:192.168.137.10:27011;目錄/mongos27011

節點3:192.168.137.10:27012;目錄/mongos27012

二、搭建

基本架構如下:

 

1.安裝Mongodb 

解壓

tar -xvf mongodb-linux-x86_64-rhel62-3.6.2.tgz

mv mongodb-linux-x86_64-rhel62-3.6.2 mongos27010

建立相關目錄

cd /mongos27010
mkdir -p data/db 
mkdir -p data/log

加入環境變數

vim /etc/profile
export PATH=/mongos27010/bin:$PATH

source /etc/profile

啟動服務

/mongos27010/bin/mongod  --maxConns 20000  --config  /mongos27010/mongodb.conf

生成keyfile檔案

openssl rand -base64 756 > /mongodb27010/autokey

chmod 400 /mongodb27010/autokey

3.新增群集

啟動三個節點服務

/mongos27010/bin/mongod  --maxConns 20000  --config  /mongos27010/mongodb.conf
/mongos27011/bin/mongod  --maxConns 20000  --config  /mongos27011/mongodb.conf
/mongos27012/bin/mongod  --maxConns 20000  --config  /mongos27012/mongodb.conf

登入到主節點27010,新增其它兩個節點

1.登入
mongo --port 27010
2.切換admin資料庫
use admin4.初始化複製集,預設會建立當前節點為主節點的副本集
rs.initiate()
5.退出重新登入
6.新增資料節點27011,可以用機器名加埠也可以使用IP加埠
rs.add("192.168.137.10:27011")
7.新增資料節點27012,可以用機器名加埠也可以使用IP加埠
rs.add("192.168.137.10:27012")

或者通過配置檔案初始化副本集

conf={_id:'rs-a',members:[
{_id:0,host:'192.168.137.10:27010',priority:5},
{_id:1,host:'192.168.137.10:27011',priority:1},
{_id:2,host:'192.168.137.10:27012',arbiterOnly:true,priority:1}]
}
rs.initiate(conf)
----建立使用者
use admin
db.createUser({
    user:"dba",
    pwd:"dba",
    roles:[{role:"root",db:"admin"}]});

 

注意:新增節點後重啟所有節點服務

注意:當前我已經把節點27010和27011的優先順序都設成了10,節點27012的優先順序設成了0,所以節點27012永遠不會成為主節點。

arbiterOnly:表示該成員是仲裁者,arbiter的唯一作用是就是參與選舉,其votes屬性是1,arbiter不儲存資料,也不會為client提供服務。

buildIndexes:表示是否在該成員上建立Index,該屬性不能修改,只能在增加成員時設定該屬性。如果一個成員僅僅作為備份,不接收Client的請求,將該成員設定為不建立index,能夠提高資料同步的效率。

priority:表示一個成員被選舉為Primary節點的優先順序,預設值是1,取值範圍是從0到100,將priority設定為0有特殊含義:Priority為0的成員永遠不能成為Primary 節點。Replica Set中,Priority最高的成員,會優先被選舉為Primary 節點,只要其滿足條件。

hidden:將成員配置為隱藏成員,要求Priority 為0。Client不會向隱藏成員傳送請求,因此隱藏成員不會收到Client的Request。

slaveDelay:單位是秒,將Secondary 成員配置為延遲備份節點,要求Priority 為0,表示該成員比Primary 成員滯後指定的時間,才能將Primary上進行的寫操作同步到本地。為了資料讀取的一致性,應將延遲備份節點的hidden設定為true,避免使用者讀取到明顯滯後的資料。Delayed members maintain a copy of the data that reflects the state of the data at some time in the past.

votes:有效值是0或1,預設值是1,如果votes是1,表示該成員(voting member)有許可權選舉Primary 成員。在一個Replica Set中,最多有7個成員,其votes 屬性的值是1。

注意:當前我已經把節點27012的優先順序(priority)設成了0,所以節點27012在passives下面去了。

 

-----第三個副本節點為仲裁節點,不儲存資料只充當仲裁,不儲存資料也不接收業務請求
config ={
     "_id" : "abc_set",
     "members" : [
          {
               "_id" : 0,
               "host" : "111:30000"
          },
          {
               "_id" : 1,
               "host" : "222:30000"
          },
          {
               "_id" : 2,
               "host" : "333:30000",
               "arbiterOnly":true
          }
     ]
};
-----第三個副本節點為隱藏節點,要求Priority 為0。不參與投票,不接受業務請求,但是會儲存資料
config ={
     "_id" : "abc_set",
     "members" : [
          {
               "_id" : 0,
               "host" : "111:30000"
          },
          {
               "_id" : 1,
               "host" : "222:30000"
          },
          {
               "_id" : 2,
               "host" : "333:30000",
               "priority" : 0,
               "hidden" : true
          }
     ]
}

4.故障測試

停止27010節點服務

登入節點27011查詢,rs.status()

 主節點已經切換到了27012節點

三、其它相關配置

1.配置節點優先順序

在主節點中配置

cfg = rs.conf();
cfg.members[0].priority = 10
cfg.members[1].priority = 10
cfg.members[2].priority = 5
rs.reconfig(cfg)
rs.conf();

注意:1.members[n]指的是rs.conf()查詢中"_id"節點標誌。如果將某個節點的priority設為0那麼它將永遠不會成為Primary節點。

2.這裡的cfg只是一個別名,可以隨意取。

3.主和備主的優先順序建議設定成一樣,避免主重啟之後又進行主切換。

2.關閉節點投票

cfg = rs.conf()
cfg.members[2].votes = 0;
rs.reconfig(cfg)
rs.conf();

注意:將節點votes設為0那麼該節點將不具有投票權。

3.新增仲裁節點

rs.addArb("localhost:27012")

注意:新增節點後需要重啟服務

4.刪除節點

刪除仲裁節點命令相同
rs.remove("localhost:27012")

注意:刪除節點後要重啟刪除節點的服務,同時將刪除節點的conf配置檔案的replSet引數去掉。

5.查詢群集相關狀態

rs.status

"_id" :  #叢集中節點編號,從0開始  
"name" :  #成員伺服器名稱及埠  
"health" :  #表示成員中的健康狀態(0:down;1:up)  
"state" :  #為0~10,表示成員的當前狀態  
"stateStr" :  #描述該成員是主庫(PRIMARY)還是備庫(SECONDARY)  
"uptime" :  #該成員線上時間(秒),從成員可達到現在所經歷的時間。對於當前self成員,該時間是從成員啟動一直到現在的時間。 
"optime" :  #成員最後一次應用日誌(oplog)的資訊  
"optimeDate" :  #成員最後一次應用日誌(oplog)的時間
"electionTime" : #當前primary從操作日誌中選舉資訊 
"electionDate" :  #當前primary被選定為primary的日期  
"configVersion" :  #mongodb版本  
"self" :  #為true 表示當前節點 
-------===========非當前成員資訊===========-----------
"lastHeartbeat" :#當前伺服器最後一次收到擁有該資訊成員心跳的時間
"pingMs" : 心跳從當前伺服器到到達擁有該資訊成員伺服器所花費的平均時間,可以從這個欄位選擇從哪個成員進行同步 。
"syncingTo":當前成員正在從哪個成員處進行復制。

參考:https://docs.mongodb.com/manual/reference/command/replSetGetStatus/

rs.conf()

查詢群集相關配置,包括優先順序、投票等

參考:https://docs.mongodb.com/manual/reference/replica-configuration/

db.isMaster()

"passives" :priority=0的標誌
"setName":群集名稱
"ismaster":是否是主節點
"secondary":是否是從節點
 

參考:https://docs.mongodb.com/manual/reference/command/isMaster/

NameDescription
applyOps Internal command that applies oplog entries to the current data set.
isMaster Displays information about this member’s role in the replica set, including whether it is the master.
replSetAbortPrimaryCatchUp Forces the elected primary to abort sync (catch up) then complete the transition to primary.
replSetFreeze Prevents the current member from seeking election as primary for a period of time.
replSetGetConfig Returns the replica set’s configuration object.
replSetGetStatus Returns a document that reports on the status of the replica set.
replSetInitiate Initializes a new replica set.
replSetMaintenance Enables or disables a maintenance mode, which puts a secondary node in a RECOVERING state.
replSetReconfig Applies a new configuration to an existing replica set.
replSetResizeOplog Dynamically resizes the oplog for a replica set member. Available for WiredTiger storage engine only.
replSetStepDown Forces the current primary to step down and become a secondary, forcing an election.
replSetSyncFrom Explicitly override the default logic for selecting a member to replicate from.
resync Forces a mongod to re-synchronize from the master. For master-slave replication only.

參考:https://docs.mongodb.com/manual/reference/command/nav-replication/

rs.printReplicationInfo()

檢視oplog狀態

rs.printSlaveReplicationInfo()

檢視複製延遲

db.serverStatus()

檢視服務狀態詳情

6.關閉服務

db.shutdownServer()

如果當前只剩下主節點需要執行帶“force:true”引數的關閉服務命令

db.shutdownServer({"force":true});

7.配置啟動服務

vim /etc/init.d/mongos27010

ulimit -SHn 655350
#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/mongos27010/bin/mongod  --maxConns 20000  --config  /mongos27010/mongodb.conf
;;
stop)
/mongos27010/bin/mongo -u dba -p dba 192.168.137.10:27010/admin --eval "db.shutdownServer()"
;;
status)
/mongos27010/bin/mongo -u dba -p dba  192.168.137.10:27010/admin --eval "db.stats()"
;;
esac

加入開啟自動啟動

chkconfig --level 345 mongos27010 on

四、總結 

如果是首次搭建可能會遇到各種小問題,但是隻要細心查詢還是很容易解決;整體來說搭建一個MongoDB複製群集還是比較簡單。

 

 

 

備註:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。

《歡迎交流討論》

 

相關文章