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
$ 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 なので何かしらのバッファがあふれたとかでしょうか.よくわかりませんでした.