SeaweedFSを起動しファイルを保存・照会する
目標
SeaweedFSのマスター、ボリュームサーバー、ファイラーを自分で立ち上げ、低レベルのAPIでファイルを保存・参照しながら、小さなファイルが大量にあるワークロードに、この構造がなぜ有利なのかを確認します。
なぜ重要なのか
4KBのファイル100万個は、データとしては4GBですが、ファイルシステムにとっては100万個のメタデータエントリです。inodeが枯渇し、一覧の取得が何分もかかり、バックアップツールがファイル1つ1つをstatするのに何日も使います。SeaweedFSは、FacebookのHaystackのアプローチに倣って、小さなファイルを大きなボリュームファイルの中に続けて書き、オフセットだけを記憶します。ファイル1,000個がボリュームファイル1つに入れば、inodeは1つで、読み取りはシーク1回です。このラボで特に重要なのは、ステップ3から5です。マスターに位置を尋ね、ボリュームサーバーに直接書き、また位置を尋ねて読むこの流れが、SeaweedFSのすべてです。ファイラーとS3ゲートウェイは、その上の利便性のための層にすぎず、この2つのステップを理解すると、なぜマスターがボトルネックにならないかが見えてきます。
ステップ
/root/sw/masterディレクトリを作成し、weed masterを127.0.0.1:9333で立ち上げてください。curl http://127.0.0.1:9333/cluster/statusがJSONを返す必要があります。/root/sw/vol1を作成し、weed volumeを127.0.0.1:8180で立ち上げて、マスターに登録してください。curl http://127.0.0.1:9333/dir/statusの応答に、ボリュームサーバーが1つ以上見える必要があります。curl http://127.0.0.1:9333/dir/assignの結果のfidを、/root/sw/fid.txtに保存してください。숫자,16진문자열は、数字、カンマ、16進文字列の形式を指し、その形式である必要があります。/opt/fixtures/s3/readme.txtを、そのfidでボリュームサーバーにアップロードしてください。応答のsizeが0より大きい必要があります。/dir/lookup?volumeId=<볼륨ID>(山括弧の部分にはボリュームのIDを入れます)で位置を探して、ファイルを/root/sw/got.txtに受け取ってください。元のファイルと内容が同じである必要があります。weed filerを127.0.0.1:8888で立ち上げてください。/opt/fixtures/s3/sales.csvをhttp://127.0.0.1:8888/lab/sales.csvにPUTし、GETで受け取り直して、/root/sw/filer.csvを作成してください。内容が同じである必要があります。/root/sw/many.shで、4KiBのファイル500個を、ファイラーの/lab/small/の下に入れてください。/root/sw/volfiles.txtにfiles=500 dat_files=<n>を書き、nは10以下である必要があります。/root/sw/arch.mdに、## 마스터、## 볼륨 서버、## 파일러の3つの見出し(順に、マスター、ボリュームサーバー、ファイラー)を入れ、各セクションを25文字以上で書いてください。マスターのセクションには、メタデータを持たないという趣旨が入っている必要があります。
参考
- マスター:
weed master -mdir=/root/sw/master -port=9333 -ip=127.0.0.1 - ボリューム:
weed volume -dir=/root/sw/vol1 -mserver=127.0.0.1:9333 -port=8180 -ip=127.0.0.1 - ファイラー:
weed filer -master=127.0.0.1:9333 -port=8888 -ip=127.0.0.1 - ボリュームファイルの数え方:
ls /root/sw/vol1/*.dat | wc -l - よくあるミス1: マスターにファイルをアップロードしようとしてしまうこと。マスターは、位置を教えるだけです。
- よくあるミス2: 各デーモンの
-ipを指定せず、登録されたアドレスにアクセスできなくなること。
マスターを立ち上げる
/root/sw/masterディレクトリを作成し、weed masterを127.0.0.1:9333で立ち上げてください。curl http://127.0.0.1:9333/cluster/statusがJSONを返す必要があります。
weedバイナリのサブコマンドで、各ロールを立ち上げます。データディレクトリを、先に作っておいてください。
ボリュームサーバーを立ち上げ、マスターに登録する
/root/sw/vol1を作成し、weed volumeを127.0.0.1:8180で立ち上げて、マスターに登録してください。curl http://127.0.0.1:9333/dir/statusの応答に、ボリュームサーバーが1つ以上見える必要があります。
ボリュームサーバーは、マスターのアドレスを知っている必要があります。マスターの状態に、ボリュームサーバーが見えるかを確認してください。
ファイルIDを発行してもらう
curl http://127.0.0.1:9333/dir/assignの結果のfidを、/root/sw/fid.txtに保存してください。숫자,16진문자열は、数字、カンマ、16進文字列の形式を指し、その形式である必要があります。
マスターに書き込み位置を尋ねると、ファイルの識別子とサーバーのアドレスを、一緒に返してくれます。
発行されたIDでファイルをアップロードする
/opt/fixtures/s3/readme.txtを、そのfidでボリュームサーバーにアップロードしてください。応答のsizeが0より大きい必要があります。
マスターではなく、ボリュームサーバーにアップロードします。マスターは、位置を教えるだけです。
参照してダウンロードし、内容を確認する
/dir/lookup?volumeId=<볼륨ID>(山括弧の部分にはボリュームのIDを入れます)で位置を探して、ファイルを/root/sw/got.txtに受け取ってください。元のファイルと内容が同じである必要があります。
ボリュームIDで位置を尋ね、そのサーバーから受け取ります。元のファイルと同じである必要があります。
ファイラーを立ち上げ、パスで扱う
weed filerを127.0.0.1:8888で立ち上げてください。/opt/fixtures/s3/sales.csvをhttp://127.0.0.1:8888/lab/sales.csvにPUTし、GETで受け取り直して、/root/sw/filer.csvを作成してください。内容が同じである必要があります。
ファイラーは、パスベースのアクセスを提供します。HTTPのPUTとGETで扱えます。
小さなファイルを500個入れ、ボリュームファイルの数を確認する
/root/sw/many.shで、4KiBのファイル500個を、ファイラーの/lab/small/の下に入れてください。/root/sw/volfiles.txtにfiles=500 dat_files=<n>を書き、nは10以下である必要があります。
ファイル500個が、ボリュームファイルいくつに入っているかを、数えてみてください。これが、このストレージの存在理由です。
3つのデーモンの役割を整理する
/root/sw/arch.mdに、## 마스터、## 볼륨 서버、## 파일러の3つの見出し(順に、マスター、ボリュームサーバー、ファイラー)を入れ、各セクションを25文字以上で書いてください。マスターのセクションには、メタデータを持たないという趣旨が入っている必要があります。
何がメタデータを持ち、何がデータを持つかが、要点です。指定された見出しを、正確に書いてください。