ziguzagu.org

YAPC::Asia 2009 特別研修 - DBIx::Class と MySQL による Perl アプリのスケーリング

YAPC::Asia 2009 最終章。

特別研修 Moose 入門に引き続き、『DBIX::ClassとMySQLによるPerlアプリケーションのスケーリング術』に参加してきた。

上のページにはいくつかトピックスが書いてあるけど、大まかには3部構成(具体的にタイトルがついていたわけじゃないけど)。

つかみ

おもむろに「みなさん前に出てきてください」といって、タロットカードみたいな大きめトランプをだし、数字探しゲーム(自己紹介もなし!)。

まずは 1 人 vs 3 人で、ホワイトボードに書かれた 5 つの数字を探す。3 人チームは、 30 秒程度で全部探しあて、1人チーム(?)は、1 分 30 秒かかってようやく完了。

続いてふたたび別の数字を 5 つホワイトボードに書いて、その4人に指令。「カードをどんなルールでもいいから 30 秒(だったかな?)で並べなさい。」ちょっと相談して、その4人チームは数字ごとにまとまりを作ることに。まだそろいきってはいないものの、ほぼまとまったあたりで時間終了。

で、探し始めるのかと思いきや、ホワイトボードに書いた数字を消す!?「はい仕様変更です。いままでのは忘れてください。ビジネスにはよくあることです、はっはっは(だいぶ意訳)」と言って、カード並べを見ていた4人に指令(僕こっち)。「これから数字5つを書きますので、目をつぶってください。Go といったら数字を確認してカードを探してください。」さらさらさら。

「Go Go Go !! 」(ジョジョじゃないよ)

あたふたしつつも、あらかた並んでたのでなんとか 20 秒くらいで捜査完了。

そんなこんなで、ようやく着席。そして質問。

「この結果からわかることをあげてください」

  • 1人より複数のほうが速い
  • 同じ人数でも、あらかじめ並んだものから探す方が速い

「そのとおり。これは、データベースも一緒です。」

こんな幕開け そしてようやく自己紹介と今日の簡単なアジェンダ紹介

まずは 前半に知識、後半はテーブルごとに(今回は3つ)前半で覚えたことを生かして簡単なアプリを作る、という2部構成。

知識

まずは参加者に、スケーラビリティを確保するためにいままでやったことと、そしてそのときに起きた問題を聞かせてくださいと質問。で、やったこととして、でてきたのが、

  • レプリケーション
  • キャッシング
  • パーティショニング

うむ。みんなわかってるよねってことで、小休憩を挟んでここから怒涛のレクチャー。メモ垂れ流し。

  • MySQL のストレージエンジンについて
    • MyISAM
      • トランザクションなし、行レベルロックできない
      • Readonly もしくはほとんどが Read なものであれば速い
    • InnoDB
      • これ以外の選択肢はあまり考えたことがない
  • Replication (MySQL)
    • Master - Slave
      • DBIC でサポートしているの使える
      • そんなに難しくない
    • Multi Master
      • DBIC ではサポートしていない
  • Profiling
    • DBIx::Class::QueryLog 使ってパフォーマンス計測
    • export DBIC_TRACE=1 を使って実際に発行される SQL とか確認
  • ResultSet
    • Query の発行をできる限り抑える
    • fetch したやつはすべてオブジェクトつくっちゃう
      • HashRefInflator 使おう
    • colum でとってくるカラムをしぼれる
      • join とあわせて使うと、場合によっては大量の query を発行してしまう可能性がある
      • 代わりに prefetch を使う
    • join か prefetch か
      • 常に prefetch を使えばいいというものではない
      • prefetch は "データ" が欲しいときのみ
  • primary key
    • auto increment はデーターベース単位なのでスケールしない
    • UUID を使おう(UUID でかすぎと思う場合は YUID がいいよ、という 6A プロダクト宣伝しとけばよかったか。)
  • job queue
    • schwartz / gearman だね
    • job queue として EC2 とかのクラウドを使うっていうのはいいね
  • CDN
    • client の接続速度のばらつきを吸収してくれる
    • 同時接続数をおさえることができる
  • 使えるツール紹介
    • ab
    • mytop
    • nagios
  • CPAN モジュール紹介
    • Catalyst::Model::DBIC::Schema の
      • Catalyst::TraitFor::Model::DBIC::Schema::Caching
      • Catalyst::TraitFor::Model::DBIC::Schema::Replicated
    • MySQL::Sandbox
    • Test::DBIx::Class

DB のスケールに特化した講義というよりは、Web アプリ自体をスケールするという話もあったり。『DBIx::Class をつかった』という部分は実は決して多くはなかったので、ちょと想定してきたイメージと違った。とはいえ DBIC ででき(う)ることがわかったのと、知らないモジュールも使い方もでてきて勉強になった。

あとモジュールなるべく最新版をこまめにバージョンアップして使うことをおすすめしていた。Query の最適化具合とかが結構違うとか。Catalyst も 5.8 で使うのがおすすめとのこと。(Moose)の Traits でモジュール指定する(+ちょっと設定)だけでもろもろ使えるのがらくちん、とのこと。

実践

3 つのグループにわけてテーマを決めてアプリ作り。各グループで、

  • Replication
  • Caching
  • Job queue

から最低どれか 1 つの技術を選んだ後、DBIx::Class の機能のうち

  • HashRefInf
  • Prefetch
  • QueryLog(だったかな)

のどれかを混ぜつつなにがしかのアプリを作ること。

僕のグループでは、Caching つかって microblog つくることに。DBIC でつかうのは…、なんだったっけ…(汗)。結果的にはアプリ自体は未完成でしたが(なぜか僕の環境でキャッシュがうまく機能してくれない)、指定方法含め DBIC の知識いくつかを得ることはできたのでよかったです。作業的にはだんとつで僕が足引っ張ってました…。

他のグループでは、

  • フォームから入力された内容を、job queue を使ってメール配信
  • Replication つかってのなにか(自分のことばかり気にしていてメモしてない...)

というものを作っていました。メール配信のは完成されていたようですばらしす。Replication チームは、MySQL::Sandbox をつかっての Master / Slave 環境を整えるのに一苦労でアプリの開発までは行けなかったようだけど、その苦労はそれはそれで楽しそうではあったかな。僕も今度やってみよっと。

まとめ

正直なところをいえばもすこし具体的な所の話は欲しかったかなと。Job Queue にしても、TheSchwartz がいいよ、とはいったもののコード的な説明はいっさいなかったり、POD での説明だけで終わったモジュールも結構あったので。アプリ作りするには、ちょっと知識のほうの前ふりがよわかったかなと。とはいえ、DBIC に関して教えてもらえたことは知らない内容ばかりだったのでとても勉強にった。

あと、その日たまたま同じテーブルについたひとと、突然チーム開発をはじめるっていうのはいい経験だった(自分のへたれ具合を再確認できた、という意味でも)。

そして、今回の参加者は Moose 入門よりさらにすくない 8 名…。うーむ、残念。

YAPC::Asia 2009 終了!

以上で、研修も今年の YAPC::Asia も終了。カンファレンスはもちろんだけども、今回の研修には本当に満足。自分のレベルにあた研修があったら参加しとくべきだなと。まぁ、毎回今回のようなクオリティの研修が行われるとは限らないけれども、金銭的なところだけでさけて通るにはとても惜しいなぁと思いますた。

やぁ、よかった、よかった。