びBacklogのチームへと戻りGitホスティング領域の開 発と運用を支えています。 X:https://x.com/vvvatanabe GitHub:https://github.com/vvatanabe 自己紹介 Copyright Nulab Inc. All Rights Reserved.
・mod_davモジュールでWebDavプロトコルをサポート。 ・mod_perlモジュールでBacklog特有の処理を拡張を実装。 ・時代の流れとともに、ApacheやPerlに詳しい人材は減ってはいるが... ・安定した機能を提供してくれる歴戦の戦士 AWS Cloud ※ コンポーネント間のLBは省略 File File File 本体 WEB File WebDAV WebDAV mod dav mod perl Copyright Nulab Inc. All Rights Reserved.
本体 WEB File WebDAV WebDAV ・ファイルの保存先となるストレージはAWSのEBS。 ・EBSを使う兼ね合いでファイルサーバーはEC2を使用。 ・ファイルサーバーは複数のEBSをマウントしてディスク容量を拡張。 ・ファイルは一定のグループに分けて特定のEBSに保存。 mod dav mod perl Copyright Nulab Inc. All Rights Reserved.
・設計次第で階層構造を表現したり、複数のプロパティを管理できる。 id UUID2 parent_id UUID1 name foo type Directory id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID5 parent_id UUID2 name baz type Directory id UUID6 parent_id UUID2 name apple.png type File id UUID1 parent_id name root type Directory Copyright Nulab Inc. All Rights Reserved.
・圧倒的容量不足。 バイナリデータなどサイズが大きくなりやすいデータは保存できない。 id UUID2 parent_id UUID1 name foo type Directory id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID5 parent_id UUID2 name baz type Directory id UUID6 parent_id UUID2 name apple.png type File id UUID1 parent_id name root type Directory 400 KB制限 Copyright Nulab Inc. All Rights Reserved.
Attributes Key Type Desctiption id PK string ユニークなID 例. UUID parent_id GSI string 親ディレクトリのID name string ファイル、ディレクトリ名 例. report.pdf type string ファイル、ディレクトリの種別 例. File or Directory size number ファイルサイズ 例. 512 modify string ファイルの更新日時 例. ISO8601 dead_props map カスタムプロパティのマップ version number 楽観ロックのためにのバージョン番号 Key 1bdb5d9a-3581-49b0-a504-337b6f742aa7 d6c5e932-ef4f-4a05-a504-aae27bb5d62b ad06422b-64e3-444d-b06a-fc6ce2fce25a 43276bca-2f05-4650-ab23-16f1c18fd902 09524a50-ce18-42da-b7e9-c24ef97dba39 Copyright Nulab Inc. All Rights Reserved.
1. アプリでファイルに付与するユニークなID(UUID等)を生成する。 2. 1.のIDをキーにして、ファイルの実態をS3に追加する。 3. 2.で失敗したらエラー終了。 4. 1.のIDをキーにして、ファイルのメタデータをDynamoDBに追加する。 5. 4.で失敗したらエラー終了。S3にファイルの実態は残るが、到達不能(どこか らも参照されない)ので影響なし。 id UUID2 parent_id UUID1 name foo type Directory id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID5 parent_id UUID2 name baz type Directory id UUID6 parent_id UUID2 name apple.png type File id UUID1 parent_id name root type Directory ファイルのメタデータ ECS or EKS or Lamda ファイルの実態 IDを生成 Key UUID4 UUID6 メタデータの追加 実態の追加 Copyright Nulab Inc. All Rights Reserved.
3. 2.のアイテム一覧からfooを特定する。 4. patent_id=foo.id のアイテム一覧を取得する。 5. 4.のアイテム一覧からapple.pngを特定する。 6. apple.pngのStatを返却する。 課題: ファイルパスの階層が増えれば増えるほどクエリが増える。 各アイテムにファイルのフルパスを持たせる? ・リネーム・削除の際に、関連する全アイテムのアトミックな更新が必要。 ・DynamoDBのトランザクションは100件まで... id UUID2 parent_id UUID1 name foo type Directory id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID5 parent_id UUID2 name baz type Directory id UUID6 parent_id UUID2 name apple.png type File id UUID1 parent_id name root type Directory Copyright Nulab Inc. All Rights Reserved.
・DynamoDBの400kb制限があるのでS3に保存する。 ・さらに、ツリーのサイズに適切な閾値を設定して、 ツリーを更新するタイミングで分割・結合を繰り返す ことで肥大化を防ぐ。 root root UUID8.json UUID9.json Copyright Nulab Inc. All Rights Reserved.
1. まずはユニークなID(UUIDなど)を生成する 2. 1.のIDで更新されたツリーの実態をS3に追加する。 3. 2.で失敗した場合はエラー終了。 4. メタデータとツリーの参照を、DynamoDBのトランザクションと条件付き書き込みで、アトミックに更新する。 5. 4.で失敗したらエラー終了。 ツリーの実態は残るが、どこからも参照されないので影響は無い。 DynamoDB S3 ECS or EKS or Lamda ファイルのメタデータ ファイルの実態 x/net/webdav ツリーの実態 ツリーの参照 Attributes Key Type Desctiption id PK string ユニークなID current_id string 最新版のツリーのID version number 楽観ロックのためにのバージョン番号 Copyright Nulab Inc. All Rights Reserved. ツリーの参照
・ガベージコレクターのフロー: 1. メタデータのparent_idをもとに親の存在チェックを行う。 2. 親が存在しなければ到達不能とみなして対象のメタデータを削除する (ルートは除外)。 3. 削除対象がファイルの場合、idを指定して対象のS3のオブジェクト( ファイルの実態)も削除する。 id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID5 parent_id UUID2 name baz type Directory id UUID6 parent_id UUID2 name apple.png type File id UUID1 parent_id name root type Directory 到達不能なので削除 S3の実態も削除 ファイルのメタデータ ファイルの実態 Key UUID1 UUID2 id UUID2 parent_id UUID1 name foo type Directory 削除 ガベージコレクター Lamda EventBridge Scheduler スケジューラー Copyright Nulab Inc. All Rights Reserved.
1. S3オブジェクトのリストを巡回する。 2. 作成日時がn日前 && オブジェクトのキーに紐付く メタデータ・ツリーの参照が存在しなければ、 対象のS3オブジェクトを削除する。 (作成日時をもとにメタデータを追加するタイミングを避ける) id UUID3 parent_id UUID1 name bar type Directory id UUID4 parent_id UUID1 name README.md type File id UUID7 parent_id UUID3 name hoge type Directory id UUID1 parent_id name root type Directory ファイルのメタデータ ファイルの実態 Key UUID4 ファイルのメタデータ の追加に失敗 ・メタデータが存在しない ・作成日時がn日前 Lamda EventBridge Scheduler ガベージコレクター スケジューラー Copyright Nulab Inc. All Rights Reserved.