MongoDBに悩む(前編)

こんにちは マネックスラボのMです。

ラボでは過去に構築されたシステムにMongoDBを使用しています
どうやらその当時流行っていたという理由で採用されたようですが
ラボのサービスへのアクセスが増えてきたことで最近は限界を感じています
実はまだ解決に至っていないのですが、経過報告をさせていただきます

Insert系が遅い

ラボのあるサービスではかなり高頻度でInsertされ、高頻度でSelectされる使い方をしています
Insertされる処理をA、Selectされる処理をBとしたとき
AとB両方に秒間155回ずつ1分間 合計18600回の処理を実行すると
以下に表されるように処理時間が遅くなったりエラーになってしまいます

ちなみにAとB個別に処理時間の遅延が発生する限界を調べると
Aは秒間210程度の処理で限界を迎えますが
Bは秒間500程度の処理まで耐えることができます
約2.3倍の処理能力の差があることになります
これはMongoDBがレプリケーションを前提とした仕組みであるため
Aにはレプリケーションによる処理遅延が発生しているのではないかと想像しました

レプリカセットをゼロにしてみる

rs.remove("mongo02.monex.co.jp:11111");
rs.remove("mongo03.monex.co.jp:11111");

とりあえず手軽に検証できるので、強制的に1台になるようにしてみました
すると、劇的にパフォーマンスが改善しました

レプリカセット0 1回目

が、複数回負荷をかけてみると、どんどんとパフォーマンスが劣化していきます
※そもそもMongoDBは最低1つのレプリカセットを必須にしているらしいので、的外れなことをやっているかもしれませんが・・

レプリカセット0 2回目
レプリカセット0 3回目

レプリカセットを3つに戻してみる

rs.add("mongo02.monex.co.jp:11111");
rs.add("mongo03.monex.co.jp:11111");

すると、ゼロにしたときと同様にまた劇的にパフォーマンスが改善しました

レプリカセット3 1回目

そして、複数回負荷をかけてみると、これまた同様にどんどんとパフォーマンスが劣化していきます
なんだったら、レプリカセット0よりもパフォーマンスが良く、2回目と3回目の劣化度合いもマシです

レプリカセット3 2回目
レプリカセット3 3回目

が、これは何度も試した感じではたまたまこうなっただけで誤差の範囲です
つまり、レプリカセットの数に限らず、レプリカセットの設定を変更した際に
何かしらの変化が現れている可能性が高いという予想をしています

そもそも使っているMongoDBが古すぎる

実はラボがこのシステムで使用しているMongoDBのバージョンは2.6.12です
現在の最新バージョンは7ですから、チューニング以前にまずはバージョンアップするのが自然だと思っています
バージョンアップで解決するのか、更にチューニングが必要なのか、はたまたMongoDBとお別れするのか
次回、後編でまた報告させていただきます