MongoDB 搭建可復制群集


一、概述

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

參數配置

net:
  maxIncomingConnections: 6000
  port: 27017
operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 200
processManagement:
  fork: "true"
replication:
  oplogSizeMB: 20480
  replSetName: test
security:
  authorization: enabled
  clusterAuthMode: keyFile
  keyFile: /var/lib/mongodb-mms-automation/keyfile
setParameter:
  enableLocalhostAuthBypass: "true"
storage:
  dbPath: /data/mongo/test
  directoryPerDB: true
  engine: wiredTiger
  indexBuildRetry: true
  journal:
    enabled: true
  wiredTiger:
    collectionConfig:
      blockCompressor: snappy
    engineConfig:
      journalCompressor: snappy
      cacheSizeGB: 2
    indexConfig:
      prefixCompression: true
systemLog:
  destination: file
  logAppend: true
  path: /data/mongo/test/mongodb.log
  quiet: true

 

生成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/

Name Description
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

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

《歡迎交流討論》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM