「kumofs」を使って、分散key-Valueストレージシステムを構築

先日、1台のサーバにkumofsをインストールしてから、合い間をみてこつこつと作業してきたのですが、やっと複数のサーバの準備が完了し、いよいよ複数のサーバを並べた分散key-Valueストレージシステムを構築する作業に取り掛かかることができましたので、まとめておきます。

kumofsのアーキテクチャについて

kumofsは、サーバ同士が直接通信し合うP2P型のモデルと全体を統括する管理ノードを組み合わせたハイブリッド型のアーキテクチャで、kumofsのクラスタは、3種類のノードで構成されます。

  • kumo-manager : クラスタ全体を管理
  • kumo-server : データを保存
  • kumo-gateway : アプリケーションからの要求を中継、分散

全体の構築イメージ

今回の構成としては、全体で6台のサーバを用意しました。
これを以下のように割り振ります。

  • kumo-manager × 2台
  • kumo-server × 2台
  • kumo-gateway × 2台

これら、すべてのサーバにkumofsがインストール済みで、また、kumo-gatewayのサーバはさらに、アプリケーションサーバとして動作するよう構築済みです。(PHP、PECL::memcache)

構成を図にまとめると以下のようなイメージのシステムになります。

kumofsの構成

kumofsの構成

kumo-managerの起動

それでは、実際にkumofsシステムを構築していきます。まずはkumo-managerからです。

1台目のkumo-managerを起動します。

# export LD_LIBRARY_PATH=/usr/local/lib
# kumo-manager -v -m 192.168.0.1 -p 192.168.0.2

2台目のkumo-managerが立ち上がってないので接続拒否のエラーが表示されます。

2010-04-14 22:28:15 manager/mod_network.cc:240: KeepAlive failed: 2
2010-04-14 22:28:17 ../rpc/client_tmpl.h:157: connecting to 192.168.0.2:19700
2010-04-14 22:28:17 ../rpc/client_tmpl.h:199: connect failed 192.168.0.2:19700: Connection refused

2台目のkumo-managerを起動します。

# export LD_LIBRARY_PATH=/usr/local/lib
# kumo-manager -v -m 192.168.0.2 -p 192.168.0.1

正常に起動して、1台目のkumo-managerとの接続も確立されました。

2010-04-14 22:28:19 ./manager/init.h:43: start manager 192.168.0.2:19700
2010-04-14 22:28:21 manager/framework.cc:69: new node 0 192.168.0.1:19700
2010-04-14 22:28:21 manager/framework.cc:78: partner connected 192.168.0.1:19700

この時点で、1台目のkumo-managerを確認するとこちらも接続が確立されています。

2010-04-14 22:28:19 ../rpc/client_tmpl.h:157: connecting to 192.168.0.2:19700
2010-04-14 22:28:19 ../rpc/client_tmpl.h:187: connect success 192.168.0.2:19700 fd(7)
2010-04-14 22:28:19 manager/framework.cc:69: new node 0 192.168.0.2:19700
2010-04-14 22:28:19 manager/framework.cc:78: partner connected 192.168.0.2:19700

kumo-serverの起動

次にkumo-server群を起動していきます。

1台目のkumo-serverを起動します。

# export LD_LIBRARY_PATH=/usr/local/lib
# kumo-server -v  -l 192.168.0.3:19800 -m 192.168.0.1:19700 -p 192.168.0.2:19700 -s /var/kumodb.tch

正常に起動して、接続も正常に確立されていることが確認できます。

2010-04-14 22:38:46 ./server/init.h:45: start server 192.168.0.3:19800
2010-04-14 22:38:48 ../rpc/client_tmpl.h:157: connecting to 192.168.0.1:19700
2010-04-14 22:38:48 ../rpc/client_tmpl.h:157: connecting to 192.168.0.2:19700
2010-04-14 22:38:48 ../rpc/client_tmpl.h:187: connect success 192.168.0.1:19700 fd(10)
2010-04-14 22:38:48 ../rpc/client_tmpl.h:187: connect success 192.168.0.2:19700 fd(11)
2010-04-14 22:38:48 server/framework.cc:74: new node 0 192.168.0.2:19700
2010-04-14 22:38:48 server/framework.cc:74: new node 0 192.168.0.1:19700

同じように2台目のkumo-serverを起動します。

# export LD_LIBRARY_PATH=/usr/local/lib
# kumo-server -v  -l 192.168.0.4:19800 -m 192.168.0.1:19700 -p 192.168.0.2:19700 -s /var/kumodb.tch
2010-04-14 22:41:44 ./server/init.h:45: start server 192.168.0.4:19800
2010-04-14 22:41:46 ../rpc/client_tmpl.h:157: connecting to 192.168.0.1:19700
2010-04-14 22:41:46 ../rpc/client_tmpl.h:157: connecting to 192.168.0.2:19700
2010-04-14 22:41:46 ../rpc/client_tmpl.h:187: connect success 192.168.0.2:19700 fd(11)
2010-04-14 22:41:46 ../rpc/client_tmpl.h:187: connect success 192.168.0.1:19700 fd(10)
2010-04-14 22:41:46 server/framework.cc:74: new node 0 192.168.0.2:19700
2010-04-14 22:41:46 server/framework.cc:74: new node 0 192.168.0.1:19700

