Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mstdn-maud-io を支えるストレージの話 / tokaidolug-yokohama-201905

hota
May 18, 2019

mstdn-maud-io を支えるストレージの話 / tokaidolug-yokohama-201905

横浜で喋ったやつです。
https://tokaidolug.connpass.com/event/128671/

発表内で補われた行間については後日ブログ記事として公開される予定です。
→しました https://diary.akane.blue/2019/06/05/move-media-to-object-storage/

補足: p.17 招待リンク経由のクレジットですが、5/16から30日間50ドルになったようです https://www.digitalocean.com/docs/platform/release-notes/#may-2019

hota

May 18, 2019
Tweet

More Decks by hota

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. mstdn.maud.io
    3
    3

    View Slide

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

    View Slide

  5. 2年経った悩み
    5
    5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 事業者選定
    11
    11

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. アップロード量を可能な限り減らす
    基本: 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

    View Slide

  21. $ 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

    View Slide

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

    View Slide

  23. メディアの転送準備
    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

    View Slide

  24. 叩いてみて作ったバケットが一覧に出てくれば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

    View Slide

  25. 切替作業
    25
    25

    View Slide

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

    View Slide

  27. 切替作業
    .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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. おまけ:CDN
    31
    31

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  36. 他の質問とかどうぞ
    36
    36

    View Slide