はちゅにっき

こっちのブログはまったり更新

スケールするウェブアプリケーションを20分で作る方法

Q4M の開発者でもある kazuho さんのセッション。

RDB の Sharding について。
Sharding するときに問題になるのは非正規化。
Twitter とかで発言があった場合に、全員のとこに発言があったことを書き込む必要がある。

既存手法

  • eventual consistency
    • 複数の DB へ非同期に書き込む
      • いいとこ: レスポンスが早い / スケールしやすい
      • 悪いとこ: メンテナンスが困難
  • 2 phase commit
    • 複数のDB書き込みが同期的
      • いいとこ: 同期的
      • 悪いとこ: レスポンス悪い / スケールしにくい

問題

  • 書き込みクエリが複雑
  • 一貫性を保証するのが難しい
  • サービス停止なしでスケールできない
    • 可能な限りダウンタイムなしでスケールしたい

作っているツール 「Incline」

2 つの問題を解決する

  • 書き込みクエリが難しいという問題
  • メンテナンスが大変という問題

基本的なアイデア

プログラマが非正規化を意識しなくていい。
それぞれのテーブルに Queue を持ち、それを使って全部自動でやってくれる。
トリガは定義ファイルから生成。
ノード内は同期的。
ノード間の通信は非同期。
C++ で実装している。

おまけ

Hash Base の Sharing と Range Base の Shaing
個人的には Range Base の Sharing がいいと思っている

  • あるレンジを指定して DB 引く機会がしばしばある
  • 手動でのメンテナンスがカンタン
  • 運用もらくらく

Pacific

動的に MySQL の分割を行っていく

  1. まず、レプリケーションを作る
  2. 2つの DB を役割分割する

安全にスピーディーに行うにはある程度のトレードオフが発生する。
Pacific ではそれを行うためのツール。

Perl のお話

ツールを使うための DBIx::ShardManager という Perl のモジュールを作ってる。