kumofsから学ぶNot only SQLの技術
NoSQLを知る〜kumofsから学ぶNot only SQLの技術 と題して、Developers Summit 2010で発表しました。
twitterの#devsumi2010 kumofsを見る限りでは大変ご好評をいただいたようで、ひとまずほっとしています。
プレゼンテーションの資料を公開しました。内容はどれも同じですが、クリックで進むムービー版がオススメです。
- クリックで進むムービー(クリック/矢印キーで進む)
- Keynoteファイル(Keynote '09が必要)
Consistent Hashingとdouble-hash-spaceアルゴリズムの紹介は、68ページ以降にあります。
第101回 カーネル読書会
2月25日に楽天タワーで行われるカーネル読書会でも、kumofs関連の内容について発表させていただくことになりました。
高い耐障害性と並列性が特徴の分散Key-valueストア「kumofs」を公開しました。今回はkumofsのアーキテクチャの紹介を通して、「スケールアウト」が可能なシステムの実装方法についてお話ししたいと思います。
今回のデブサミよりも、さらに実装寄りの内容について取り上げたいと思っています。分散システムのデバッグやテスト、プロトコルの設計などなど…話したいと言うよりは聞きたい内容なのですが^^;
ニコニコ動画で配信あるいは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の事例について書かれています。
パフォーマンスとスケーラビリティのためのデータベースアーキテクチャ (BPStudy#25発表資料)
サイボウズラボの奥 一穂さんのBPStudy#25での発表資料です。
Brewer's CAP Theorem
CAP定理の論文です。形式的で若干取っつきにくいので、次の解説記事を読んでからこの論文を読むのが良さそうです。
Brewer's CAP Theorem The kool aid Amazon and Ebay have been drinking
CAP定理の論文の解説です。和訳もあります:ブリュワーの 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