Slide 1

Slide 1 text

mstdn.maud.io を支えるストレージの話 hota 1 1

Slide 2

Slide 2 text

hota すき: Android, 青髪赤目 職業: 学生 作者: FlokoROM, Koruri 運用: mstdn.maud.io 2 2

Slide 3

Slide 3 text

mstdn.maud.io 3 3

Slide 4

Slide 4 text

mstdn.maud.io 皆さんご存知 アカネチャンカワイイヤッター サービス開始2周年ありがとう これからもよろしくね 4 4

Slide 5

Slide 5 text

2年経った悩み 5 5

Slide 6

Slide 6 text

悩み ストレージの空きが心配になった 動画の読み込みが遅い 6 6

Slide 7

Slide 7 text

ストレージ問題 1年ちょっと前にディスクフルやらかしましたね diary.akane.blue/2018/01/16/server-disk-resized/ 申し訳なかった 500GBに増やしたけど気づけば320GB使用済に この調子だと数年内にはまた使い切るのでは 7 7

Slide 8

Slide 8 text

ストレージ問題 前回のようなでかいディスクへのフルコピーは? 時間かかるしめんどくさい そろそろ価格が現実的でない 何回繰り返すんだ 8 8

Slide 9

Slide 9 text

オブジェクトストレージ 9 9

Slide 10

Slide 10 text

ブロックストレージ ディスクサイズを選択 予め確保したサイズに対して課金 オブジェクトストレージ 総容量の上限がない 概ね従量課金(使った分だけ) ブロックストレージより安価 -> 大容量データの保存に適している 10 10

Slide 11

Slide 11 text

事業者選定 11 11

Slide 12

Slide 12 text

Amazon S3 aws.amazon.com/jp/s3/ GAFAのA(どっちの?) つよい 東京リージョンあり 転送量やリクエスト単位の課金が分かりにくい 12 12

Slide 13

Slide 13 text

Wasabi wasabi.com S3互換 とにかく安い ($5.99/TB) 転送量課金無し 日本から遠い(東西アメリカとEuropeだけ?) 13 13

Slide 14

Slide 14 text

ConoHa オブジェクトストレージ www.conoha.jp/objectstorage/ ご存知GMO OpenStack Swift? もちろん国内 転送量課金なし 微妙なお値段(450円/100GB) 14 14

Slide 15

Slide 15 text

Spaces on DigitalOcean www.digitalocean.com/products/spaces/ そこそこ有名な海外VPS屋さん S3互換 最寄りリージョンはシンガポール CDNあり(エッジが東京にもある) $5/250GB, 転送量1TBまで込 転送量にはCDN利用分を含む 15 15

Slide 16

Slide 16 text

選定 Amazon S3 通信料の見通しが立たず Wasabi 遠いのがネック ConoHa オブジェクトストレージ 価格が惜しい Spaces on DigitalOcean 比較的安い割にCDN完備(含東京)がえらい 太平洋渡るよりは近い 16 16

Slide 17

Slide 17 text

準備をする アカウントを作る 招待リンク経由で 60日間使える$100分のクレジット 実質初月/翌月無料 なんかProjectと呼ばれるなにかを作る サービスを超えて横断的にまとめておけるらしい 17 17

Slide 18

Slide 18 text

バケットみたいなのを作成 リージョンを選ぶ 近いのはシンガポール( SGP1 )でしょう CDNの要不要を選ぶ わたしはありで 自前のドメインをここで設定できる 名前を決めておわり 18 18

Slide 19

Slide 19 text

メディアファイルを転送する ...その前に! 19 19

Slide 20

Slide 20 text

アップロード量を可能な限り減らす 基本: tootctl media remove リモートメディアのキャッシュを消す --days=N も有効活用 docker: $ docker-compose run --rm web bundle exec bin/tootctl media remove non-docker: $ RAILS_ENV=production bundle exec bin/tootctl media remove 20 20

Slide 21

Slide 21 text

$ docker-compose run --rm web bundle exec bin/tootctl media remove --days=1 >Removed 321752 media attachments (approx. 87.6GB) >Removed 321752 media attachments (approx. 87.6GB) (X-Files Theme BGM) 21 21

Slide 22

Slide 22 text

