kumofsから学ぶNot only SQLの技術

NoSQLを知る〜kumofsから学ぶNot only SQLの技術 と題して、Developers Summit 2010で発表しました。
twitter#devsumi2010 kumofsを見る限りでは大変ご好評をいただいたようで、ひとまずほっとしています。


プレゼンテーションの資料を公開しました。内容はどれも同じですが、クリックで進むムービー版がオススメです。

Consistent Hashingとdouble-hash-spaceアルゴリズムの紹介は、68ページ以降にあります。

第101回 カーネル読書会

2月25日に楽天タワーで行われるカーネル読書会でも、kumofs関連の内容について発表させていただくことになりました。

高い耐障害性と並列性が特徴の分散Key-valueストア「kumofs」を公開しました。今回はkumofsのアーキテクチャの紹介を通して、「スケールアウト」が可能なシステムの実装方法についてお話ししたいと思います。

http://d.hatena.ne.jp/hyoshiok/20100217#p1

今回のデブサミよりも、さらに実装寄りの内容について取り上げたいと思っています。分散システムのデバッグやテスト、プロトコルの設計などなど…話したいと言うよりは聞きたい内容なのですが^^;
ニコニコ動画で配信あるいはustreamでの中継も行われるようなので、何か知見がありましたらこの機会に教えていただけると嬉しいです。

Web+DB Press vol.55

ついでに宣伝ですが^^; Web+DV Press vol.55で特集を執筆させていただきました(2月24日発売予定)。タイトルは「モダンネットワークプログラミング入門」です。
デブサミでも終盤に取り上げた、「MessagePack-RPC」に関連した内容になっています。

参考文献リスト

今回お話しさせていただいた内容は、前半はkumofsはなぜスケールするかの内容をまとめ直したもので、後半はInteropクラウドコン優勝は「えとらぼ」分散key-valueストレージ kumofsの内容をデブサミ用にまとめ直したものが骨組みになっています。
技術的には概要的な内容に留まっているので、より深く知りたい方には以下の文献がオススメです。

kumofsのソースコード

言わずもがなですが^^; kumofsはオープンソースになっています。
kumofsの概要については分散Key-Valueストア「kumofs」を公開しました!にまとめています。

kumofs(クモエフエス)は、実用性を重視した分散データストアです。レプリケーション機能を備え、一部のサーバーに障害が発生しても動作し続けます。単体でも高い性能を持ちながら、サーバーを追加することで読み・書き両方の性能が向上する特徴を持ち、低コストで極めて高速なストレージシステムを構築・運用できます。

使い方などのドキュメントはここにあります:http://github.com/etolabo/kumofs/blob/master/doc/doc.ja.md

4Gbpsを超えるWebサービス構築術

発表の中でも取り上げた一冊です。LivedoorのWebシステムについて解説されています。

[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

上記の「4Gbps本」と双璧をなす(?)、Webシステムの構築/運用技術について解説した本です。はてなとKLabの事例について書かれています。

Brewer's CAP Theorem

CAP定理の論文です。形式的で若干取っつきにくいので、次の解説記事を読んでからこの論文を読むのが良さそうです。

Dynamo: Amazon’s Highly Available Key-value Stor

Amazonの分散Key-valueストア「Dynamo」の論文です。今回取り上げようとも考えていたのですが、Vector Clockを使ったEventually Consistentな一貫性の維持を行っています。
あわせて読みたい

Bigtable: A Distributed Storage System for Structured Data

Googleの分散データストア「Bigtable」の論文です。Bigtableのデータモデルなどについて書かれています。Google App Engineの裏側を垣間見ることができて面白いかもしれません。

デモ

最後にデモを行いました。内容は実際にkumofsのクラスタを動かす方法についてと、kill -9でサーバのプロセスを殺しても正しく動き続けるかを確かめる実験、そして管理ツールの使い方や拡張についてです。
管理ツールのデモでは、kumofsのサーバ群から情報を集めてきて集計する「kumosum」というコマンドを突貫で実装しました。kumosumのコードは以下のようになっています:

#!/usr/bin/env ruby
require 'rubygems'
require 'msgpack/rpc'
#gem install msgpack-rpc

GetNodesInfo = 99
GetStatus    = 97
STAT_CMD_GET     = 4
STAT_CMD_SET     = 5
STAT_CMD_DELETE  = 6

def get_servers(host, port)
  mgr = MessagePack::RPC::Client.new(host, port)
  begin
    info = mgr.call(GetNodesInfo)
    info[0][0].map {|raw|
      active = (raw.slice!(0) == "\1"[0])
      addr = MessagePack::RPC::Address.load(raw)
      active ? addr.to_a : nil
    }.compact
  ensure
    mgr.close
  end
end

if ARGV.length < 1
  puts "Usage: #{File.basename($0)} address[:port=19700]"
  exit 1
end

addr = ARGV.shift
host, port = addr.split(':', 2)
port ||= 19700

servers = get_servers(host, port)

time = Time.at(0)
before = 0

while true

  # kumosum -> kumo-server 1
  # kumosum <- kumo-server 1
  # kumosum -> kumo-server 2
  # kumosum <- kumo-server 2
  # kumosum -> kumo-server 3
  # kumosum <- kumo-server 3
  #nums = servers.map {|host, port|
  # c = MessagePack::RPC::Client.new(host, port)
  # c.call(GetStatus, STAT_CMD_GET) rescue nil
  #}

  # kumosum -> kumo-server 1  :
  # kumosum -> kumo-server 2  : 並列処理
  # kumosum -> kumo-server 3  :
  # kumosum <- kumo-server 1
  # kumosum <- kumo-server 2
  # kumosum <- kumo-server 3
  reqs = servers.map {|host, port|
    c = MessagePack::RPC::Client.new(host, port)
    c.send(GetStatus, STAT_CMD_GET)
  }
  nums = reqs.map {|req|
    req.join.result
  }

  sum = nums.compact.inject(0) {|sum,num| sum + num }
  now = Time.now

  val = (sum - before) / (now - time)
  puts "#{val.to_i} requests/sec (total #{sum})"

  before = sum
  time = now

  sleep 0.5
end