天天看點

單台MongoDB執行個體開啟Oplog

 背景

随着資料的積累,MongoDB中的資料量越來越大,資料分析團隊從資料庫中抽取變化資料(假如依據欄位createdatetime,transdatetime),越來越困難。我們知道MongoDB的副本集有一個資料結構Oplog,裡面存儲了Primary節點的所有寫操作(此處的寫操作是指查詢以外的操作,包含 更新、異常等)。其實,資料的抽取完全可以從Oplog中抓取這些操作,然後去重放。

但是在實際的生産環境中,我們很多MongoDB 資料庫是單執行個體的,那麼我們能否在單執行個體資料庫上開啟Oplog?

答案是肯定的。

 其原理就是,在單執行個體上配置副本集,如果配置成功了,自然就有了Oplog。

配置過程

其實配置的過程比較簡單。

step 1 : 在配置檔案中 添加副本集參數(replSet);

step 2 :重新開機服務;

step 3:在local資料庫或admin資料庫執行初始化副本集的腳本,rs.initiate()。

注意事項

1. 在配置檔案中增加副本集參數(replSet=??),MongoDB執行個體重新開機,第一次登入,執行其他指令時(例如:show dbs),會提示錯誤,錯誤資訊如下,
{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}

此時一定要執行初始化的指令:
rs.initiate({ _id: "副本集名稱", members: [{_id:0,host:"ServerIP:MongoDBPort"}]})      
單台MongoDB執行個體開啟Oplog

 2 . 初始化時,請指明 Server資訊和端口資訊,否則初始化時可能報錯,報錯資訊如下

 "errmsg" : "No host described in new configuration 1 for replica set replwms maps to this node",

單台MongoDB執行個體開啟Oplog

 指定IP 和 端口,副本集名稱,例如執行以下指令,OK

單台MongoDB執行個體開啟Oplog

3 .  副本集初始化可以在admin中執行,不僅僅可以在local資料庫中執行【真正的副本集建立多是在admin庫中執行】。

   而不像有些文章中要求的那樣 :You just need to issue rs.initiate() on the local database:

4.  初始完,副本集中唯一的節點,可能短時間顯示為SECONDARY或OTHER。一般而言,稍等一會,就會自然恢複為primary,無需人工幹預。

單台MongoDB執行個體開啟Oplog

單台MongoDB執行個體開啟Oplog

如果資料庫的資料量不大,并且長時間初始這種過渡狀态(SECONDARY或OTHER),去看執行個體的日志,也顯示無進展,此時可以考慮重新開機服務。

下面案例是我們實際遇到的一個場景,我們是通過重新開機服務解決此問題,角色由other重新開機轉換為Primary 

單台MongoDB執行個體開啟Oplog