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都替換或者清楚掉,否則會把原複製集中的節點牽扯進來,從而導致原複製集崩潰(因為我遇到了);