一、節點類型
standard:常規節點,它儲存一份完整的資料副本,參與選舉投票,有可能成為活躍節點。
passive:儲存了完整的資料副本,參與投票,不能成為活躍節點。
arbiter:仲裁節點,只參與投票,不接收複製的資料,也不能成為活躍節點。
二、參數說明
--dbpath 資料檔案路徑
--logpath 記錄檔路徑
--port 連接埠號碼,預設是27017.我這裡使用的也是這個連接埠號碼.
--replSet 複製集的名字,一個replica sets中的每個節點的這個參數都要用一個複製集名字,這裡是test.
--replSet 這個後面跟的是其他standard節點的ip和連接埠
--maxConns 最大串連數
--fork 後台運行
--logappend 記錄檔迴圈使用,如果記錄檔已滿,那麼新日誌覆蓋最久日誌。
註:
1、不需要像mysql一樣複製完整資料過去,叢庫啟動會制動複製主庫完整資料。
2、叢庫自動設定為唯讀。
3、mongodb第一次啟動時間較長,需要注意等待。
4、管理命令多數都要在admin庫中執行use admin
三、棄置站台集
環境說明:
ip:10.0.0.2 master
ip:10.0.0.3 slave
ip:10.0.0.4 slave
ip:10.0.0.5 arbiter
1、建立資料目錄:mkdir server1 server2 server3 server4
2、開啟mongodb:
首先:我們為複本集取個名字叫:fuben
為10.0.0.2開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server1 --logpath=/usr/local/mongodb/dblog1 --replSet fuben:10.0.0.3 --fork
(注::--fork為建立守護進程,--logpath與--fork必須並存)
為10.0.0.3開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server2 --logpath=/usr/local/mongodb/dblog2
--replSet fuben:10.0.0.2 --fork
啟動服務後,我們可以通過記錄檔觀察啟動mongodb的資訊,並且複本集有一個亮點就是自動檢測功能:在其中指定的單台伺服器後,mongodb就是自動搜尋並串連其餘的節點
3、初始化節點
我們串連到其中一個節點上,並使用replSetInitiate命令進行初始化。此命令需要一個設定物件,指定設定的每個成員的名字。
db.runCommand({"replSetInitiate":{
'_id':'fuben',
'members':[
{
"_id" : 0,
"host" : "10.0.0.2"
},
{
"_id" : 1,
"host" : "10.0.0.3"
}
]
}
})
或者:
>>config = {_id:"test",members:[... {_id:0,host:'10.0.0.2'},... {_id:1,host:'10.0.0.3'},]... }>rs.initiate(config);{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1}
在此期間,其中一個節點將當選為主節點。
這樣我們就建立了複本集,我們在主要資料庫中寫入資料,那麼從就會同步了,但是從伺服器不能查看裡面的資料,我們可以通過設定將從伺服器改為可讀
通過日誌我們可以查看,從伺服器是每十秒鐘去讀取主伺服器下面的local.oplog.rs進行同步
我們可以通過:rs.status()來查看複本集裡面的詳細資料 ,也可以通過rs.isMaster()來查看該伺服器是否為master
4、後期添加從伺服器
為10.0.0.4開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server3 --logpath=/usr/local/mongodb/dblog3 --replSet
fuben:10.0.0.2 --fork
首先,我們開啟了10.0.0.4伺服器的mongodb
我們在主伺服器上添加,rs.add("10.0.0.4:27017"),這樣就該伺服器添加到了複本集
5、添加仲裁節點
為10.0.0.5開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server4 --logpath=/usr/local/mongodb/dblog4 --replSet
fuben:10.0.0.2 --fork
首先,我們開啟了10.0.0.5伺服器的mongodb(Arbiter)
我們在主伺服器上添加,rs.addArb("10.0.0.4:27017"),這樣就該伺服器添加到了複本集的仲裁節點
該節點不參與資料的複製,只是參與投票選擇主節點而已
6、mongodb資料庫的複本集的同步機制
資料複製的目的是使資料得到最大的可用性,避免單點故障引起的整站不能訪問的情況的發生,Mongodb的複本集在同一時刻只有一台伺服器是可以寫的,複本集的主從複製也是一個非同步同步的過程,是slave端從primary端擷取日誌,然後在自己身上完全順序的執行日誌所記錄的各種操作(該日誌是不記錄查詢操作的),這個日誌就是local資料庫中的oplog.rs表,預設在64位機器上這個表是比較大的,占磁碟大小的5%,oplog.rs的大小可以在啟動參數中設定:--oplogSize 1000,單位是M。在生產環境中建議此值設定的大一些,以防止無法同步的情況發生。
7、查看同步狀態
我們使用:db.printSlaveReplicationInfo()來查看資訊,這裡顯示了,同步了多少時間等資訊
如:
source: 127.0.0.1:10000
syncedTo: Tue Jul 16 2013 15:18:52 GMT+0800 (CST)
= 5337 secs ago (1.48hrs)
source: 127.0.0.1:10003
syncedTo: Tue Jul 16 2013 16:05:22 GMT+0800 (CST)
= 2547 secs ago (0.71hrs)
source: 127.0.0.1:10002
no replication info, yet. State: ARBITER
source:從庫的ip和連接埠
syncedTo:目前的同步情況,以及最後一次同步的時間
從上面可以看出,在資料庫內容不變的情況下他是不同步的,資料庫變動就會馬上同步。
db.printReplicationInfo()查看oplog的大小和oplog中操作的時間範圍
如:configured oplog size: 50MB
log length start to end: 9071secs (2.52hrs)
oplog first event time: Tue Jul 16 2013 14:20:40 GMT+0800 (CST)
oplog last event time: Tue Jul 16 2013 16:51:51 GMT+0800 (CST)
now: Tue Jul 16 2013 17:10:35 GMT+0800 (CST)
這裡說明了,oplog配置為50M,日誌記錄的時間長度等資訊
8、刪除節點
出於種種原因把,現在準備刪除一個節點,空閑出一台伺服器
這時使用命令rs.remove("IP+連接埠")即可移除該節點
如:rs.remove('10.0.0.3:27017')
輸出結果:
Tue Jul 16 16:51:52.180 DBClientCursor::init call() failed
Tue Jul 16 16:51:52.210 JavaScript execution failed: Error: error doing query: failed at src/mongo/shell/query.js:L78
Tue Jul 16 16:51:52.229 trying reconnect to 127.0.0.1:10001
Tue Jul 16 16:51:52.231 reconnect 127.0.0.1:10001 ok
這樣:我們用rs.status就可以查看到該節點已經沒有了
9、同步檔案
主節點的操作記錄在oplog裡 (operation logs) ,oplog儲存在一個特殊的資料庫中,叫:local,而oplog就在oplog.rs裡面
我們可以通過:db.oplog.rs.find()查看動作記錄記錄
oplog中每個文檔記錄了主節點的一個操作:文檔中的鍵:
ts:操作的時間戳記,由4個位元組的時間戳記和4個位元組的計數器組成
op:操作類型,只有一個位元組的代碼(如:u--update,i-insert n--null)
ns:執行操作的命名空間,就是集合名
o:指定了執行的文檔,就是要插入的資料,更新的資料等等
10、從節點的同步問題
從節點第一次啟動,會對主節點資料進行完整的同步,這樣花費大量的時間,如果從節點的操作已經被主節點落下太遠了,從節點就會跟不上,因為主節點資料太新了,這裡可能是從節點出現故障或者宕機,或者是從節點分擔了主節點作為讀伺服器,這樣資源被消耗,疲於應付讀取而無法同步,這樣從節點的資料就更不上了
我們可以通過:{‘resync’:1}命令來手動執行重新同步,也可以在啟動從節點的時候加入參數:--autoresync來重新同步。重新同步代價很高,應盡量避免,方法就是配置足夠大的oplog