MongoDB副本集(三)

三、主從複製

重要:大多數情況下,副本集代替了主從(master-slave)複製。在產品實施時,儘可能使用副本集而不是主從複製。本文檔主要目的是支持遺留的部署、歸檔。
副本集不僅具有主從架構所有功能,還能提供產品的健壯性。主從複製可以的擁有更大數量的non-master節點,也能限定對單個數據庫的複製操作;然而,主從複製,提供了更少的信息冗餘,沒有自動故障轉移。

1.基本操作


a.初始化部署

先啓動2個mongod實例,一個用master模式,一個用slave模式。

master啓動指令爲:

mongod --master --dbpath /data/masterdb/

使用- -master選項,mongod將會創建一個local.oplog.$mani集合,即“operation log”順序記錄數據操作,以便slave複製應用。- -dbpath是可選項。

slave啓動指令爲:

mongod --slave --source <masterhostname><:<port>> --dbpath /data/slavedb/

指定master實例的hostname和port到- -source參數中。- -dbpath是可選項。對於slave實例,mongodb存儲master的信息於local.sources集合中。


b.在線更改- -source參數
你可以在local.sources集合中添加一個文檔來指定master實例,步驟如下:

use local
db.sources.find()
db.sources.insert( { host: <masterhostname> <,only: databasename> } );

即切換到local數據庫,然後判斷source集合中是否有數據,最後插入一個帶有master信息的文檔到集合中。


2.主從複製的注意事項

Master實例用oplog來存儲操作信息,這導致了,如果一個slave落後與Master太遠,那麼slave就不能追上Master,這時,必須從頭開始進行同步。以下情況發生時,slave將脫離對master的同步:

· slave落後與master太遠
· slave已停止,在master已經覆蓋了最近的操作後才重啓

當slave脫離同步後,複製停止。管理員必須手動干涉來重新複製,使用resync指令。或者,使用- -autoresync參數來允許一個slave在10s後自動重新複製。使用- -autoresync參數時,slave在一個10分鐘的週期內,只會重新同步一次。

爲了防止這種情況的發生,你可以在master實例啓動時指定一個更大的oplog,通過使用mongod  --oplogsize參數。如果你不指定--oplogsize,mongod會自動分配5%的可用磁盤空間來創建oplog(在64位操作系統上最少1GB,32位操作系統上最少50MB)。

3.運行中的主從狀態參數

MongoDB在mongod實例中提供了一些指令行參數。
在一個master實例上,確認以下的操作能返回master的複製狀態:

rs.printReplicationInfo()

在一個slave實例上,使用以下操作來返回slave的複製狀態:

rs.printSlaveReplicationInfo()

4.使用副本集,模擬一個類似於主從複製的架構

如果你想使用副本集,模擬一個類似於主從複製的架構,考慮使用以下副本集參數文檔來部署。部署時,主機和提供了一個大致等同於雙實例的主從複製架構。

{
    _id : 'setName',
    members : [
        { _id : 0, host : "<master>", priority : 1 },
        { _id : 1, host : "<slave>", priority : 0, votes : 0 }
    ]
}

5.將主從架構轉變爲副本集

爲了將一個主從架構轉變爲副本集,將當前的master作爲副本集的一個成員來重啓。然後刪除之前的slave成員的數據目錄,並將slave新增作爲副本集的secondary成員。


a.確認當前實例爲master,執行:

db.isMaster()

該指令會返回一個類似文檔:

{
    "ismaster" : true,
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "localTime" : ISODate("2013-07-08T20:15:13.664Z"),
    "ok" : 1
}

b.停止master和所有的slave進程,使用以下的指令:

db.adminCommand({shutdown : 1, force : true})

c.備份你的數據目錄,以防你需要恢復到主從架構


d.將之前的master,使用- -replset參數啓動,指令爲:

mongod --replSet <setname>

e.使用mongo shell連接mongod實例,然後初始化副本集:

rs.initiate()

通過以下指令檢查你的副本集狀態:

rs.status()

6.其他維護


a.將slave提升爲master

· 假設A爲master,B爲slave,此時A發生故障,B爲正常
· 關閉A
· 關閉B
· 備份B上的dbpath的local數據文件,然後將B用- -master參數啓動。
· 此時A無法成爲B的slave,直到你能保證A上的數據是和B的數據一致

b.將master、slave反向

· 假設A爲master,B爲slave,此時A發生故障,B爲正常
· 關閉A
· 關閉B
· 備份B上的datapath的local數據文件,並刪除掉local.source文件(此處僅作爲備份,關鍵是要刪除掉local.source文件)
· 將B用--master參數啓動
· 在B上使用write操作,此時會在B上產生oplog
· 關閉B
· 複製B上的datapath下的local數據文件到A對應的目錄下
· 將B用--master參數啓動
· 將A用--slave --fastsync參數啓動(--dbpath參數可選)

c.通過現有的master磁盤鏡像,創建一個slave

· 假設A爲master,C爲一個新的slave
· 關閉A
· 拷貝A上的datapath下的local數據文件到C對應的目錄下
· 將A用--master參數啓動
· 將C用--slave  --fastsync參數啓動(--dbpath參數可選)

d.slave重新同步

· 假設A爲master,B爲slave,此時B的數據已經不一致
· 方法一,在線操作:
    use admin
    db.runCommand( { resync: 1 } )
· 方法二,離線操作:即關閉B,然後清空B的數據文件,最後啓動

e.複製鏈

slave不能做爲slave的複製源,意味着所有slave的複製源均爲master

f.修改slave的複製源

· 方法一,在線修改:單機啓動mongod,
    mongod
使用mongo shell連接後,更新local.source集合
    use local
    db.sources.update( { host : "prod.mississippi" },
    { $set : { host : "prod.mississippi.example.net" } } )
成功後,使用mongod --slave啓動(此時不需要--source參數,即使輸入了source參數效果也會被覆蓋)。
    mongod --slave
· 方法二,離線修改:即重新啓動mongod,使用目標的 source
mongod --slave --source prod.mississippi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章