応用: find コマンドを活用する リンクのプレビューカード用の画像のうち、指定した 日数より更新日時が古いものを削除 $ find public/system/preview_cards/ -mtime +7 -type f -delete 念の為 -delete つけずにテストはしようね うちはこいつも40GBくらいありました todo: 再取得どうなってるのか調べようね… 22 22

Slide 23

Slide 23 text

メディアの転送準備 rsync っぽくクラウドストレージを扱える rclone を使う rclone config によるセットアップが非常に簡単 最終的にこう [spaces] type = s3 provider = DigitalOcean env_auth = false access_key_id = ******************** secret_access_key = ****************************** endpoint = sgp1.digitaloceanspaces.com acl = public-read 23 23

Slide 24

Slide 24 text

叩いてみて作ったバケットが一覧に出てくればOK $ rclone lsd spaces: 2019-05-02 08:53:04 media-mstdn-maud-io あとは同期を走らせる $ rclone sync ~/mastodon/public/system spaces:media-mstdn-maud-io -P (24時間以上) 24 24

Slide 25

Slide 25 text

切替作業 25 25

Slide 26

Slide 26 text

切替作業こわくないよ だいたい同期できたらやっていきます 当日直前のはしゃーない 早めにやるに越したことはない 遅くなればなるだけローカルにファイルは積まれるの で、後の同期量が増える 切替だけならあまり停止時間はかからない 26 26

Slide 27

Slide 27 text

切替作業 .env.production の必要事項を埋めれば終わり # S3 (optional) S3_ENABLED=true S3_BUCKET=media-mstdn-maud-io AWS_ACCESS_KEY_ID=********** AWS_SECRET_ACCESS_KEY=********** # S3_REGION= S3_PROTOCOL=https S3_ENDPOINT=https://sgp1.digitaloceanspaces.com S3_ALIAS_HOST=media-mstdn.maud.io 書いたら docker-compose up -d とかでよし 27 27

Slide 28

Slide 28 text

つまづくとこ(個人的) S3_ENDPOINT は https:// から書くけど S3_ALIAS_HOST はドメインだけ Spacesの場合はendpointにリージョン含むので S3_REGION は不要 28 28

Slide 29

Slide 29 text

切替が完了したら メディアの配信元が切り替わっているかを確認する 自分のアイコンとかが簡単 新規の投稿画像でも同様に 主に切替直前までの、同期が済んでいないメディアが閲 覧できないので注意 APIは移行先の新URLを返すので 他インスタンスからの取得もコケるので気をつけたい インスタンス内外への周知が必要 29 29

Slide 30

Slide 30 text

最後の同期の完了 切替前までのメディアのアップロードを完了させる。 全てのファイルにチェックを行ってるっぽいので、 規模とファイル数で時間がかかる... $ rclone copy ~/mastodon/public/system spaces:media-mstdn-maud-io -P (ここで6-7時間) 30 30

Slide 31

Slide 31 text

おまけ:CDN 31 31

Slide 32

Slide 32 text

CDNを利用する オリジンサーバが遠い メディアの配信ドメインが変わったので、一律で キャッシュを適用しやすくなった ユーザに最適な経路で取ってこれるほうが速そう 動画の読み込み速度の改善が見込める 転送量課金の軽減 32 32

Slide 33

Slide 33 text

Cloudflareにした もともと maud.io のDNS管理してるので DNSレコード設定の雲をONにしてCloudflareのHTTP Proxyを通すようにするだけ! 証明書もくれるぞ DigitalOcean側でサブドメインを設定する時に使う 33 33

Slide 34

Slide 34 text

Page Rules 無料で3つまで作れる .mp4 をデフォルトではキャッシュしないので必要 メディアだけ別のサブドメインになったので、安心して 全部キャッシュできる URLmatch: media-mstdn.maud.io/* Settings: Cache Everything CDN導入後は動画の読み込み待ちが激減、快適に視聴で きるようになったとの声多数 34 34

Slide 35

Slide 35 text

FAQ なぜ media-mstdn.maud.io ? media.mstdn.maud.io でよかったのでは? CloudflareのEdge Certificatesが maud.io と *.maud.io だけだったんけど、ここで media.maud.io を使うのはもったいなく感じたから 結局いくらアップロードした? 84GBくらい。 35 35

Slide 36

Slide 36 text

他の質問とかどうぞ 36 36