小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

ふぁぼったーの負荷分散の計画をあれこれ考えてみた。

今日一日調べたこととかまとめてみる。

問題点

  • 次回リリースの新機能はDB select負荷がかなり掛かるはずである。
  • 現状でもデータLOADによる負荷が10に達し、selectにスロークエリ、接続エラーが出ている。DBの負荷分散が急務である。

参考: Load Average

参考: Slow Query

  • あと、STATUSテーブルが2GBに達しようとしているので、デフォルトのサイズ制限4GBが見えてきた。再定義できるけど。

垂直分割対応案

日本語版DBと英語版DBのデータベースとクローラを別ホストに格納する
レプリケーションする
  • Webが参照するスレーブDBから、クローラの実行負荷を分離する事が出来る。
  • しかし、INSERT処理はマスタにもスレーブにも等しく走るので、このDBへの挿入負荷をスレーブDBから分離する事はできない。
  • 問題はINSERT時のテーブルロックだと思われるので、クローラ負荷が分離したところで効果はやや疑問。

水平分割対応案

MERGEテーブルを利用する
  • 複数のテーブルをマージするMERGEテーブルを利用する
  • INSERTのロック範囲を狭められるので効果はありそう。
  • 欠点
    • INSERT時の主キー同一性チェックがINSERT_METHODで指定した挿入テーブルに対してしか行われないので、挿入する対象テーブルはロジック側で完全に制御する必要がある。ぶっちゃけ面倒。
    • TritonnがMERGEテーブルに非対応。ふぁぼったー検索をMySQL以外で実装する必要がある。
パーティショニングを利用する
  • MySQL5.1の新機能。一つのテーブルを複数のパーティションに分割する。
  • MERGEテーブルと比べて、主キー同一性チェックの問題がないらしくてうれしい。より透過的?
  • 欠点
    • そもそもMySQL5.1なので、今はTritonnが使えない。
    • Groonga(単品)に移行するか、Groonga MySQLストレージのリリースを待つしかない

結論

こうして考えると、水平分割はふぁぼったー検索がTritonnに依存している関係上、一筋縄ではいかない。
ふぁぼったー検索をTritonn以外の方法(例えばGroonga単体)で実装すれば、ふぁぼったーはTritonn(=MySQL5.0.45)の呪縛から解き放たれ、MySQL5.1にアップグレードしモダンなパーティショニングを使う事ができる(MERGEテーブルは使いたくない)。
しかし、ふぁぼったー検索は、通常の全文検索だけでなく

  • 動的に増加するfav数によるフィルタリング
  • ユーザーによるしぼりこみ
  • ふぁぼりユーザー(fav_by)によるしぼりこみ
  • ユーザーのprotect状態変更への追従
  • 発言削除への追従

と、DBから分離して管理するには面倒な要件が盛りだくさんなので、片手間で独自実装するのは現実的とは思えない。つまり、Groonga MySQLストレージを待ちたい。


一方垂直分割に関しては、レプリケーションとDB分離、どちらがメリットがあるかすぐには分からないが、どちらも仕組みはとても簡単なので、どちらとも評価して決めればよい。総論として、ふぁぼったーDB負荷分散戦略としては、


「Groonga MySQLストレージエンジンを待望つつ、レプリケーションまたは日本・英語DBの分離を行う」


で決まりかと思われる。と結論が出たところで寝ます。おやすみなさい。