blog@noellaboの技術ブログトップ記事一覧ログ一覧2019-09-28Wasabiの障害に悩まされている小規模Mastodonサーバのための機能拡張と運用の提案Mastodonwasabiと上手に付き合おう安くて嬉しい我らがオブジェクトストレージwasabiですが、たびたび不安定になってツライという悩みどころがあります。そこで、Mastodonにちょっとだけ手を加え、運用を工夫して、上手に付き合っていこうという提案です。複数のオブジェクトストレージにデータ保存する運用も可能ローカルファイルシステムを使うので、webとsidekiqが同一サーバの必要ありMastodon本体にちょっとだけ改造が必要どんな運用を行うかメディアを最初はローカルファイルシステムに保存し、あとからwasabiに同期する戦略です。wasabiに直接保存したり、wasabiから直接取得しないことで、wasabiの障害の影響を回避します。外部からのアクセスはnginxが引き受け、ローカルにある場合はローカルから、なかったらwasabiからデータを取得・送信するように設定します。ローカルは一時保存ですので、通常はwasabiに同期できたら消してしまいます。発想を変えて、7日など長めに保持して、メディアがよく参照される期間はすべてローカルで対応することも可能です。アカウントのアバターやカスタム絵文字は、ローカルから消さずに保持し続けるなど、内容による柔軟な運用も可能です。いずれの場合も、ローカルに保存可能な空き容量と相談して、余裕を持って削除します。wasabi側は全てのデータを保持し、ローカルに障害が発生したり、この運用を中止した場合でも、従来通り単独で機能するように維持します。wasabiへの同期は、wasabiが正常動作している場合は早めに実行しましょう。ファイル変更を検知してリアルタイムに行っても良いし、cronで適当な間隔で定期実行でもOKです。wasabiに障害が発生している間は同期を中止すれば良いので、回復するまで心穏やかに過ごすことが出来ます。メディアファイルが削除された場合、単純にローカルからファイル削除すると、wasabi側のファイルが参照されて見えてしまったり、削除を同期するのが難しくなるので、MastodonのPaperclipの動作に手を入れて、0バイトの公開アクセス権のないファイルに置き換えるようにします。この運用ではnginxを用いるため、nginxのキャッシュ機能を活用した高速化が図れます。manaelを組み合わせてwebpで配送することも可能です。外側にcloudflareなどを置くと、負荷が軽減されます。最初に、nginxの設定を済ませてしまいます。自身の環境に合わせて、読み替えて必要なところだけ拾ってください。メディアファイルのドメイン名についてところで、メディアファイルのドメインはどうしていますか?wasabiを既に利用している場合は、S3_ALIAS_HOSTに何かドメインを設定して、DNSにCNAMEを設定してwasabiにつながるようにしているのではないかと思います。本提案と同様、nginxをリバースプロキシにしていますか?してない場合は、wasabiのURLのまま参照されているかもしれません。メディアのドメイン名は、連合先に配信された投稿に埋め込まれているので、変更すると連合先からは参照できなくなります。今回設定する場合は、ずっと変更せずに使い続けられるドメインを設定しましょう。メインのMastodonのドメインがexample.comだったら、media.example.comとかfiles.example.comという感じ。設定ファイルを書くmedia.example.comということにして、ざっくりこんな感じに設定します。}証明書を設定するcertbot等で取得して設定してください。Mastodon本体の証明書に一緒にしてもいいと思います。ここは説明を省略します。$uriをみて、見つからなければ@proxyで別途記述したwasabiへのproxy接続を行います。wasabiからのレスポンスをキャッシュするキャッシュのパス設定。Mastodon本体にもキャッシュパスが設定されてたりするので、nginx.confなど一箇所に書いて共有するか、それぞれ別の名前とパスで設定すること。max_size=1g;で、ここが実際に使う設定。28d;ファイルが見つからない時の設定ちょっとした小細工の類です。DNSの設定をかえるまだそうなっていない場合は、media.example.comがnginxを指すように変更する。S3_ALIAS_HOSTの設定をかえるまだそうなっていない場合は、.env.productionにS3_ALIAS_HOST=media.example.comを設定して、Mastodonを再起動する。ここまでのまとめローカルのnginxリバースプロキシ経由でwasabiに接続するように設定されます。ローカルにファイルが存在すれば、そちらを優先して表示するようになります。これが問題無く動くことが確認できたら、次のステップに進みます。Mastodonに改造を施すcherry-pickするどちらかというとRailsでよく使われているPaperclipというgemの改造になるので、Mastodon本体に与える影響は軽微です。このコミットをcherry-pickしてください。v2.9.3用にまとめてありますが、v3.0.0rc1に適用しても大丈夫です。v2.9.3などタグを添えてcheckoutすればOKです。cherry-pickが下記のようなメッセージを出してきた場合、うまくソースコードを取り込めずにエラーが発生しています。--continueすればいいんですが、よくわからないから元に戻したい、キャンセルしたいということもあるかと思います。--abortとコマンドを入力してください。失敗したので取り消し、となります。0640)するようになります。nginxの設定で、アクセス権が無い場合に404を返すようにしてあるので、実質的に削除したのと同等の振る舞いをするようになります。つける)すれば、設定完了です。mastodonを再起動すれば、動作が切り替わります。NDFS_ENABLED=trueこの運用形態をやめて、以前のwasabiのみの状態に戻す場合は、この設定を戻すだけでOKです。#NDFS_ENABLED=truewasabiにローカルのファイルを転送するここからは、様々な運用方法が考えられるため、紹介するやり方は一つの例です。configureでwasabiにアクセスできるようにセットアップしておきます。[None]:wasabiのus-east-1を利用している場合はこちらを実行します。media.example.comは、実際のバケット名に読み替えてください。--quietwasabiのus-west-1を利用している場合はこちらを実行します。media.example.comは、実際のバケット名に読み替えてください。--quietこれを定期実行すればwasabiに同期されます。不安定な時は、手動で実行した方がいいかもしれません。syncは結構重いので、ファイルを絞り込んでcpやmvで済ませたり、max_concurrent_requestsやmax_queue_sizeを引き上げたり、深夜に実行するようにしたり、工夫が要るかと思います。無理に定期実行せずに、wasabiの調子が良い時はS3_ENABLED=trueで運用して、ダメな時だけこの運用に切り替えるのがベストかもしれません。ローカルの不要なファイルを削除する保持期間は任意ですが、wasabiに同期が済んでいるものだけを削除します。