Mongodb
日誌關閉時的 MongoDB 寫入問題
我正在執行帶有兩個輔助節點的 mongo 3.4.7 (WiredTiger) 副本集。
根據文件,當啟用日誌並寫入問題時
{w: "majority", j: 0}
,在數據寫入“記憶體中”後發送 ack。但是,文件沒有指定在伺服器上關閉
--nojournal
日誌時會發生什麼 ( )。在那種情況下會發生什麼?寫關注在等待什麼?
由於您將 MongoDB 3.4.7 與 WiredTiger 一起使用,因此如果您使用預設值執行 MongoDB(啟用日誌),則存在某些預設值:
- 如果是新創建的,副本集將使用協議版本 1(請參閱副本集協議版本)
- 預設寫關注是
{w:1}
(見寫關注)- 使用
{w:'majority'}
時,預設情況下{j:true}
是否按預設啟用日誌(請參閱writeConcernMajorityJournalDefault)如果您在沒有日誌的情況下執行 MongoDB,則 using
{w:'majority', j:true}
將導致錯誤(請參閱關於j 選項的註釋部分):[PRIMARY:replset] test> db.test.insert({a:1},{writeConcern:{w:'majority', j:true}}) WriteResult({ "writeError": { "code": 2, "errmsg": "cannot use 'j' option when a host does not have journaling enabled" } })
請注意,與直覺相反,使用該
--nojournal
選項執行 WiredTiger 可能會使其變慢。這是因為 WiredTiger 在 MongoDB 3.4 中每 60 秒或 2 GB 數據執行一次檢查點,並在檢查點之間寫入日誌。禁用日誌將強制任何日誌刷新成為檢查點。由於與完整檢查點相比,日誌同步相對輕量級,因此強制檢查點會減慢 WiredTiger。