Kai = (Dynamo + memcache API) / Erlang
-
Upload
takeru-inoue -
Category
Technology
-
view
3.632 -
download
0
description
Transcript of Kai = (Dynamo + memcache API) / Erlang
![Page 1: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/1.jpg)
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
1
2009-02-20 1st Key-Value Store Workshop
たけまる
![Page 2: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/2.jpg)
2
Kaiとは?
![Page 3: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/3.jpg)
3
Dynamo + memcache API Erlang
![Page 4: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/4.jpg)
4
以上
![Page 5: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/5.jpg)
5
質問?
![Page 6: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/6.jpg)
6
:-P
![Page 7: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/7.jpg)
自己紹介
7
井上 武(たける) http://teahut.sakura.ne.jp/
主な仕事 分散システムの研究開発
マルチキャストとその応用システム Web アーキテクチャとデータストア
オープンソース AtomPub (Perl) Kai (Erlang)
Erlang 分散システム勉強会を開催(次回は5~6月頃?)
![Page 8: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/8.jpg)
8
Kaiとは?
![Page 9: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/9.jpg)
9
Dynamo + memcache API Erlang
![Page 10: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/10.jpg)
Dynamo の特徴(1/2)
10
Key, valueデータストア 分散ハッシュテーブルっぽい
高い分散透過性 Peer-to-peer アーキテクチャ クラスタ管理コストの抑制
耐障害性 たとえデータセンター障害であっても 障害時にも待ち時間要求を満たす
get(“joe”)
joe
joe
joe
![Page 11: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/11.jpg)
Dynamo の特徴(2/2)
11
Service Level Agreements 99.9%のクエリに対して300ms以内 平均では,読み取りに15ms, 書き込みに30ms
高い可用性 ロックなし,いつでも書き込める
結果整合性 (Eventually Consistent) 複製はゆるく同期 不整合はあとで解消
可用性と一貫性のトレードオフ - RDBMSは一貫性を優先 - Dynamoは可用性を重視
joe
joe
joe
get(“joe”)
![Page 12: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/12.jpg)
Eventually Consistent – 書き込みの振る舞い
3レプリカを並行して書き込み Consistent Hashing で選択
12
joe
厳密に正確ではないが,Dynamo の特徴を理解しやすく説明
![Page 13: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/13.jpg)
Eventually Consistent – 書き込みの振る舞い
3レプリカを並行して書き込み Consistent Hashing で選択
分散ロック・コミットなし ベクトルタイムスタンプを刻印 不整合は読み取り時に解消
高い可用性!
13
joe joe
![Page 14: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/14.jpg)
Eventually Consistent – 書き込みの振る舞い
3レプリカを並行して書き込み Consistent Hashing で選択
分散ロック・コミットなし ベクトルタイムスタンプを刻印 不整合は読み取り時に解消
高い可用性!
14
joe
joe
joe
joe
![Page 15: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/15.jpg)
Eventually Consistent – 読み取りの振る舞い
3レプリカから並行して読み取り Consistent Hashing で選択
15
joe
joe
joe
古いデータ
![Page 16: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/16.jpg)
Eventually Consistent – 読み取りの振る舞い
3レプリカから並行して読み取り Consistent Hashing で選択
バージョン不整合を解消 ベクトルタイムスタンプを比較
16
joe
joe
joe
joe
joe
joe
古いデータ
![Page 17: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/17.jpg)
Eventually Consistent – 読み取りの振る舞い
3レプリカから並行して読み取り Consistent Hashing で選択
バージョン不整合を解消 ベクトルタイムスタンプを比較 古いデータを上書き
結果的に整合性がとれた Eventually Consistent!
17
joe
joe
joe
joe
上書き
![Page 18: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/18.jpg)
分散透過性とは?
18
分散透過性とは? 分散していることの隠蔽度
Peer-to-peer アーキテクチャは透過性が高い(ことが多い)
透過性が高いと管理コストは低下 自律的なクラスタシステム クライアント(アプリケーションサーバ)の簡易化
性能とのトレードオフに注意 自律制御のためのオーバヘッドあり 日本のWebサイトは透過性より性能を優先する傾向あり?
![Page 19: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/19.jpg)
場所 × クライアントがデータとノードの対応関係を保持
パーティショニング情報を管理 ○ システムが個々のデータの位置を隠蔽
どのノードにアクセスしてもよい
移動 × ノード追加・離脱時にクライアントがデータを移動
責任クライアントの選択と信頼性に課題 ○ システムが適切に移動
障害 × クライアントが障害を検知して回避 × 性能の急激な低下(Master-Slave だと半減) ○ システムが障害装置を除去,軽微な性能低下
管理コストの低下 Peer-to-peer アーキテクチャ
分散透過性の種類
master master master
slave slave slave
分散システム
19
×
○
![Page 20: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/20.jpg)
Dynamo まとめ
20
分散 key-value store 高い分散透過性
Peer-to-peer アーキテクチャ クラスタ管理コストの抑制
高い可用性 ロックなし,いつでも書き込める 結果整合性(Eventually Consistent)
![Page 21: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/21.jpg)
21
Dynamo + memcache API Erlang
![Page 22: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/22.jpg)
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
![Page 23: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/23.jpg)
memcache API
23
クライアント実装がたくさん存在 開発の手間を省略
Not perfect, but enough じつは Dynamo の機能を完全に実現するには貧弱
Dynamo は独自 API
ほとんどの場合は問題なし
![Page 24: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/24.jpg)
24
Dynamo + memcache API Erlang
![Page 25: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/25.jpg)
Erlang の使いどころ
25
Distributed key-value store に適 11 のうち 5つが Erlang 製(右表)
Anti-RDBMS: A list of distributed key-value stores より(Last.fm の中の人)
分散透過性の高いシステムに多い Kai も紹介されてます どうして日本では使われないのだろう?
![Page 26: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/26.jpg)
分散システム開発におけるErlangの特徴
マルチコア・プログラミングの簡易化 アクターモデル
イベント駆動と比較 例:3レプリカから並行して読み取り,2つを得たらレスポンス
非破壊メモリ(変数への再代入不可)
分散システム開発の簡易化 組み込みの直列化関数 組み込みのノード管理システム
そこそこ速い Java未満,LL以上 弱点もある(正規表現など)
26
![Page 27: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/27.jpg)
イベント駆動(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
共有リソース
![Page 28: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/28.jpg)
イベント駆動(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
共有リソース
![Page 29: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/29.jpg)
イベント駆動(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, ); }
![Page 30: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/30.jpg)
イベント駆動(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
共有リソース
![Page 31: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/31.jpg)
イベント駆動(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); }
![Page 32: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/32.jpg)
イベント駆動(Perl POE)
イベント(時間の進み)単位の実装
Client Receive from Client Receive from Node Node
Client Dynamo Node
Dynamo Node
Receive from Client Receive from Node Timeout
State
32
共有リソース
![Page 33: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/33.jpg)
アクターモデル(Erlang)
プロセス単位の実装
Client
Dynamo Node
Dynamo Node
Dynamo Node
Dynamo Node
Dynamo Node
Dynamo Node
Process for Client
33
状態はプロセスごと (共有リソースはない)
![Page 34: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/34.jpg)
アクターモデル(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
![Page 35: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/35.jpg)
アクターモデル(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
![Page 36: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/36.jpg)
アクターモデル(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
![Page 37: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/37.jpg)
アクターモデル(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
![Page 38: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/38.jpg)
アクターモデル(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.
![Page 39: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/39.jpg)
アクターモデル(Erlang)
プロセス単位の実装
Client Process for Client Process for Node Node
Client Dynamo Node
Dynamo Node
Process for Client Process for Node
39
状態はプロセスごと(共有リソースはない)
![Page 40: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/40.jpg)
Erlang まとめ
マルチコア・プログラミングの簡易化 アクターモデル
共有メモリがなく安全 プロセスが軽い Copy on write 的にメッセージパッシングを効率化
非破壊メモリ(変数への再代入不可) 分散システム開発の簡易化
組み込みの直列化関数 組み込みのノード管理システム
そこそこ速い Java未満,LL以上 弱点もある(正規表現など)
40
![Page 41: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/41.jpg)
宣伝
41
情報処理学会誌に Erlang 解説記事を寄稿 2009年3月号
![Page 42: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/42.jpg)
42
Kaiとは?
![Page 43: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/43.jpg)
43
Dynamo + memcache API Erlang
![Page 44: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/44.jpg)
Kai の概要
44
Dynamoのオープンソース実装 開発者の本籍地から命名
検索しにくい… kie とかにしておけばよかった orz erlang, dynamo, sourceforge などと組み合わせて検索
memcache API Erlang
sourceforge.net で開発中 http://kai.sf.net/ 開発者 3.5名 2,260行 基本的な振る舞いは完了
![Page 45: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/45.jpg)
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, 複製あり)
少し前に測った値なので,いまはもう少し低いかも
![Page 46: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/46.jpg)
46
Kaiとは?
![Page 47: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/47.jpg)
47
Dynamo + memcache API Erlang
![Page 48: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/48.jpg)
48
以上
![Page 49: Kai = (Dynamo + memcache API) / Erlang](https://reader033.fdocument.pub/reader033/viewer/2022051514/548fd8aab47959072a8b4bac/html5/thumbnails/49.jpg)
49
質問?