先日こういう本が出まして、自分も一章ぶん参加しております。

4Gbpsを超えるWebサービス構築術4Gbpsを超えるWebサービス構築術
著者:伊勢 幸一
販売元:ソフトバンククリエイティブ
発売日:2009-08-21
おすすめ度:3.5
クチコミを見る


第6章の「入出力パフォーマンス」の章を担当しました。
おかげで書きためていたBlackholeエンジンネタを全部放出してしまった...

この第6章のタイトルを「入出力インピーダンス」にしようかという案も一瞬ありました。

PAとかオーディオには「ハイ受け/ロー出し」という言葉があります。
オーディオ機器の入力端子側と出力端子側では必要とされる役割りというかスペックが違っていて、
  • 入力側は、入力する側の機材の負荷にならないように高インピーダンス
  • 出力側は、出力信号のロスが少ないように低インピーダンス
にするのが基本です。

Webアプリケーションでも、例えばアクセス解析用のデータベースの入力側と出力側では要求される役割りが違い、
  • 入力側は、アプリケーションの本来の処理の足をひっぱらないように、とにかくインサート処理のレスポンスが軽いこと
  • 出力側は、様々な解析処理が可能なように、複雑な条件の where句や join、grop by などが柔軟に使えること
がそれぞれ必要とされます。

特に「ハイ受け」というのは、「入力する側から見ると、何も繋がってないのとほとんど同じ」 = 「入力のための余分な力がいらない」という意味あいがあります。このへんの設計の仕方がなんとなく両者に共通してる気がしたんだけど、なにぶん感覚的な表現なので誰にも伝わらないと思って、このタイトルは没となりました。

なにはともあれ、このように、webサービスを構成するモジュールの入力側と出力側で全く異なる特性が必要とされることはしばしばあって、その場合は、性質の異なる入力専用モジュールと出力専用モジュールを別々に用意して、その間をqueueでつなぐといった手法が有効です。

同じように mysql のレプリケーションを queue に見立て、入力側(master) と出力側(slave) に異なる役割りを持たせるのもひとつの手です。入力側のエンジンと出力側のエンジンを変える (特に、入力側にBlackholeエンジンという極端に特化したエンジンを使う) というのは「ハイ受け/ロー出し」の mysql バージョンとしてかなり有効だと思います。

ていうか実は、単にマイナーなエンジンを使うのが好きなだけかも ?

Blackholeエンジンがメジャーになったら、
「俺はBlackholeエンジンがマイナーな頃から注目していた」
「俺がBlackholeエンジンを育てたも同然」
「Blackholeエンジンはメジャーになって変わってしまった」

とか言い出しかねないな、俺...



この本の中では、「モジュールの入力側と出力側の特性を変える」方法として
  • 入力用のモジュールと出力用のモジュールを別々に用意し、その間をqueueでつなぐ
  • mysqlのレプリケーションを利用し、入力側(master)と出力側(slave)のエンジンを別のものにする
  • (同じくmysqlで) インデックスの貼り方を変えた入力専用のバッファテーブルを用意し、入力を本テーブルから切り離す
という3つの手法を紹介しました。最後のはCicindelaなどでも使っている方法です。



こんな図も色々書いた↓
4gbps

実はこの章の中に出て来る図は、僕が失敗コピーの裏紙にフリーハンドで走り書きしたきったない絵を、出版社の人が清書してくれたものです。

まず、うちの社内にあったコピー機に、「紙をスキャンして共有ディレクトリに tiff ファイルを生成する」という便利機能がついていたのに驚き。
そしてその汚いスキャン画像をメールで送ったら、ソフトバンクパブリッシングの人がちゃんと読み取って図におこしてくれたのに二度驚き。その節は大変お世話になりました。