kumo-managerを確認すると接続情報が更新され、こちらでも接続の確立を確認できます。

2010-04-14 22:38:48 manager/framework.cc:69: new node 1 192.168.0.3:19800
2010-04-14 22:38:48 manager/mod_replace.cc:35: server connected 192.168.0.3:19800
2010-04-14 22:41:46 manager/framework.cc:69: new node 1 192.168.0.4:19800
2010-04-14 22:41:46 manager/mod_replace.cc:35: server connected 192.168.0.4:19800

kumo-serverの登録

kumo-serverは起動しただけでは追加されず、kumoctlコマンドを使って登録する必要があります。

kumo-managerで、kumo-serverが認識されているか確認します。

※私の環境では、ここでエラーが発生しましたので、Rubyのバージョンアップを行いました

not attached node:の項目にリストが表示され、認識されていることが確認できます。

# kumoctl localhost status
hash space timestamp:
  Thu Jan 01 09:00:00 +0900 1970 clock 0
attached node:
not attached node:
  192.168.0.3:19800
  192.168.0.4:19800

認識が確認できたら、kumo-managerに登録します。

# kumoctl localhost attach
nil

kumo-serverが、kumo-managerに登録されたことを確認します。

# kumoctl localhost status
hash space timestamp:
  Wed Apr 14 22:36:40 +0900 2010 clock 9402
attached node:
  192.168.0.3:19800  (active)
  192.168.0.4:19800  (active)
not attached node:

kumo-gatewayの起動

kumo-manager、kumo-serverの構築が完了したら、最後にアプリケーションサーバで、kumo-gatewayを起動します。kumo-gatewayはmemcachedプロトコルを実装しているので、これを動かすと、アプリケーションからみたkumofsは、localhostで動作しているmemcached のように見えます。

# export LD_LIBRARY_PATH=/usr/local/lib
# kumo-gateway -v -m 192.168.0.1:19700 -p 192.168.0.2:19700 -t 11211
2010-04-14 22:52:36 ../rpc/client_tmpl.h:157: connecting to 192.168.0.1:19700
2010-04-14 22:52:36 ../rpc/client_tmpl.h:157: connecting to 192.168.0.2:19700
2010-04-14 22:52:36 ../rpc/client_tmpl.h:187: connect success 192.168.0.2:19700 fd(8)
2010-04-14 22:52:36 ../rpc/client_tmpl.h:187: connect success 192.168.0.1:19700 fd(7)

データを保存して動作を確認します

PECL:memcacheを使って、以下のような感じで、実際にデータを保存して動作を確認します。

$key = 'kumo_test';

$kumo = new Memcache;
$kumo->connect('localhost', 11211,60);

    if(!$value = $kumo->get($key))
    {
        $value = date("r");
        $kumo->set($key,$value);
    }

print("現在時刻      :".date("r")."");
print("<br />");
print("キャッシュ時刻:".$value."");

以下のことに注意点が必要です。

memcachedプロトコルをサポートしています(get, set, delete のみ。expireとflagsには必ず0を指定する必要があります)…

すべてのサーバーのシステム時刻は、できる限り同じになるようにしてください。5秒以上ずれていると、正しく動作しません。…

memcachedクライアントの「タイムアウト時間」は、必ず長めに設定してください。元々キャッシュを前提としているライブラリがほとんどなので、デフォルトのタイムアウト時間は非常に短くなっていることが多いです。最適な値はユースケースに依存しますが、60秒くらい確保しておくと良いです。
doc/doc.ja.md at master from etolabo’s kumofs – GitHub

データの削除は、以下のようなにして行います。

$key = 'kumo_test';

$kumo = new Memcache;
$kumo->connect('localhost', 11211,60);
$kumo->delete($key);

以上で、分散key-Valueストレージシステムのシステムが完成しました。

参考ページ

ひとこと

こつこつと環境を整えていって、やっと稼動させられる状態になりました。
RDBとうまく使いければ、作成するサービスの幅も広がりそうです。今後、実用的にいろいろと試してみたいと思います。

カテゴリー: サーバ・インフラのこと   タグ:   この投稿のパーマリンク

トラックバック

「kumofs」を使って、分散key-Valueストレージシステムを構築 への3件のコメント

  1. ピンバック: CentOSのyumでインストールしたRubyをバージョンアップ(インストール) « FlatLabs Blog

  2. ピンバック: 「kumofs」のストレージシステムにサーバを追加する « FlatLabs Blog

  3. ピンバック: tvotterで活用できた、今まで積み重ねたサーバ構築のいろいろ « FlatLabs Blog

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>