kumofs を KVM 上の Debian(lenny) にインストールして動かすまで

KVM on Debian(lenny) を使ったサーバを構築してみます.

システムインストール

最初は virt-manager などで VM を作成.ホスト名は kumofs で標準システムのみに.

下準備

まずは基本セットをインストール

$ su -
# aptitude install sudo vim lv openssh-server
# update-alternatives --config editor

There are 4 alternatives which provide `editor'.

  Selection    Alternative
-----------------------------------------------
          1    /bin/ed
*+        2    /bin/nano
          3    /usr/bin/vim.tiny
          4    /usr/bin/vim.basic

Press enter to keep the default[*], or type selection number: 4
Using '/usr/bin/vim.basic' to provide 'editor'.
# visudo
# addgroup wheel
# adduser user wheel
# logout

日本語ドキュメントを見ると下記が必要らしいのでインストールします.

  • linux >= 2.6.18
  • g++ >= 4.1
  • ruby >= 1.8.6
  • Tokyo Cabinet >= 1.4.10
  • MessagePack for C++ >= 0.3.1
  • MessagePack for Ruby >= 0.3.1
  • libcrypto (openssl)
  • zlib

まずは RubyC++ など.

$ sudo aptitude install ruby1.8 ruby rubygems rubygems1.8 libcrypto++-dev zlib1g-dev build-essential

次に TokyoCabinet

$ mkdir tmp; cd tmp
$ wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.41.tar.gz
$ tar zxvf tokyocabinet-1.4.41.tar.gz
$ cd tokyocabinet-1.4.41/
$ ./configure
$ sudo aptitude install libbz2-dev # TokyoCabinet に必要なので追加
$ ./configure
$ make
$ sudo make install
$ sudo vim /etc/ld.so.conf.d/local.conf
/usr/local/lib
$ sudo ldconfig

そして MessagePack を.

$ cd ../
$ wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmsgpack%2F45459%2Fmsgpack-0.4.0.tar.gz"
$ tar zxvf msgpack-0.4.0.tar.gz
$ cd msgpack-0.4.0/
$ ./configure
$ make
$ sudo make install
$ sudo gem install msgpack --no-ri --no-rdoc
$ sudo aptitude install ruby1.8-dev ruby-dev # 拡張ライブラリなので追加で必要
$ sudo gem install msgpack --no-ri --no-rdoc

最後に kumofs をインストール

$ cd ../
$ wget http://cloud.github.com/downloads/etolabo/kumofs/kumofs-0.3.0.tar.gz
$ tar zxvf kumofs-0.3.0.tar.gz
$ cd kumofs-0.3.0/
$ ./configure
$ sudo aptitude install libssl-dev # こちらも必要だった模様
$ ./configure
$ make
$ sudo make install

これでインストールは完了.結局 Debian(lenny) に必要なパッケージは下記の通り.

  • build-essential
  • ruby1.8
  • ruby
  • ruby1.8-dev
  • ruby-dev
  • rubygems
  • rubygems1.8
  • libcrypto++-dev
  • zlib1g-dev
  • libbz2-dev
  • libssl-dev
$ sudo aptitude install build-essential ruby1.8 ruby ruby1.8-dev ruby-dev rubygems rubygems1.8 libcrypto++-dev zlib1g-dev libbz2-dev libssl-dev

複数台の用意

サンプルでは3台構成だったので,これをあと2つ作成します.(kumofs / kumofs2 / kumofs3).ます先ほど作成した kumofs を shutdown します.

$ sudo poweroff

次に KVM ホストから virt-clone します.MAC アドレスは下位アドレスを被らない適当なのに.

$ sudo virt-clone --original kumofs --name kumofs2 --file kumofs2.img --mac 52:54:00:93:23:43
$ sudo virt-clone --original kumofs --name kumofs3 --file kumofs3.img --mac 52:54:00:93:29:12

さてこのままでは MAC アドレスが変わったためにネットワークデバイスが追加されてしまいます.そこで console に入って必要な部分を直接変更します.

  • /etc/udev/rules.d/70-persistent-net.rules から MAC アドレスが書かれている行を削除
    • 恐らく2行ある
  • /etc/network/interface の address の項目を変更
    • 固定アドレスの場合
  • /etc/hostname の変更
  • /etc/hosts の変更
192.168.123.10 kumofs
192.168.123.11 kumofs2
192.168.123.12 kumofs3
  • 再起動
  • hostname / ifconfig で変更されていることを確認.
  • poweroff

という感じで2台(kumofs2 / kumofs3)実行します.最後の /etc/hosts の設定を kumofs にもして完了

実験開始

いよいよ実験開始.ドキュメントにある構成との対応は以下のようにします.

  • srv1 -> kumofs
  • srv2 -> kumofs2
  • srv3 -> kumofs3
  • cli -> kumofs
kumo-manager の起動
kumofs$ kumo-manager -v -l kumofs -p kumofs2
kumofs2$ kumo-manager -v -l kumofs2 -p kumofs
kumo-server の起動
kumofs$ kumo-server -v -l kumofs -m kumofs -p kumofs2 -s /tmp/kumodb.tch
kumofs2$ kumo-server -v -l kumofs2 -m kumofs -p kumofs2 -s /tmp/kumodb.tch
kumofs3$ kumo-server -v -l kumofs3 -m kumofs -p kumofs2 -s /tmp/kumodb.tch
kumo-server の登録
kumofs$ kumoctl kumofs status
hash space timestamp:
  Thu Jan 01 09:00:00 +0900 1970 clock 0
attached node:
not attached node:
  192.168.123.10:19800
  192.168.123.11:19800
  192.168.123.12:19800
kumofs$ kumoctl kumofs attach
nil

ここでザッとログが流れます.ちょっと楽しい.それにしても nil と表示されるとは,さすが Ruby なのか.
また「hash space timestamp」のところが 1970 年とかになっているのは,Time クラスの基底なので,まだ値が取得できてないってことかな.再度 status を見ると,

kumofs$ kumoctl kumofs status
hash space timestamp:
  Tue Jan 19 11:09:32 +0900 2010 clock 230
attached node:
  192.168.11.180:19800  (active)
  192.168.11.181:19800  (active)
  192.168.11.182:19800  (active)
not attached node:

追加されて,時刻も正常になってますね.

kumo-gateway の起動
kumofs$ kumo-gateway -v -m kumofs -p kumofs -t 11211

memcache-client 互換だそうなので,telnet でアクセスしてみます.

kumofs$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set hoge 0 0 3
Foo
STORED
set bar 0 0 22
This is a sample text.
STORED
END
Connection closed by foreign host.
kumofs$ kumohash -m kumofs assigh hoge
  0: 192.168.123.10:19800
  1: 192.168.123.11:19800
  2: 192.168.123.12:19800

kumohash の説明には,「あるデータがどのkumo-serverに保存されているか調べる」とあったのですが,全部出てきてしまいます.3台ぐらいじゃダメ分散されない?またはキーの数が少ない?

大量のデータ投入

なんかこんなので実験

#!/usr/bin/env ruby

1000000.times do |i|
  str = ""
  (rand(100)+1).times do |j|
    str += (65 + rand(26)).chr
  end
  puts "set var#{i} 0 0 #{str.length}"
  puts str
end
kumofs$ ruby test.rb | telnet localhost 11211
(snip)
STORED
STORED
STORED
STORED
test.rb:8:in `write': Broken pipe (Errno::EPIPE)
        from test.rb:8:in `puts'
        from test.rb:8
        from test.rb:3:in `times'
        from test.rb:3

止まったので何が?と思って kumo-gateway の方を見ると

セグメンテーション違反です

telnet なので何かしらのバッファがあふれたとかでしょうか.よくわかりませんでした.

まとめ

コマンドが Ruby で書かれていたりするのでわかりやすいのと,初めから分散前提なのが良い感じですね.ただセットアップはともかく,起動に手続きが必要だと言うのが,実稼働するときの大きな障壁かなと思いました.全て個別に起動できて,それぞれが kumo-server / kumo-manager / kumo-gateway の起動を関知して自動的に接続するようになれば,より使い勝手が増す感じがしました*1

*1:まあ仮想環境だとしたらスクリプトでその順序も制御できそうなのですが.