分散 Key-Value ストア mio-0.0.1alpha をリリースしました
分散 Key-Value ストア mio-0.0.1alpha をリリースしました。(mio-0.0.1-alpha.tar.gz)
Mio とは何か?
範囲検索(range query) が出来る KVS です。例えば「key が "1000"〜"2000" にあるものを昇順に10件取り出す」という検索が可能です。
Mio は memcached 互換プロトコルを実装しているので、多くのプログラミング言語から簡単にアクセスする事が可能です。(後述のコード例参照)
Mio のアーキテクチャ
Mio は Skip Graphs(スキップグラフ)というアルゴリズムに基づいて実装されています。詳細はErlang 分散システム勉強会での発表資料 Mio - a distributed Skip Graph based orderd KVSをご参照ください。
インストール
最新の Erlang をインストール後、mio-0.0.1-alpha.tar.gz をダウンロード・展開し、以下のように make して下さい。
% make % sudo TARGET_DIR=/user/local/mio SBIN_DIR=/usr/sbin/ make install
Mio の起動
1台での運用の場合。
% mio -v -n mio1@127.0.0.1
2台での運用の場合
# 1台目 % mio -v -n mio1@127.0.0.1 # 2台目 % mio -v -n mio2@別サーバーのFQDN -i mio1@127.0.0.1
Perl からのアクセスの例
# Example: Access to Mio. use strict; use warnings; use Cache::Memcached; use Data::Dumper; my $m = Cache::Memcached->new( { servers => ['127.0.0.1:11211']} ); $m->set( "hello" => "world" ); $m->set( "intel" => "cpu" ); $m->set( "japan" => "Tokyo" ); warn $m->get("hello"); warn $m->get("intel"); warn $m->get("japan"); my $href = $m->get_multi("mio:range-search", "he", "j", "10", "asc"); # Should print # $VAR1 = { # 'hello' => 'world', # 'intel' => 'cpu' # }; warn Dumper $href;
PHP からのアクセス例
<?php $mem = new Memcached; $mem->addServer('127.0.0.1', 11211); $mem->set("hello", "world"); $mem->set("intel", "cpu"); $mem->set("japan", "Tokyo"); printf("%s\n", $mem->get("hello")); printf("%s\n", $mem->get("intel")); printf("%s\n", $mem->get("japan")); var_dump($mem->getMulti(array("mio:range-search", "he", "j", "10", "asc"))); ?>
Java からのアクセス例
import com.danga.MemCached.*; import java.util.*; public class JavaMemcachedClient { public static void main(String[] args) { String[] serverlist = { "127.0.0.1:11211" }; SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.initialize(); MemCachedClient mc = new MemCachedClient(); mc.set("hello", "world"); mc.set("intel", "cpu"); mc.set("japan", "Tokyo"); System.out.printf("hello => %s intel => %s japan => %s\n", mc.get("hello"), mc.get("intel"), mc.get("japan")); String[] keys = { "mio:range-search", "he", "j", "10", "asc" }; Map<String, Object> ret = mc.getMulti(keys); for (Map.Entry<String, Object> e : ret.entrySet()) { System.out.println(e.getKey() + " : " + e.getValue()); } } }
Ruby, Python からのアクセス
Ruby, Python で提供されている memcached client ライブラリは get_multi で与えた検索キー以外が、サーバーから戻されると無視する仕様となっています。そのため現時点では Ruby, Python からの範囲検索は出来ません。Ruby 版はパッチを投げている状態です。