日向夏特殊応援部隊

俺様向けメモ

Note of MogileFS #06 Using MogileFS (1)

さて実際に使ってみましょう。

telnetによるテスト

早速mogstoredにtelnetで接続してみます。

# telnet localhost 7500
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
PUT /dev1/test HTTP/1.0
Content-length: 7

zigorou
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 18
Connection: close

<h1>200 - OK</h1>
Connection closed by foreign host.

この例だと明示的にdev1に対してファイルをPUTしています。
同じURLに対してGETすると元のContentが返されます。

# telnet localhost 7500
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /dev1/test HTTP/1.0

HTTP/1.0 200 OK
Date: Mon, 16 Oct 2006 16:34:59 GMT
Server: Perlbal
Last-Modified: Mon, 16 Oct 2006 16:32:00 GMT
Accept-Ranges: bytes
Content-Type: text/plain
Content-Length: 7
Connection: close

zigorou

このファイルですけど、実際には、/var/mogdata/dev1/testにファイルが出来ています。*1

mogtoolを使ったテスト

MogileFS::Utilsに含まれるmogtoolを使うともう少しきちんとテストが出来ます。
manがあるのでそちらに詳しく書いてあります。*2


早速やってみましょう。
適当にダミーデータを用意します。

# cd /var/tmp
# echo "dummy" > dummy.txt

injectでファイルを突っ込む例になります。
debugオプション付きでの実行なんで、ログが長いです。

# mogtool --debug --trackers="10.255.255.30:7001,10.255.255.31:7001" --domain=www.art-cod
e.org --class=foo inject /var/tmp/dummy.txt dummy
MogileFS object: [MogileFS::Client=ARRAY(0x8993f08)]
$VAR1 = bless( [
                 bless( {
                          'readonly' => 4,
                          'domain' => 2,
                          'backend' => 3,
                          'root' => 1
                        }, 'pseudohash' ),
                 undef,
                 'www.art-code.org',
                 bless( [
                          bless( {
                                   'sock_cache' => 5,
                                   'hosts' => 1,
                                   'timeout' => 7,
                                   'pref_ip' => 6,
                                   'lasterr' => 3,
                                   'host_dead' => 2,
                                   'lasterrstr' => 4
                                 }, 'pseudohash' ),
                          [
                            '10.255.255.30:7001',
                            '10.255.255.31:7001'
                          ],
                          {},
                          undef,
                          undef,
                          undef,
                          undef,
                          3
                        ], 'MogileFS::Backend' ),
                 0
               ], 'MogileFS::Client' );

file dummy: f02e326f800ee26f04df7961adbf7c0a, len = 6
Spawned child 3306 to deal with chunk number 1.
MogileFS object: [MogileFS::Client=ARRAY(0x8c24004)]
$VAR1 = bless( [
                 bless( {
                          'readonly' => 4,
                          'domain' => 2,
                          'backend' => 3,
                          'root' => 1
                        }, 'pseudohash' ),
                 undef,
                 'www.art-code.org',
                 bless( [
                          bless( {
                                   'sock_cache' => 5,
                                   'hosts' => 1,
                                   'timeout' => 7,
                                   'pref_ip' => 6,
                                   'lasterr' => 3,
                                   'host_dead' => 2,
                                   'lasterrstr' => 4
                                 }, 'pseudohash' ),
                          [
                            '10.255.255.30:7001',
                            '10.255.255.31:7001'
                          ],
                          {},
                          undef,
                          undef,
                          undef,
                          undef,
                          3
                        ], 'MogileFS::Backend' ),
                 0
               ], 'MogileFS::Client' );

MogileFS::Clientを二個作りに行くのがミソでしょうね。
trackersの数だけClientを生成するんじゃないでしょうか。

SOCK: Sock_10.255.255.31:7001, REQ: create_open domain=www.art-code.org&fid=0&class=foo&multi_dest=1&key=dummy
$VAR1 = undef;

RESPONSE: OK dev_count=2&devid_2=2&path_1=http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid&fid=11&devid_1=1&path_2=http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid
$VAR1 = undef;

RETURN_VARS: 
$VAR1 = {
          'dev_count' => '2',
          'devid_2' => '2',
          'path_1' => 'http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid',
          'fid' => '11',
          'devid_1' => '1',
          'path_2' => 'http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid'
        };

SOCK: cached = Sock_10.255.255.31:7001, REQ: create_close domain=www.art-code.org&fid=11&devid=1&path=http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid&size=6&key=dummy
$VAR1 = undef;

RESPONSE: OK 
$VAR1 = undef;

RETURN_VARS: 
$VAR1 = {};

        chunk 1 saved in 0.10 seconds.
SOCK: Sock_10.255.255.31:7001, REQ: get_paths domain=www.art-code.org&noverify=1&key=dummy
$VAR1 = undef;

RESPONSE: OK path2=http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid&path1=http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid&paths=2
$VAR1 = undef;

RETURN_VARS: 
$VAR1 = {
          'path2' => 'http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid',
          'path1' => 'http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid',
          'paths' => '2'
        };

Child 3306 successfully finished with chunk 1.
Beginning replication wait: 1
SOCK: cached = Sock_10.255.255.31:7001, REQ: get_paths domain=www.art-code.org&noverify=1&key=dummy
$VAR1 = undef;

RESPONSE: OK path2=http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid&path1=http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid&paths=2
$VAR1 = undef;

RETURN_VARS: 
$VAR1 = {
          'path2' => 'http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid',
          'path1' => 'http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid',
          'paths' => '2'
        };

と言う訳で2つのノードにコピーされてると言えるかと思います。
curlを使って確認してみましょう。

# curl http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid
dummy
# curl http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid
dummy

ばっちりレプリカも作られてますね。mogtoolを使ってファイルを取り出すには、
extractを使います。

# mogtool --overwrite --trackers="10.255.255.30:7001,10.255.255.31:7001" --domain=www.art
-code.org --class=foo extract dummy /var/tmp/dummy.txt.extract
Fetching piece 1...
        Trying http://10.255.255.31:7500/dev2/0/000/000/0000000011.fid...
Done.
# mogtool --overwrite --trackers="10.255.255.30:7001,10.255.255.31:7001" --domain=www.art-code.org --class=foo extract dummy /var/tmp/dummy.txt.extract
Fetching piece 1...
        Trying http://10.255.255.30:7500/dev1/0/000/000/0000000011.fid...
Done.

二回連続で敢えて実行した所、指し示す実体に関しては別のノードを示しましたね。
ある程度負荷分散の概念も入ってる模様。*3


次回はMogileFS::Clientのサンプル書きます。

*1:従ってdocroot=/var/mogdataって指定したのはWebサーバーのDocumentRootと考えるとしっくりきますね。

*2:mogadm, mogtoolはmanが完備されてるので、幾分親切です。w

*3:最もmogstoredがPerlbalで出来てるから当たり前なんだろうけど