分散Object Storageの GreenBuckets ではストレージノードの実装を問わないので、こういうこともできると言う例

Kyoto Cabinet の Directry Hash DataBase を使うと、ファイルシステム上の1ファイルが1レコードとなるデータベースを作成することができます。通常のDBMでは数KBまでの小さいデータに性能が最適化されているのに対して、Directry Hash DataBaseでは数十KB〜のデータを扱いやすくなるということらしいです。

もちろん、Kyoto Tycoon からも使うことができるので、GreenBucketsのストレージノードとしても利用できます。

まず、ktserver でノードを立ち上げます。今回は試しに1つのktserverで複数のデータベースを担当させ、それぞれ1ノードとして扱います。

$ ktserver -li -port 8080 a.kcd b.kcd c.kcd
2011-05-29T00:42:04.418287+09:00: [SYSTEM]: ================ [START]: pid=77706
2011-05-29T00:42:04.424942+09:00: [SYSTEM]: opening a database: path=a.kcd
2011-05-29T00:42:04.426206+09:00: [SYSTEM]: opening a database: path=b.kcd
2011-05-29T00:42:04.427222+09:00: [SYSTEM]: opening a database: path=c.kcd
2011-05-29T00:42:04.428189+09:00: [SYSTEM]: starting the server: expr=:8080
2011-05-29T00:42:04.428292+09:00: [SYSTEM]: server socket opened: expr=:8080 timeout=30.0
2011-05-29T00:42:04.428329+09:00: [SYSTEM]: listening server socket started: fd=9

a.kcd、b.kcd、c.kcd というデータベースが作成されました。これをノードとしてGreenBucketsに登録します

mysql> select * from nodes;
+----+-----+-----------------------------+--------+-------+--------+
| id | gid | node                        | online | fresh | remote |
+----+-----+-----------------------------+--------+-------+--------+
|  1 |   1 | http://127.0.0.1:8080/a.kcd |      1 |     1 |      0 |
|  2 |   1 | http://127.0.0.1:8080/b.kcd |      1 |     1 |      0 |
|  3 |   1 | http://127.0.0.1:8080/c.kcd |      1 |     1 |      0 |
+----+-----+-----------------------------+--------+-------+--------+

わかりやすいですね。

Kyoto Tycoon では最初のディレクトリをデータベース名として扱うので、GreenBucketsのほうからディレクトリを含まないURIでノードにアクセスする必要があります。そのためには、GreenBucketsのconfigで

flat_dav => 1,

を指定してください。上の例のように既にデータベース名がノードに含まれている場合はこの必要はありません。

これで、GreenBucketsを起動して、

$ PLACK_ENV=development ./bin/greenbuckets jobqueue -c etc/config.pl
$ PLACK_ENV=development ./bin/greenbuckets dispatcher -c etc/config.pl

curlでアクセスしてみます。

$ curl -v -basic --user admin:admin -X PUT -d 'IloveKyoto' http://localhost:5000/test/test
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Sat, 28 May 2011 15:50:24 GMT
< Server: Plack::Handler::Starlet
< Content-Type: text/html; charset=UTF-8
<
* Closing connection #0
OK

OKが返って来て、オブジェクトが保存されました。

この時のKyoto Tycoon側のログをみると、

2011-05-29T00:50:24: [INFO]: connected: expr=127.0.0.1:60567
2011-05-29T00:50:24: [INFO]: (127.0.0.1:60567): PUT /c.kcd/59/47/04b09ad074b6c9c58132c3dbfd81879f6294efbe9f1381ae295cf2ac HTTP/1.1: 201
2011-05-29T00:50:24: [INFO]: (127.0.0.1:60567): PUT /b.kcd/59/47/04b09ad074b6c9c58132c3dbfd81879f6294efbe9f1381ae295cf2ac HTTP/1.1: 201
2011-05-29T00:50:24: [INFO]: connected: expr=127.0.0.1:60574
2011-05-29T00:50:24: [INFO]: (127.0.0.1:60574): GET /c.kcd/59/47/04b09ad074b6c9c58132c3dbfd81879f6294efbe9f1381ae295cf2ac HTTP/1.1: 200
2011-05-29T00:50:24: [INFO]: connected: expr=127.0.0.1:60575
2011-05-29T00:50:24: [INFO]: (127.0.0.1:60575): PUT /a.kcd/59/47/04b09ad074b6c9c58132c3dbfd81879f6294efbe9f1381ae295cf2ac HTTP/1.1: 201
2011-05-29T00:50:37: [INFO]: connected: expr=127.0.0.1:60766

と想定通りのアクセスがきています。まず、murmurhashを使ったsort順に、c.kcd(3)、b.kcd(2)にPUTし、キューに回し、キューは c.kcd(3) からオブジェクトを一旦取得し、a.kcd(1) にPUTしてレプリカを作成します。

と、GreenBucketsでKyoto Tycoonが利用できることが確認できました。もちろんKyoto Cabinetがサポートする他のデータベースでも問題なく使えますし、揮発性のある分散Object Storageも作れます^^。画像ストレージとして考えた場合、Directory Hash Database を選ぶことになると思うのですが、ファイルがすべて1つのディレクトリに保存されてしまうので、lsが遅いとか扱いにくいのがアレかもしれません。

合わせて読みたい

このブログ記事について

このページは、Masahiro Naganoが2011年5月30日 00:17に書いたブログ記事です。

ひとつ前のブログ記事は「GreenBuckets ノード障害時の書き込み可用性を向上させた」です。

次のブログ記事は「memcached を使ったアプリケーションの設計について」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja