以下にリンク論文がある。
日本語の解説は
が詳しい。以下、私も重要だと思ったポイントを挙げておこう。
(システム構成)
- マスター、チャンクサーバ 、クライアントの3種類。基本的に安いPCでシステムが構築できるようにしている。
- PC は壊れる(信頼はしていない)のが前提のもとにシステムを設計している。
- チャンクサーバにデータを格納する。
- データは可用性向上(万一のため)3つのチャンクサーバに格納している。チャンクサーバが同じ電源を使っていたりしたら全部データが飛ぶ可能性があるので、さすがに別のラックのチャンクサーバ同士に保存するとか、空きディスク容量が多いチャンクサーバ(すなわち新品)へ、とか考慮している。データは基本的に64MBの固定長。分断されたデータをチャンクと呼ぶ。
- マスターはチャンクサーバの位置、ファイル名(ディレクトリツリー)、ファイルのロックなどの管理。その情報はオンメモリで。
- 操作ログが大事で、マスターは永続ストレージに情報を保存せず、その代わりに操作ログは保存している。もし再起動が必要で環境を再構築する必要に迫られたら、操作ログから復元する。操作ログは適宜チェックポイントを設けているので、再構築はチェックポイントからとなる。
- マシンが異常終了して落ちたとか、シャットダウン処理を行って終了したとかの区別はない。その2つは同じ「終了」としてみなしている(要は、常に異常終了してもいいように、マシン終了、再起動の場合は最悪の事態を想定して備えていれば間違いない、ということだろう)。
- チャンクサーバはマスタにハートビート(キープアライブ)を打って生存を示している。
(データ)
- データは、アプリからは追記(append)と読み出しがメインのユースケースを想定。データが更新されたらランダム書き込みとかは考えない。どんどん新しいバージョンを追記していく方針。
- データのキャッシュはしない。読み出しはどっちみちストリームだから。
- 3台ものマシンに同じデータを分散させるので、データの一貫性(consitency)が問題となる。これは、データのチェックサムでアプリが対処したり、マスターサーバがデータの参照カウント(バージョン)を保持して対応している。
- 3台ものマシンにデータを複製するので、レイテンシー(latency; 遅延)も問題となるように思うが、それはあまり重視していない。
- ファイルの削除は、まずは削除したいファイルにマークするだけなので高速。3日後、バッチ的な処理で消す。
トラックバック URL:
https://perltips.twinkle.cc/trackback/288