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})