分散 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 版はパッチを投げている状態です。

謝辞

Skip Graphs アルゴリズムの存在を教えてくださった古橋貞之さん、Erlang 分散システム勉強会の皆さん、特に Skip Graphs 改良版のあるゴリズムを丁寧に解説してくださったたけまるさん、Erlang に関するアドバイスを下さったVoluntasさんに深く感謝します。

バグ報告

Mio は現時点でアルファリリースです。バグを見つけた方は Issues もしくは@higepon までお願いします。