耐障害性の高いConsistent Hashingを実装してみる
GitHub - dchiji/Cradle: Consistent Hashing
とあるプロジェクトの一環で作ったプログラムで、突然あるノードが落ちても一瞬でネットワーク再構成/データ復旧することが可能な程度の耐障害性が特徴です。
Consistent Hashingということで、当然のことながらデータ保持時の負荷分散もサポートしています。
実用に耐えるのは難しいかもしれませんが、簡易KVSとして試用しても良いレベルだと思っています。
利用するにはErlang処理系をインストールしておく必要があり、テストにはR12B-5を使用しました。
使用方法
準備
src/dssg.erlをダウンロードして
$ erlc dssg.erl
を実行しておきます。
新規ノードを立ち上げる
start関数を引数無しで呼び出すことにより、新規ノードを立ち上げることができます。
また、ノード追加時に必要なノード名を得るためにnode関数を呼び出します。
$ erl -sname hoge Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) (hoge@daiki-eeepc)1> dssg:start(). true (hoge@daiki-eeepc)2> node(). 'hoge@daiki-eeepc'
ノードの追加
node関数を呼び出して得たノード名(ここでは 'hoge@daiki-eeepc')をstart関数の引数にすることでネットワークにノードを追加することができます。
$ erl -sname foo Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) (foo@daiki-eeepc)1> dssg:start('hoge@daiki-eeepc'). true
データのput/get
ノードを立ち上げた状態でputv(Key, Value)もしくはgetv(Key)を呼び出すことで、値のput/getを行うことができます。
(hoge@daiki-eeepc)3> dssg:putv(a, hogehoge). {<0.37.0>, {put,1337672431590932383376536722780050290890528640001,a, hogehoge}} (hoge@daiki-eeepc)4> dssg:getv(a). {ok,{1337672431590932383376536722780050290890528640001, hogehoge}}
ノードのleave(終了方法)
^Cをすると
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution
と表示されるので、「a」キーをタイプして処理系を終了させます。