1. 程式人生 > >MongoDB資料庫遷移(複製集叢集遷移)

MongoDB資料庫遷移(複製集叢集遷移)

資料庫(複製集)遷移

@(MongoDB)[複製集|遷移|]

前言:

有時候由於業務或者其他因素的原因,我們需要將生產環境(複製集)中的資料庫遷移到新伺服器上,也有可能是異地機房,且宕機時間不允許太長;下面針對這個需求我們做一下測試。我認為5分鐘即可完成遷移;

準備

  • 3臺新機器
    • 10.26.231.107:37027
    • 10.26.231.108:37027
    • 10.26.231.109:37027
  • mongo3.4安裝包

架構圖說明

  • 新增新節點到原複製集
  • 同步資料保證資料一致
  • 叢集中移除新節點
  • 組建新叢集
    這裡寫圖片描述
    這裡寫圖片描述

步驟:

1、部署新節點

1.1 建立相應路徑

根據需要建立相應檔案(資料檔案,日誌檔案,程序目錄,認證檔案…),這裡就不再贅述了,如果實在不明白可以看我的其他文章。

1.2 修改啟動檔案

從原複製集拷貝一份啟動檔案,按需修改即可(修改相應目錄等)

1.3 複製資料檔案

登入原複製集Secondary節點上,鎖庫

SECONDARY>db.fsyncLock()

開啟另一個session,拷貝--dbpath下的所有檔案到新節點

$cd /data/dbdata
$ scp -r ./* mongo@10.26.231.107:/data/dbdata/

解鎖Secondary節點

SECONDARY>db.fsyncUnlock
()

1.4 啟動新節點

以拷貝來的資料檔案啟動新節點

/apps/mongodb/bin/mongod -f /etc/mongodbtestrs1.cnf

此時,若登入到節點上,執行rs.status()會提示報錯,因為此節點沒有加入到任何叢集中,報錯如下:
這裡寫圖片描述

2、加入叢集中

連線到原叢集的Primary節點上,執行如下命令將新節點加入副本集中

rs1:PRIMARY> rs.add("10.26.231.107:37027")
{ "ok" : 1 }

3、檢查資料同步狀態

此時檢視叢集狀態,會發現新節點狀態為STARTUP2,表示正在進行資料同步,待stateStr為如下狀態時,即表示資料一致:

"stateStr" : "SECONDARY",

4、切斷新節點

4.1 建立臨時資料

通知應用端停止寫入資料,此時通過生成一個臨時集合來檢查資料是否已同步完成

rs1:#PRIMARY> db.tmp.find()
rs1:PRIMARY> db.tmp.insert({task:"ForTest",cdate:new Date()})
WriteResult({ "nInserted" : 1 })

4.2 驗證資料

登入新的從節點檢視是否同步完成

rs1:SECONDARY> use Johnny
switched to db Johnny
rs1:SECONDARY> db
Johnny
rs1:SECONDARY> db.tmp.find()
Error: error: {
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",          
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
}
rs1:SECONDARY> rs.slaveOk()               ---報上述錯誤,使用此命令解決,預設secondary不提供讀
rs1:SECONDARY> db.tmp.find()
{ "_id" : ObjectId("5a53238a0a2b209188596c9a"), "task" : "ForTest", "cdate" : ISODate("2018-01-08T07:53:46.121Z") }

4.3 移除新節點

此時我們可放心進行移除操作,先鎖從庫(10.26.231.107上執行),防止又有新資料寫入導致資料不一致,不過應該不會發生此種情況。

rs1:SECONDARY> db.fsyncLock()

將節點從原複製集架構中移除(Primary上執行)

rs1:PRIMARY> rs.remove("10.26.231.107:37027")
{ "ok" : 1 }

解鎖從庫

>db.fsyncUnlock()          ---被移除後,此時新節點的mongo shell提示符會只有一個大於號

5、部署新複製集

5.1 啟動其餘節點

以如下方式啟動其他兩個新節點(108, 109),這裡就不再贅述如何配置如何啟動了(與上述新節點一樣配置即可)

$ /apps/mongodb/bin/mongod -f /etc/mongodbtestrs1.cnf

5.2 配置新複製集

重新連線此新節點(10.26.231.107)
:一定要以root角色登入,否則再進行新副本集配置的時候將報錯

$ mongo 10.26.231.107:37027admin -uroot -p

重新設定新複製集配置資訊

>config={_id:"rs1",members:[
{_id:0,host:"10.26.231.107:37027",priority:99},
{_id:1,host:"10.26.231.108:37027",priority:1},
{_id:2,host:"10.26.231.109:37027",priority:0,hidden:true,slaveDelay:3600}
]}
>rs.reconfig(config,{force:true})        ---重置新配置,force:在沒有Primary時強制生效配置
>rs.conf()                         ---檢視配置資訊

6、檢查叢集狀態

rs1.PRIMARY>rs.status(),執行此命令以檢視叢集狀態;生效後,mongo shell提示符將變更為PRIMARY>,且可通過此命令檢視其他節點應該是STARTUP2狀態,即同步資料中

總結:

至此,我們的複製集遷移就成功了,如果是異地機房遷移,在啟動新節點時一定要提前把原複製集的資料檔案拷貝過來再啟動,這樣可以省很多同步資料的時間;在使用rs.reconfig()命令重置架構配置時一定要把原節點IP都替換或者清楚掉,否則會把原複製集中的節點牽扯進來,從而導致原複製集崩潰(因為我遇到了);