Mastodonのサーバ間通信って切れるの?
こういう現象が起こります。
Mastodon でリモートインスタンスから自分のトゥートがみえなくなることがある
メンテ時などに特定のエラーが起こると相手のサーバが接続を切ってしまいます。
リカバリ方法は?
- 受信側からsubscribeを再実行する(手動)。
- 7日間待って受信側のcronが有効期限更新のためにsubscribeを実施するのを待つ。
- バックアップからsubscriptionsテーブルのレコードを戻す。
- Mastodonにパッチを当ててsubscriptionsが論理削除になるようにする(https://github.com/clworld/mastodon/pull/1/files)
どうすればいい?(送信側)
- バックアップでも論理削除でも何かしらの準備が必要
- 何も準備していなかった場合は7日間待つ以外の方法は無い
どうすればいい?(受信側)
送信側サーバのsubscriptonが消えてたらsubscribeを再実行すれば良い
どうやって?
subscriptionsが生きているか確認するAPIがきっとどこかに => 探してもどこにもなかった
どうしよう
- とりあえずリモートフォローしているアカウントを全部subscribeしなおす => 負荷とかいろいろつらい
- どうにかしてどのアカウントのsubscriptionが切れたのかを調べる
Nginxのログからsubscribeが切れたアカウントを探す
/api/subscriptions/xxx にアクセスされてステータスが 3xx, 4xx (429除く) だったらそのsubscriptionsは切れたとみなす。
cat (nginxのログ) | grep /api/subscriptions/ | egrep '" [34][0-9][0-9] ' | grep -v '" 429 '
出てきたログのうち、Mastodon(UAは"Mastodon/PubSubHubbub")の物が対象。注: Mastodon以外のGNU Social互換鯖のことも一応考える必要があるかもしれない。
xxx.xxx.xxx.xxx - - [xx/Apr/2017:xx:xx:xx +0900] "POST /api/subscriptions/107 HTTP/1.1" 404 39 "-" "Mastodon/PubSubHubbub"
こんなログが見つかります。
/api/subscriptions/ 後にある数字のidをaccountsから探してsubscribeしてあるべきユーザかどうかを確認しましょう。
subscribeが切れたアカウントをリカバリする。
subscribeしてあるべきユーザだった場合リカバリを実施します。
量にもよりますがrails consoleで直接SubscribeServiceを呼び出すのが楽でしょう
RAILS_ENV=production bundle exec rails console
SubscribeService.new.call(Account.find(107))
まとめ
- メンテ時には可能な限り/api/subscriptions/ で 3xx, 4xx のレスポンスを返さないように注意しましょう。
- subscriptionsテーブルのバックアップや論理削除は予め設定しておきましょう。
- 送信側で出来る対応は準備が無いと7日間待つだけになってしまうので対応可能な受信側で復旧した方が良いと思います。
追記
- 受信側からはsubscribeが切れたことを検知出来ないため受信側からのcron(mastodon:push:refresh)による再接続は期限切れ直前を待つ必要があります。
- subscribeはユーザ単位で行なわれるため、同じサーバでも接続が切れるユーザと切れないユーザが発生します。
clworld
7Contribution