分散ファイルシステムSDFS(Simple DFS)の使い方

まだまだ安心して便利に使える状態にはなっていませんが、分散ファイルシステムSDFS(Simple DFS)の使い方を一旦まとめてみます。

まずはダウンロードとsdfsコマンドの実行を可能にします。

$ cd
$ git-clone git://gist.github.com/4729.git sdfs
$ alias sdfs=$HOME/sdfs/ui.rb

次に1つ目のDFSディレクトリの設定と確認。

$ sdfs init $HOME/sdfs-data
$ cat .sdfs.yaml
---
- :removable: false
  :size: 1GB
  :url: /home/foo/sdfs-data

2つ目のDFSディレクトリの設定と確認。

実際には別HDDを指定しますが、ここでは説明のため普通のディレクトリを指定します。

$ echo "- :url: $HOME/sdfs-data2" >>.sdfs.yaml
$ cat .sdfs.yaml
---
- :removable: false
  :size: 1GB
  :url: /home/foo/sdfs-data
- :url: /home/foo/sdfs-data2
$ sdfs config put

UIがまだないのでリダイレクトを使用していますが、もちろんテキストエディタで編集してもOKです。

最後の sdfs config put は変更した設定ファイルを覚えさせ、設定されていない項目をデフォルト値で埋めるためコマンドです。

次のコマンドで未設定項目にデフォルト値が埋められたファイルを ~/.sdfs.yaml にコピーします。

$ sdfs config get
$ cat .sdfs.yaml
---
- :removable: false
  :size: 1GB
  :url: /home/foo/sdfs-data
- :removable: false
  :size: 1GB
  :url: /home/foo/sdfs-data2

これで準備OK。
ls, get, put, cat, check を使ってみましょう。

$ sdfs
commands: init, config, ls, cat, get, put, check
$ sdfs help
commands: init, config, ls, cat, get, put, check
$ sdfs ls
$ echo 'hello world' >hello.txt
$ sdfs put hello.txt
$ sdfs ls
hello.txt
$ sdfs cat hello.txt
hello world
$ sdfs get hello.txt foo.txt
$ cat foo.txt
hello world
$ sdfs check

Result:
online: 2
offline: 0
unbalance: 0
under replication: 0
over replication: 0
missing: 0
datanode has bad chunks: 0

なんとなく雰囲気が伝わりますでしょうか。

ファイルは2箇所に保存されますので、一方のDFSディレクトリがなくなっても大丈夫です。ちょっと実験してみます。

$ mv sdfs-data2 sdfs-data2.orig
$ sdfs ls
hello.txt
$ sdfs cat hello.txt
hello world

ただし、ファイルのコピーが減ってしまったので、sdfs checkでは以下のような警告が出ます。

$ sdfs check
warning: /home/foo/sdfs-data2 should have a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447
warning: no replication a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447

Result:
online: 2
offline: 0
unbalance: 1
under replication: 1
over replication: 0
missing: 0
datanode has bad chunks: 0

これを復活させるには sdfs balancer を実行します。が、まだ作っていません。

とりあえず説明の続きのため、元に戻します。

$ mv sdfs-data2.orig sdfs-data2

今度はファイルを壊すテストを行います。
内部的にはファイルはダイジェスト値(sha256sum)のファイル名で保存されております。

$ sha256sum hello.txt
a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447  hello.txt
$ cat sdfs-data/chunk/a948904f*
hello world
$ cat sdfs-data2/chunk/a948904f*
hello world
$ cmp hello.txt sdfs-data/chunk/a9*
$ cmp hello.txt sdfs-data2/chunk/a9*

では一方を壊してみます。

$ echo z >>sdfs-data/chunk/a9*
$ cmp hello.txt sdfs-data/chunk/a9*
cmp: ファイルhello.txtの末尾

するとsdfs checkでエラーとなります。

$ sdfs check
/home/sdfs-test/sdfs-data has a bad chunk.
856da8ba63f1aad5afa52602da50d093e4183d8b185e727c6fb8067b6cb02e26
a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447

Result:
online: 2
offline: 0
unbalance: 0
under replication: 0
over replication: 0
missing: 0
datanode has bad chunks: 1

一応、sdfs getもできます。

$ sdfs get hello.txt foo2.txt
warning: digest
$ cmp hello.txt foo2.txt

以上が簡単な説明です。

ぜひ使ってみて、問題点や感想とかをお聞かせください。
まあ、今は問題点だらけなんですけどね。

それにしてもSDFSより、もっとユニークでいい名前ないかなぁ。