音楽データの運用方針/WorkLog/冗長構成の構築
Date: 2021/9/12
動機・背景
音楽ライブラリをある ストレージ に保存しているが、現状ではそのストレージ以外に保存していない。そのためストレージが故障するとすべての音楽ライブラリが消失する可能性がある。これではリスクが高すぎるので、当該ストレージが破損しても音楽ライブラリが消失しない冗長構成を構築したい。
冗長構成の検討
まず、冗長構成といっても様々なものがある。RAID/NAS を組んで自宅でやるパターンもあるし、クラウドストレージなど使うパターンもある。識者に聞いたところ、何が何でも守りたいデータは良しなに冗長化してくれるクラウドストレージにアップロードしておくと良い、と言われたので今回はクラウドストレージを使うことにした。それと丁度作業場やルータ付近に追加でハードウェアを設置したりするスペースが無くて自作冗長構成が難しく、その点クラウドストレージは都合が良かったというのもある。
クラウドストレージサービスの検討
Google Drive か Amazon S3 のどっちか。価格表を見ながらどっちが安いかを見ると良い。
Google Drive
最近 Google One にプランが結合された
定額制
追加した容量を Google Photos にもおすそ分けできるの便利
とはいえ今の所 mizdra.icon が使っている Pixel 4a が撮った写真は容量無制限で保存できているので、あんまり嬉しくない
いくつかプランがある
mizdra.icon の音楽ライブラリは現在 62 GB なので、選ぶとしたら 100GB のプランかな
Amazon S3
いくつかプランがある
音楽ライブラリだったら書き込み頻度も読み込み頻度も低いはずなので、S3 標準 - 低頻度アクセスで良い
従量課金制
勝手に複数AZに保存してくれて便利
色々考えて、S3 のほうが安そうだし勉強にもなりそう、ということで S3 に上げることにした。
S3 アップローダーの構築
インターネットで調べると、任意のディレクトリを勝手に S3 に動機してくれる GUI ツールが色々あるらしい。けどあんまり変なアプリケーション入れたくないし、バックグラウンドで常に動いていたりするとリソースの無駄になるので避けたい。更に調べてみると、どうやらAWS CLIに同期を取るコマンドが用意されているらしいので、そっちを使って自作でアップローダーを作ることにした。 bucket の作成
まず AWS のダッシュボードから bucket を作る:
リージョン: ap-northeast-1
バケットのアクセス設定: パブリックアクセスをすべてブロック
インターネット大公開すると不味いので
バケットのバージョニング: 無効にする
基本的に過去のバージョンにアクセスしたいことないはずなので
メタタグの付与の規則を変える時などに過去のバージョンのバックアップが欲しくなりそうだけど、そういう時だけ手動でバケットのバージョニングを有効にしたり、ローカルでコピーすれば対応できるはず
デフォルトの暗号化: 無効にする
万が一見られて困るデータはない
AWS CLI で作成されたことを確認:
code:console
$ aws s3 ls
2021-09-12 15:29:16 mizdra-music-library-backup
お試しでアップロードしてみる
練習も兼ねて適当なディレクトリをアップロードしてみる。
まずはアップロード対象となるディレクトリとファイルを雑に作成する:
code:console
$ mkdir s3-sync-test
$ echo '1\n2\n3' > s3-sync-test/file1
$ echo '1\n2\n3' > s3-sync-test/file2
$ echo '1\n2\n3' > s3-sync-test/file3
$ mkdir s3-sync-test/dir1
$ echo '1\n2\n3' > s3-sync-test/dir1/file4
この状態でaws s3 syncしてみる:
code:console
$ aws s3 sync s3-sync-test s3://mizdra-music-library-backup
upload: s3-sync-test/dir1/file4 to s3://mizdra-music-library-backup/dir1/file4
upload: s3-sync-test/file3 to s3://mizdra-music-library-backup/file3
upload: s3-sync-test/file1 to s3://mizdra-music-library-backup/file1
upload: s3-sync-test/file2 to s3://mizdra-music-library-backup/file2
ダッシュボード見たらちゃんとアップロードされていた。良さそう〜。
https://gyazo.com/f20c5004ce54887fb8c20c2ffaba3a9f
試しにファイル更新してからもう一度aws s3 syncしてみる:
code:console
$ echo '4' >> s3-sync-test/file3
$ cat s3-sync-test/file3
1
2
3
4
$ aws s3 sync s3-sync-test s3://mizdra-music-library-backup
upload: s3-sync-test/file3 to s3://mizdra-music-library-backup/file3
file3だけアップロードされた!
ドキュメントを見てみると、ローカルとS3上のファイルサイズが違う時、ファイルの最終変更日時がS3よりローカルのほうが新しい時、ファイルがローカルにはあるがS3には無い時、のいずれかの場合にアップロードされるらしい。
A local file will require uploading if the size of the local file is different than the size of the s3 object, the last modified time of the local file is newer than the last modified time of the s3 object, or the local file does not exist under the specified bucket and prefix.
file3をローカルから消したらどうなるか観察してみる:
code:console
$ rm s3-sync-test/file3
$ aws s3 sync s3-sync-test s3://mizdra-music-library-backup
何もおきなかった。S3にも残っている。
https://gyazo.com/a88766bc440c72953ab4931108604aa2
ドキュメントを読むと、--deleteオプションを付けるとローカルにないファイルをS3上から削除しつつ、アップロードもしてくれるらしい:
The following sync command syncs objects under a specified prefix and bucket to files in a local directory by uploading the local files to s3. Because the --delete parameter flag is thrown, any files existing under the specified prefix and bucket but not existing in the local directory will be deleted.
やってみる:
code:console
$ echo '4' >> s3-sync-test/file2
$ aws s3 sync s3-sync-test s3://mizdra-music-library-backup --delete
delete: s3://mizdra-music-library-backup/file3
upload: s3-sync-test/file2 to s3://mizdra-music-library-backup/file2
良さそう
https://gyazo.com/fcd0b3021d68b0501d7e6c6738e120a3
実験終わったのでファイル全部消す:
code:console
$ rm s3-sync-test/file1
$ rm s3-sync-test/file2
$ rm -rf s3-sync-test/dir1
$ aws s3 sync s3-sync-test s3://mizdra-music-library-backup --delete
delete: s3://mizdra-music-library-backup/dir1/file4
delete: s3://mizdra-music-library-backup/file2
delete: s3://mizdra-music-library-backup/file1
既存の音楽ライブラリをバックアップする
/Volumes/tiger/music/main に音楽ライブラリが詰まっているのでこれをアップロードしたい。
code:console
/Volumes/tiger/music/main
├── 2015-08-26-Bravely You _ 灼け落ちない翼
│ ├── 01 Bravely You.m4a
│ ├── 02 灼け落ちない翼.m4a
│ ├── 03 Bravely You (TV Size).m4a
│ ├── 04 灼け落ちない翼 (TV Size).m4a
│ ├── 05 Bravely You (Instrumental).m4a
│ └── 06 灼け落ちない翼 (Instrumental).m4a
├── 2015-09-02-FIRST_MODE
│ ├── 1-01 Your Voice.mp3
│ ├── 1-02 Jumping!!.mp3
│ ├── 1-03 シロツメクサの約束.mp3
│ ├── 1-04 きらめきいろサマーレインボー.mp3
│ ├── 1-05 さつきいろハルジオン.mp3
│ ├── 1-06 さくらいろチェリッシュ.mp3
│ ├── 1-07 ぎんいろスノウドロップ.mp3
│ ├── 1-08 My Best Friends.mp3
│ ├── 1-09 ほしいろサザンクロス.mp3
│ ├── 1-10 夢色パレード.mp3
│ ├── 1-11 にじいろアンダンテ.mp3
│ ├── 2-01 憧れパラダイス.mp3
│ ├── 2-02 秘密のテレパシー.mp3
│ ├── 2-03 叶えてメリーゴーラウンド.mp3
│ ├── 2-04 全開マジカルパワー.mp3
│ ├── 2-05 祭りデス☆クリスマス!!.mp3
│ ├── 2-06 夢色パレード (忍Ver.) _TVサイズ_.mp3
│ ├── 2-07 夢色パレード (アリスVer.) _TVサイズ_.mp3
│ ├── 2-08 夢色パレード (綾Ver.) _TVサイズ_.mp3
│ ├── 2-09 夢色パレード (陽子Ver.) _TVサイズ_.mp3
│ ├── 2-10 夢色パレード (カレンVer.) _TVサイズ_.mp3
│ └── 2-11 夢色パレード _TVサイズ_.mp3
...
以下のコマンドでアップロードする:
code:console
$ time aws s3 sync /Volumes/tiger/music s3://mizdra-music-library-backup --delete --storage-class STANDARD_IA
...
aws s3 sync /Volumes/tiger/music s3://mizdra-music-library-backup --delete 1376.25s user 1227.60s system 114% cpu 38:00.71 total
30分くらい掛かった
念の為ダッシュボードから正しいストレージクラスでアップロードされているか確認しておきましょう
今後のバックアップフローを決める
シンプルに取り込みが完了したタイミングで毎回aws s3 syncを叩く運用にする
ローカルにないファイルはS3に残す必要もないので、--delete で消してしまう
code:console
$ aws s3 sync /Volumes/tiger/music s3://mizdra-music-library-backup --delete --storage-class STANDARD_IA