mongodb配置主從模式


  Mongodb的replication主要有兩種:主從和副本集(replica set)。主從的原理和mysql類似,主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。 
   現在mongodb官方建議用副本集替代主從復制,但是這不妨礙我們從主從復制入門,了解mongdob的replication。

什么是oplog:

  MongoDB 的Replication是通過一個日志來存儲寫操作的,這個日志就叫做oplog。 在默認情況下,oplog分配的是5%的空閑磁盤空間。通常而言,這是一種合理的設置。可以通過mongod --oplogSize來改變oplog的日志大小。 oplog是capped collection,因為oplog的特點(不能太多把磁盤填滿了,固定大小)需要,MongoDB才發明了capped collection(the oplog is actually the reason capped collections were invented)。

  oplog的位置 oplog在local庫: master/slave 架構下 local.oplog.$main。

 

主數據庫配置(master.conf )

# 數據庫文件存儲位置
dbpath  = /data/db/master
# log文件存儲位置
logpath = /data/log/mongodb/master/mongodb.log
# 使用追加的方式寫日志
logappend = true
# 是否以守護進程方式運行
fork    = true
# 端口號
port    = 27017
# 是否啟用認證
auth  = true
# 集群的私鑰的完整路徑,只對於Replica Set 架構有效(noauth = true時不用配置此項)
keyFile = /usr/local/mongodb/mongodb-keyfile
# diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
#diaglog        = 0
# 設置主從服務器
master = true
# 設置oplog的大小(MB)
oplogSize=2048

 

從數據庫配置(slave1.conf) 

# 數據庫文件存儲位置
dbpath    = /data/db/slave1

# log文件存儲位置
logpath    = /data/log/mongodb/slave1/mongodb.log

# 使用追加的方式寫日志
logappend = true

# 是否以守護進程方式運行
fork    = true

# 端口號
port    = 27027

# 是否啟用認證
auth    = true

# 集群的私鑰的完整路徑,只對於Replica Set 架構有效(noauth = true時不用配置此項)
keyFile = /usr/local/mongodb/mongodb-keyfile
# diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
#diaglog    = 0

# 設置主從服務器
slave = true

# 用於從節點,指定從節點的復制來源(主節點的IP+端口),格式為:<host><:port>
source =    127.0.0.1:27017    

 

注意:

  如果使用認證的方式啟動服務(auth = true),那么要在主從服務器配置私鑰。

//    在一台服務器上生成私鑰
openssl rand -base64 745 > mongodb-keyfile

//    修改私鑰的權限為可讀寫
chmod 600 mongodb-keyfile

//    將私鑰拷貝到其余的服務器上
scp mongodb-keyfile root@xxx.xxx.xxx.xxx:/usr/local/mongodb/

  然后配置私鑰路徑,啟動服務。

 

啟動數據庫:

/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/master.conf
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/slave1.conf

 

當啟動slave后,slave端會自動進行初始化resync同步,可以在日志查看到同步信息:

2018-01-03T11:39:46.396+0800 I NETWORK  [thread1] waiting for connections on port 27027
2018-01-03T11:39:47.415+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:47.458+0800 I REPL     [replslave] resync: dropping database admin
2018-01-03T11:39:47.458+0800 I REPL     [replslave] resync: cloning database admin to get an initial copy
2018-01-03T11:39:47.481+0800 I COMMAND  [replslave] setting featureCompatibilityVersion to 3.4
2018-01-03T11:39:47.482+0800 I STORAGE  [replslave] copying indexes for: { name: "system.version", type: "collection", options: {}, info: { readOnly: false }, idIndex: { v: 1, key: { _id: 1 }, name: "_id_", ns: "admin.system.version" } }
2018-01-03T11:39:47.500+0800 I INDEX    [replslave] build index on: admin.system.version properties: { v: 2, key: { version: 1 }, name: "incompatible_with_version_32", ns: "admin.system.version" }
2018-01-03T11:39:47.500+0800 I INDEX    [replslave]      building index using bulk method; build may temporarily use up to 500 megabytes of RAM
2018-01-03T11:39:47.504+0800 I INDEX    [replslave] build index done.  scanned 1 total records. 0 secs
2018-01-03T11:39:47.504+0800 I REPL     [replslave] resync: done with initial clone for db: admin
2018-01-03T11:39:47.505+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:48.506+0800 I REPL     [replslave] sleep 1 sec before next pass
2018-01-03T11:39:49.506+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:50.507+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:51.507+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:52.508+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:53.509+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:54.509+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:55.510+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:56.510+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:58.493+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:39:59.494+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:40:00.495+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:40:01.495+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017
2018-01-03T11:40:02.496+0800 I REPL     [replslave] syncing from host:127.0.0.1:27017

 

resync:

  當slave端落后過多的時候需要進行resync。resync會在master上加一個全局的寫鎖,會阻塞其它的寫操作,直到resync結束。可以使用數據庫命令進行resync:

use admin
db.runCommand({"resync":1})

 


免責聲明!

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



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