Hatena::ブログ(Diary)

cooldaemonの備忘録 RSSフィード

2008-09-22

Erlang で分散ハッシュテーブル(kademlia)を使った Key-Value Store 作ってみたよ

Kai に kademlia の組み込みを提案する為、試しに作っていたのですが、README に書いた How to Use の項目が動くようになったので晒してみます。

cooldaemon’s ermlia at master ― GitHub

設置方法なんかも README に書いてあるので、ご興味のある方は、そちらをご参考に。

まだ、いくつかの機能が未実装(定期的にデータを publish していない)だったり、不具合(Key のバージョン管理がされていない)があるけれど、そこそこに動きます。

おまえは kademlia を勘違いしている!等、突っ込み大歓迎。

参考 URI

上から参考になった順に並んでます。

ブラウザで http://[ホスト名]:[ポート番号]/dump を開くとイロイロ情報を表示するようにしました。

ブラウザで http://[ホスト名]:[ポート番号]/ を開くとイロイロ情報を表示するようにしました。

REST っぽい I/F を追加しました。使い方は、example 配下のサンプルを見て頂ければ解るかも?

タイムアウトしたノードを管理する処理を加えました。また、タイムアウトを 500ms に変更しました。

ノードが何らかのクエリを受信した際、保持中のデータから送信元ノードが持つべきデータを選択し、送信元ノードへ PUT クエリを送るようにしました。これで、kademlia としての動作は全て実装した事になります。

Re:Kademliaについて細かい話

Kademliaについて細かい話 - NO!と言えるようになりたい

コードを読んでもらえて、しかも、返信を頂けると、とても嬉しいです。

ありがとうございます!

タイムアウトしたノード情報を保持し続ける為、churn 下でパフォーマンスが落ちる件

タイムアウトしたノードの情報を保持しておき、クエリの結果から省く方式を組み込んでみようかと思います。

同一の IP アドレス・ポート番号だったとしても、ID が異なる場合は "復帰した、もしくは、別ノード" と見なしたいので、ID をキーにしたハッシュテーブルで保持してみようかな?

Expire は、ルーティング・テーブルが更新される頻度を考慮しながら変更できると良さそうなので、起動時に設定できると良いかもしれない。デフォルト値は、1分にしておこう。

対応しました。ただし、Expire を起動時のパラメータで指定する事は出来ません。

タイムアウトの秒数が長い件

確かに、Kai への組み込みを意識するならば、3秒は長いですね。

デフォルト値を 500ms にして、起動時に指定できるようにします。

500ms にしました。ただし、起動時のパラメータで指定する事は出来ません。