Erlang による Skip Graph の実装
参考:
Skip Graph の論文
http://www.cs.yale.edu/homes/aspnes/skip-graphs-journal.pdf
特徴
・Erlangによる完全なSkip Graphの実装
・複数マシンを利用してスケールアウト可能
・boot/4関数内のLevel_Maxの値を大きくすることにより、Levelの階層を増やすことができる
=> スケールアウトしてエントリ数が増えても、検索効率が落ちない
・keyにatomを指定することもできるので、柔軟な範囲検索を行うことができる
・コードの行数は200行未満
実際の動作(Erlangを知っている人向け)
起動(分散)
<ノードjohn@asus>
$ erl -sname john Eshell V5.7 (abort with ^G) (john@asus)1> sg:start(). true (john@asus)1>
<ノードmary@asus>
$ erl -sname mary Eshell V5.7 (abort with ^G) (mary@asus)1> sg:start(john@asus). true (mary@asus)1>
実行(分散)
<ノードjohn@asus>
(john@asus)2> sg:put_(3, hoge). <0.43.0> (john@asus)3> sg:put_(2, foo). <0.45.0> (john@asus)4> sg:put_(4, foobar). <0.47.0> (john@asus)5> sg:put_(1, bar). <0.49.0> (john@asus)6>
<ノードmary@asus>
(mary@asus)3> sg:put_(6, hoge6). <0.48.0> (mary@asus)4> sg:put_(5, hogehoge). <0.50.0> (mary@asus)5>
<ノードjohn@asus>
(john@asus)6> sg:put_(7, hoge7). <0.55.0> (john@asus)7> sg:get_(4,7). *** DEBUG sg 70 {get,{key,0}} *** DEBUG sg 70 {get,{key,1}} *** DEBUG sg 70 {get,{key,4}} [foobar,hogehoge,hoge6,hoge7] (john@asus)8>
atomをkeyに指定
$ erl Eshell V5.7 (abort with ^G) 1> c(sg). {ok,sg} 2> sg:start(). true 3> sg:put_(hoge, ken). <0.42.0> 4> sg:put_(foo, john). <0.44.0> 5> sg:put_(zoo, noise). <0.46.0> 6> sg:get_(foo, zoo). [john,ken,noise] 7>
※これは簡易的な動作デモで、実際は1マシン6万ピアでの高速な範囲検索を確認しています。
今後について
・KVSとして実用的に使えるレベルまで仕上げたい
・Replicationの実装
・耐障害性の強化
・総エントリ数をもとに、プログラムが動的にLevelの階層を変更する機能の実装
・Range-Key Skip Graph化