SlideShare a Scribd company logo
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
1
2009-02-20 1st Key-Value Store Workshop
たけまる
2
Kaiとは?
3
Dynamo + memcache API
Erlang
4
以上
5
質問?
6
:-P
自己紹介
7
  井上 武(たける)
  http://teahut.sakura.ne.jp/
  主な仕事
  分散システムの研究開発
  マルチキャストとその応用システム
  Web アーキテクチャとデータストア
  オープンソース
  AtomPub (Perl)
  Kai (Erlang)
  Erlang 分散システム勉強会を開催(次回は5~6月頃?)
8
Kaiとは?
9
Dynamo + memcache API
Erlang
Dynamo の特徴(1/2)
10
  Key, valueデータストア
  分散ハッシュテーブルっぽい
  高い分散透過性
  Peer-to-peer アーキテクチャ
  クラスタ管理コストの抑制
  耐障害性
  たとえデータセンター障害であっても
  障害時にも待ち時間要求を満たす
get(“joe”)
joe
joe
joe
Dynamo の特徴(2/2)
11
  Service Level Agreements
  99.9%のクエリに対して300ms以内
  平均では,読み取りに15ms, 書き込みに30ms
  高い可用性
  ロックなし,いつでも書き込める
  結果整合性 (Eventually Consistent)
  複製はゆるく同期
  不整合はあとで解消
可用性と一貫性のトレードオフ
- RDBMSは一貫性を優先
- Dynamoは可用性を重視
joe
joe
joe
get(“joe”)
Eventually Consistent – 書き込みの振る舞い
  3レプリカを並行して書き込み
  Consistent Hashing で選択
12
joe
厳密に正確ではないが,Dynamo の特徴を理解しやすく説明
Eventually Consistent – 書き込みの振る舞い
  3レプリカを並行して書き込み
  Consistent Hashing で選択
  分散ロック・コミットなし
  ベクトルタイムスタンプを刻印
  不整合は読み取り時に解消
  高い可用性!
13
joe
joe
Eventually Consistent – 書き込みの振る舞い
  3レプリカを並行して書き込み
  Consistent Hashing で選択
  分散ロック・コミットなし
  ベクトルタイムスタンプを刻印
  不整合は読み取り時に解消
  高い可用性!
14
joe
joe
joe
joe
Eventually Consistent – 読み取りの振る舞い
  3レプリカから並行して読み取り
  Consistent Hashing で選択
15
joe
joe
joe
古いデータ
Eventually Consistent – 読み取りの振る舞い
  3レプリカから並行して読み取り
  Consistent Hashing で選択
  バージョン不整合を解消
  ベクトルタイムスタンプを比較
16
joe
joe
joe
joe
joe
joe
古いデータ
Eventually Consistent – 読み取りの振る舞い
  3レプリカから並行して読み取り
  Consistent Hashing で選択
  バージョン不整合を解消
  ベクトルタイムスタンプを比較
  古いデータを上書き
  結果的に整合性がとれた
  Eventually Consistent!
17
joe
joe
joe
joe
上書き
分散透過性とは?
18
  分散透過性とは?
  分散していることの隠蔽度
  Peer-to-peer アーキテクチャは透過性が高い(ことが多い)
  透過性が高いと管理コストは低下
  自律的なクラスタシステム
  クライアント(アプリケーションサーバ)の簡易化
  性能とのトレードオフに注意
  自律制御のためのオーバヘッドあり
  日本のWebサイトは透過性より性能を優先する傾向あり?
  場所
  × クライアントがデータとノードの対応関係を保持
  パーティショニング情報を管理
  ○ システムが個々のデータの位置を隠蔽
  どのノードにアクセスしてもよい
  移動
  × ノード追加・離脱時にクライアントがデータを移動
  責任クライアントの選択と信頼性に課題
  ○ システムが適切に移動
  障害
  × クライアントが障害を検知して回避
  × 性能の急激な低下(Master-Slave だと半減)
  ○ システムが障害装置を除去,軽微な性能低下
  管理コストの低下
  Peer-to-peer アーキテクチャ
分散透過性の種類
master
 master
 master
slave
 slave
 slave
分散システム
19
×
○
Dynamo まとめ
20
  分散 key-value store
  高い分散透過性
  Peer-to-peer アーキテクチャ
  クラスタ管理コストの抑制
  高い可用性
  ロックなし,いつでも書き込める
  結果整合性(Eventually Consistent)
