質問: mongodにてスロークエリを出力することに関して質問させてください。 最近mongodでスロークエリを出力するために,ProfilingLevelを1に引き上げ、system.profileコレクションにスローログを出力するように設定しました。 このスローログをarbiterでも閲覧したいと考え、 (1) system.profileに出力 (2) oplog.rsに(1)のオペレーションログを出力 (3) arbiterが(2)を同期する という流れを考えたのですが、(2)のoplog.rsに(1)のオペレーションログがうまく出力されません。 もしかして、oplog.rsにはsystem系のコレクションに対するオペレーションログは出力されないのでしょうか。(現状(1)に関しては、system.profileにちゃんと出力されるようになっています) すみませんがご教授のほどよろしくお願い致します。
回答: > > もしかして、oplog.rsにはsystem系のコレクションに対するオペレーションログは出力されないのでしょうか。 > > > *local* DBの全部と*system.profile*だけはレプリケーションしないんです。 src/mongo/db/repl/oplog.cppから ``` bool oplogDisabled(OperationContext* txn, ReplicationCoordinator::Mode replicationMode, const NamespaceString& nss) { if (replicationMode == ReplicationCoordinator::modeNone) return true; if (nss.db() == "local") return true; if (nss.isSystemDotProfile()) // == "system.profile" return true; if (!txn->writesAreReplicated()) return true; fassert(28626, txn->recoveryUnit()); return false; } ``` なぜならプライマリーのプロファイル結果はセコンダリーのと一致しないべきです。ハードウェア差、ランダムタイミングなどの理由で異なっています db.setProfilingLevel()を実行したらそのMongoDBノードだけで*system.profile*を適用する仕組みがあるということです。