Erlang 分散システム勉強会レポート

Erlang 分散システム勉強会に参加しました。
すごく得るものが多かったです。無理してでも参加してよかった。
Erlangはまりそう。スマートすぎる。
Erlangに興味を持ったのが、FacebookChatのCometサーバがMochiWebだったからでした。
CouchDBは知らなったのですが、FacebookChatはJSONで帰ってきてたのでもしかしてCouchDBベース?

追記:
id:TAKESAKO さんがFlickrに写真をアップしてくれたようです。

追記2:
発表者全員のスライドのリンクを張り終わりました。(kunitさんthx!)

Kai/Dynamo のメカニズムと実装 (takemaruさん, 40分)

  • スライド
  • 75Kqps
  • 使い分け
    • 主キーアクセスs:Dynamo
    • 複雑なクエリー:SimpleDB
    • 大きいファイル:S3
  • key/value
  • 分散ハッシュテーブル
Partitioning
  • memcachedのノードに似ている
  • クライアントへの要求
    • memcachedとは違い、すべてのノードを知っている必要はない
  • ContextHashing
    • ハッシュで得られたノードだけでなく、後続のN個のノードにも格納
  • ノードに格納するさいにかならず、複数のデータセンターに分散して格納する
    • 単純にネットマスクで判断してる?
  • 仮想ノード
    • 見かけ上のノードを増やすことでハッシュのばらつきを一様にする
    • ノードの性能に合わせてノード数を調整できる
    • 性能がよいノードにたくさん仮想ノードを作ることで、処理を分散できる
メンバーシップ
  • ゴシップアルゴリズム
    • ノードの追加や故障時のアルゴリズム
    • うわさのように、ランダムに選んだ一定数のノードに故障などの情報をバケツリレーのように伝える
    • 簡単な仕組みだが、指数的に広まるため止まらない
  • chordアルゴリズム
    • 大規模クラス手向け
get/put
  • クライアントは複数のノードにリクエストを投げると、コーディネータへ転送される
  • コーディネータはキーを担当するノードのどれかが選ばれる
  • コーディネータがN個のノードにリクエストを転送
  • 定足数アルゴリズム
    • Quorm
    • コーディネータはN個すべてのノードの返答を待たないで、一定数の返答を得たら、クライアントに返す
バージョン管理
  • VectorClock
  • マスター不在・時刻同期なし
  • 並列ブランチの検出可能
  • 各ノードのカウンタのリストで管理
  • 各ノードがキーを更新するときに、自分のクロックをインクリメントし、VectorClockの自分のクロックを更新する
データの同期方法
Kai
  • erlang R12B
  • make testするときは、MakefileOS Xの環境になってるから、RUN_TESTの部分を変えてね
  • ノードに他のノードを教えるのは手動で教える
  • gen_serverがネックになって並列に動かない?(よく聞き取れませんでした)
  • 開発者募集中
    • 程よい課題そろってます

ejabberd の仕組み、と運用してみて気がついた erlang のすごいところ (hamano さん, 15分)

remote shell
  • erl -noshell
  • erl -remshでVMにアタッチできる
    • q().で自爆しちゃうから抜けるのはCtrl-C
ホットコードスワッピング
  • remote shellでアタッチし、beamファイルをサーバにおいてl(File)で書き換えられる

ドキュメント指向分散DB - CouchDB (id:yohei さん, 20分)

半構造データベース

TokyoTyrantの設計と実装について (平林さん, 20分)

TCの性能
  • ハッシュDBのreadで120万qps、固定長DBのreadで2700万qps
  • ライバルのBDBより早い
Erlangバインディングも近日出るらしい

mochiwebのすすめ (id:cooldaemon さん, 5分)

  • スライド
  • Web I/Fを簡単に作れる
  • Mochikitなど、mochimedia, Incのソースは読むと楽しい
  • RoRCatalystのように雛形を簡単に作れる
  • OTPに準拠している
  • application/supervisor構成
  • edoc対応
  • reloaderを起動するとデバッグが簡単
コツ
  • ビジネスロジック(モデル)は別プロセスで作る
  • プロセスはたくさん作る
    • サーバーを増やして分散するときに、分散の粒度が小さくなる
  • モデルのテストを書く
    • common_test
    • eunitもあるよ
  • モデルのログを残す
    • sasl

Erlangで分散倉庫番ソルバー (shuyoさん, 5分)