21
Dynamo + memcache API
Erlang
memcache API
22
require ‘memcache’
# サーバを指定
cache = MemCache.new ‘127.0.0.1:11211’
# set: ‘key’ に ‘value’ を格納
cache[‘key’] = ‘value’
# get: ‘key’ に対応するデータを取得
p cache[‘key’]
Ruby
use Cache::Memcached;
# サーバを指定
my $cache = Cache::Memcached->new({
servers => [‘127.0.0.1:11211’],
});
# set: ‘key’ に ‘value’ を格納
$cache->set(‘key’, ‘value’);
# get: ‘key’ に対応するデータを取得
print $cache->get(‘key’);
Perl
<?php
# サーバを指定
$cache = new Memcache;
$cache->connect(’127.0.0.1', 11211);
# set: ‘key’ に ‘value’ を格納
$cache->set('key', ‘value’);
# get: ‘key’ に対応するデータを取得
$cache->get('key');
?>
PHP
# サーバを指定
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(new String[]{“127.0.0.1:11211"});
pool.initialize();
MemCachedClien tcache = new MemCachedClient();
# set: ‘key’ に ‘value’ を格納
cache.set(“key”, “value”);
# get: ‘key’ に対応するデータを取得
System.out.println((String) cache.get(“key”));
Java
memcache API
23
  クライアント実装がたくさん存在
  開発の手間を省略
  Not perfect, but enough
  じつは Dynamo の機能を完全に実現するには貧弱
  Dynamo は独自 API
  ほとんどの場合は問題なし
24
Dynamo + memcache API
Erlang
Erlang の使いどころ
25
  Distributed key-value store に適
  11 のうち 5つが Erlang 製(右表)
  Anti-RDBMS:A list of distributed key-value
stores より(Last.fm の中の人)
  分散透過性の高いシステムに多い
  Kai も紹介されてます 
  どうして日本では使われないのだろう?
分散システム開発におけるErlangの特徴
  マルチコア・プログラミングの簡易化
  アクターモデル
  イベント駆動と比較
  例:3レプリカから並行して読み取り,2つを得たらレスポンス
  非破壊メモリ(変数への再代入不可)
  分散システム開発の簡易化
  組み込みの直列化関数
  組み込みのノード管理システム
  そこそこ速い
  Java未満,LL以上
  弱点もある(正規表現など)
26
イベント駆動(Perl POE)
  イベント単位に関数を実装
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
my $State;
sub recv_from_client;
sub recv_from_node;
sub timeout;
sub another_error;
擬似コード
27
共有リソース
イベント駆動(Perl POE)
  クライアントがリクエスト
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
sub recv_from_client {
$cli_sock->recv(my $req, 1024);
28
共有リソース
イベント駆動(Perl POE)
  レプリカを持っている3ノードに転送
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
29
共有リソース
state_init($cli_sock);
my @nodes = choose_nodes($req);
for my $node (@nodes) {
$sock = IO::Socket::Inet->new(…);
$sock->write($req);
$poe->kernel->select_read(
$sock, 
‘recv_from_node’,
$cli_sock,
);
}
イベント駆動(Perl POE)
  1つめからレスポンス
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
sub recv_from_node {
my $cli_sock = $poe->args->[2];
$node_sock->read(my $res, 1024);
stat_add_res($cli_sock, $res);
my $count = stat_count_res($cli_sock);
if ($count == 2) {
30
共有リソース
イベント駆動(Perl POE)
  2つめのレスポンスでクライアントに返す
  タイムアウトしても返す
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
31
共有リソース
sub recv_from_node {
my $cli_sock = $poe->args->[2];
$node_sock->read(my $res, 1024);
stat_add_res($cli_sock, $res);
my $count = stat_count_res($cli_sock);
if ($count == 2) {
my $res = stat_uniq_res($cli_sock);
$cli_sock->write($res);
}
イベント駆動(Perl POE)
  イベント(時間の進み)単位の実装
Client
 Receive from Client
 Receive from Node
 Node
Client
Dynamo
Node
Dynamo
Node
Receive from Client
 Receive from Node
Timeout
State
32
共有リソース
アクターモデル(Erlang)
  プロセス単位の実装
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
33
状態はプロセスごと
(共有リソースはない)
アクターモデル(Erlang)
  クライアントがリクエスト
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
Processes for Nodes
recv(Sock) ->
{ok, Req} = gen_tcp:recv(Sock, 0),
lists:foreach(
fun(Node) -> spawn(Mod, map, [Node, Req, self()]) end,
choose_nodes(Req)
),
Res = gather(2, []), 
34
アクターモデル(Erlang)
  レプリカを持っている3ノードに転送
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
Processes for Nodes
map(Node, Req, Parent) ->
{ok, Sock} = gen_tcp:connect(Node, …),
gen_tcp:send(Sock, Req),
35
アクターモデル(Erlang)
  1つめからレスポンス
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
Processes for Nodes
map(Node, Req, Parent) ->
{ok, Sock} = gen_tcp:connect(Node, …),
gen_tcp:send(Sock, Req),
receive
{tcp, Sock, Res} ->
send(Parent, Res);
36
アクターモデル(Erlang)
  2つめのレスポンスでクライアントに返す
  タイムアウトしても返す
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
Processes for Nodes
map(Node, Req, Parent) ->
{ok, Sock} = gen_tcp:connect(Node, …),
gen_tcp:send(Sock, Req),
receive
{tcp, Sock, Res} ->
send(Parent, Res);
37
アクターモデル(Erlang)
  2つめのレスポンスでクライアントに返す
  タイムアウトしても返す
Client
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Dynamo
Node
Process for Client
Processes for Nodes
38
Res = gather(2, []),
gen_tcp:send(Sock, Res).
gather(0, Acc) ->
Acc;
gather(N, Acc) ->
receive
Res -> gather(N-1, uniq([Res|Acc])),
after 100 -> % timeout
Acc
end.
アクターモデル(Erlang)
  プロセス単位の実装
Client
 Process for Client
 Process for Node
 Node
Client
Dynamo
Node
Dynamo
Node
Process for Client
Process for Node
39
状態はプロセスごと(共有リソースはない)
Erlang まとめ
  マルチコア・プログラミングの簡易化
  アクターモデル
  共有メモリがなく安全
  プロセスが軽い
  Copy on write 的にメッセージパッシングを効率化
  非破壊メモリ(変数への再代入不可)
  分散システム開発の簡易化
  組み込みの直列化関数
  組み込みのノード管理システム
  そこそこ速い
  Java未満,LL以上
  弱点もある(正規表現など)
40
宣伝
41
  情報処理学会誌に Erlang 解説記事を寄稿
  2009年3月号
42
Kaiとは?
43
Dynamo + memcache API
Erlang
Kai の概要
44
  Dynamoのオープンソース実装
  開発者の本籍地から命名
  検索しにくい…
  kie とかにしておけばよかった orz
  erlang, dynamo, sourceforge などと組み合わせて検索
  memcache API
  Erlang
  sourceforge.net で開発中
  http://kai.sf.net/
  開発者 3.5名
  2,260行
  基本的な振る舞いは完了
Kai の性能
45
  条件
  Xeon 2.13 GHz x4
  1 KB/データ
  メモリストレージ(ディスクも選択可)
  1ノード(like a memcached)
  10,193 qps (readのみ, 複製なし)
  5ノード
  14,212 qps (read:write = 80:20, 複製あり)
  少し前に測った値なので,いまはもう少し低いかも
46
Kaiとは?
47
Dynamo + memcache API
Erlang
48
以上
49
質問?

More Related Content

PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
KEY
Development app-with-elixir
PDF
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
PDF
配布用Beginnerならきっと役立つmaster slave環境
PDF
Clojure
PDF
Solr meeting in Japan 2011
PPTX
CMSとPerlで遊ぼう
PDF
勉強会force#4 Chatter Integration
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Development app-with-elixir
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
配布用Beginnerならきっと役立つmaster slave環境
Clojure
Solr meeting in Japan 2011
CMSとPerlで遊ぼう
勉強会force#4 Chatter Integration

What's hot (20)

PPT
CPANの依存モジュールをもう少し正しく検出したい
PPTX
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
PDF
Tottoruby 20110903
KEY
あらためてPHP5.3
PDF
Riak Source Code Reading #2: Erlang Client
PDF
Apache Torqueについて
PDF
MySQL ガチBeginnerがやってみたことと反省したこと
PDF
ZabbixによるAWS監視のコツ
PPTX
宣言的(Declarative)ネットワーキング
PPTX
Esm lt threading_macro
PDF
MySQL日本語利用徹底入門
PDF
MySQL5.6検証レポート
PDF
MySQL Partition Engine
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
PHP 2大 web フレームワークの徹底比較!
PDF
Valhalla Update JJUG CCC Spring 2019
PDF
東京Node学園#3 Domains & Isolates
PDF
MySQLとPostgreSQLの基本的な実行プラン比較
PPT
HandlerSocket plugin for MySQL
PDF
MySQLとPostgreSQLの基本的なパラメータ比較
CPANの依存モジュールをもう少し正しく検出したい
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Tottoruby 20110903
あらためてPHP5.3
Riak Source Code Reading #2: Erlang Client
Apache Torqueについて
MySQL ガチBeginnerがやってみたことと反省したこと
ZabbixによるAWS監視のコツ
宣言的(Declarative)ネットワーキング
Esm lt threading_macro
MySQL日本語利用徹底入門
MySQL5.6検証レポート
MySQL Partition Engine
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PHP 2大 web フレームワークの徹底比較!
Valhalla Update JJUG CCC Spring 2019
東京Node学園#3 Domains & Isolates
MySQLとPostgreSQLの基本的な実行プラン比較
HandlerSocket plugin for MySQL
MySQLとPostgreSQLの基本的なパラメータ比較
Ad

Similar to Kai = (Dynamo + memcache API) / Erlang (20)

PPT
分散Key/Valueストア Kai 事例紹介
PDF
Guide to Cassandra for Production Deployments
PDF
Erlangやってみた
PDF
Kyoto Tycoon Guide in Japanese
PDF
20110517 okuyama ソーシャルメディアが育てた技術勉強会
PDF
Scala + Finagleの魅力
PDF
#dnstudy 01 Unboundの紹介
PDF
ROMA のアーキテクチャと社内事例
PDF
OSSとクラウドによるコンピューティングモデルの変化
PDF
DeNAインフラの今とこれから - 今編 -
PDF
BPStudy20121221
PDF
Amazon ElastiCache - AWSマイスターシリーズ
PPTX
Okuyama説明資料 20120119 ss
PDF
Clojure
PPT
第2回 分散システム本読書会
PDF
Rubyによるお手軽分散処理
PDF
20120117 13 meister-elasti_cache-public
PDF
SaaS/クラウドコンピューティングでのオープンソース活用とセキュリティ
PDF
Scalable Cooperative File Caching with RDMA-Based Directory Management
PDF
MapReduce解説
分散Key/Valueストア Kai 事例紹介
Guide to Cassandra for Production Deployments
Erlangやってみた
Kyoto Tycoon Guide in Japanese
20110517 okuyama ソーシャルメディアが育てた技術勉強会
Scala + Finagleの魅力
#dnstudy 01 Unboundの紹介
ROMA のアーキテクチャと社内事例
OSSとクラウドによるコンピューティングモデルの変化
DeNAインフラの今とこれから - 今編 -
BPStudy20121221
Amazon ElastiCache - AWSマイスターシリーズ
Okuyama説明資料 20120119 ss
Clojure
第2回 分散システム本読書会
Rubyによるお手軽分散処理
20120117 13 meister-elasti_cache-public
SaaS/クラウドコンピューティングでのオープンソース活用とセキュリティ
Scalable Cooperative File Caching with RDMA-Based Directory Management
MapReduce解説
Ad

More from Takeru INOUE (7)

PDF
分散ストレージに使えるかもしれないアルゴリズム
PDF
Rewind the last half year for Erlang
PDF
Process Design and Polymorphism: Lessons Learnt from Development of Kai
PDF
Kai – An Open Source Implementation of Amazon’s Dynamo (in Japanese)
PDF
Kai – An Open Source Implementation of Amazon’s Dynamo
PDF
Amazon's Dynamo in POE and Erlang @ YAPC::Asia 2008 LT
PDF
Practical AtomPub Servers @ YAPC::Asia 2008
分散ストレージに使えるかもしれないアルゴリズム
Rewind the last half year for Erlang
Process Design and Polymorphism: Lessons Learnt from Development of Kai
Kai – An Open Source Implementation of Amazon’s Dynamo (in Japanese)
Kai – An Open Source Implementation of Amazon’s Dynamo
Amazon's Dynamo in POE and Erlang @ YAPC::Asia 2008 LT
Practical AtomPub Servers @ YAPC::Asia 2008

Kai = (Dynamo + memcache API) / Erlang