はんドンクラブ 運営ブログ

Mastodonインスタンス「handon.club」の運営ブログです。コラムなど,Mastodonに関する一般的な記事も投稿予定です。

【バージョンアップ】3.0.1にアップデートしました

handon.club は v3.0.0 → v3.0.1 へアップデートしました🎉

アップデートの概要

Mastodon 3.0 のメンテナンスリリースが行われました。検証環境にて試験を実施し,問題無いことが確認出来たため,アップデートを行いました。

  • githubへリリースされてからアップデート完了まで,18時間を要しました
  • アップデートにかかるサービス中断時間は 0秒でした

前回バージョンからの変更点

v3.0.0 からのアップデート内容はバグ修正です。更なる詳細はGithubのリリースページを参照ください。

Release v3.0.1 · tootsuite/mastodon · GitHub

前回のアップデート

v3.0.0で多くの新機能が導入されています。詳細はイカをご参照ください。

handon.hatenablog.jp

【バージョンアップ】3.0.0rc1にバージョンアップしました

handon.club は v2.9.3 → v3.0.0rc1 へアップデートしました🎉

アップデートの概要

新バージョンである Mastodon 3.0 のリリース候補版(RC版)のリリースが行われました。正式版ではありませんが,検証環境(AWS)にて試験を実施し,問題無いことが確認出来たため,アップデートを行いました。なお,3.0リリース前に本家ソースコードのmaster追従を行っていたため,はんドンクラブでは大半の機能が2019/9/20頃から利用出来ていました。

  • githubへリリースされてからアップデート完了まで,13時間を要しました
  • アップデートにかかるサービス中断時間は 0秒でした

前回バージョンからの変更点

v2.9.3 からのアップデート内容は以下の通りです。内容が非常に多いため,管理人の独断で,はんドンクラブのユーザに関係しそうだと思うもののみ記載しています。

  • 新機能
    • ディレクトリ機能 の更新
    • オーディオプレーヤの追加
      • オーディオファイルだけをアップロードし,そのファイルをWeb上で再生する機能が追加されました。
      • アップロードできるオーディオファイルの形式は .ogg .oga .mp3 .wav .flac .opus .aac .m4a .3gp です。
    • ハッシュタグ補完機能の追加
    • 全文検索のpagination機能の追加
      • 全文検索の結果は,これまで予め管理者が設定した件数(デフォルトで20件)までしか表示されず,それ以降の結果は表示不可能でした。
      • 今回のアップデートでは,結果画面に「さらに表示」ボタンが追加されました。これによって,管理者が設定した上限数以上の検索結果を確認出来るようになりました。
    • 全文検索におけるオペレータ機能の追加
      • Google検索のように,「+」(AND)や「-」(NOT)と言ったOperatorを使うことで,より詳細に検索条件が出来るようになりました。
    • スローモードの追加
      • Web上でUserstreamによる自働更新を行わないモード(スローモード)が追加されました。
      • 利用するためには,ユーザ設定画面から「手動更新モード」を有効にして下さい。
    • 投票後に自分がどの選択肢に投票したか表示する機能の追加
      • アンケートに投票した後,自分がどの選択肢に投票を行ったのか,チェックマークにより明示されるようになりました。
    • アカウント自働移行機能 の追加
      • サーバ間でのアカウント移行が,Webで半自動的にできるようになりました。
      • 非常に重い機能となりますので,はんドンクラブにおいては,利用は推奨しません。
    • 注目のハッシュタグ機能 の復活
      • サーバ内でよく使われているハッシュタグを表示する「注目のハッシュタグ機能」が復活しました。以前一度実装されていましたが,スパムの温床になるとのことで一度削除されていました。
      • 今後,管理人の承諾が行われたハッシュタグのみ,注目のハッシュタグに表示されるようになります。注目のハッシュタグは,「トレンド」として,Webの一番右のカラムに表示されます。
    • サーバがブロックしているドメインを自働表示する機能の追加
      • 管理人がブロックまたはサイレントしているサーバを表示する機能が追加されました。
      • はんドンクラブでは https://handon.club/about/more の下部に表示されます。ブロックしている理由も明記しております。
    • カスタム絵文字のカテゴリ化機能 の追加
      • カスタム絵文字がカテゴリ分けできるようになりました。Webでは,サーバ管理者が設定したカテゴリに従って表示されます。
      • なお,3rdパーティ製クライアントをご利用の方は,クライアント側が対応するまでこの機能は利用出来ません。詳細はクライアント作者までお問い合わせ下さい。
    • 特定のサーバとのみ連合する機能(ホワイトリスト機能)の追加
      • はんドンクラブでは有効化する予定はありません。
    • 管理人からの警告メールに当該トゥートを明記する機能の追加
    • 2段階認証利用時におけるメール確認機能の追加
    • ブラウザタブに表示されるページタイトル名に未読通知数が表示される機能の追加
  • 変更点
    • DMカラムのUI変更
      • WebにおけるDMカラムのUIが大幅に変更されました。誰からDMを受け取ったかどうかが分かりやすくなりました。
    • クライアント向けAPIの一部削除
      • DMを取得するAPIが削除され, /api/v1/conversations を使う方法に変更する必要があります。
      • 全文検索を提供するAPIのうち古いものが削除され, /api/v2/search を使う必要があります。
    • 連合向けIFの一部削除
      • 1.0からサポートされていたOStatus関連の機能が全て削除されました。
    • 投稿メディアにおけるWebPサポートの削除
      • 対応が不十分であったことから,WebPの画像を投稿する機能が削除されました。

上記は一部だけを書き出しています。今回のアップデートには,多くのバグ修正や微細な機能修正が含まれています。更なる詳細はGithubのリリースページを参照ください。 Release v3.0.0rc1 · tootsuite/mastodon · GitHub

前回のアップデート

handon.hatenablog.jp

【復旧】【障害発生報】一部ユーザの接続レスポンスが悪い状態が続いています

以下の障害が発生しており,復旧に向けて取り組んでいます。ご利用の皆様にはご不便ご迷惑をおかけしております。

Update: 本件は復旧し,現在は正常に動作しています。

復旧まで時間を要してしまったこと,検証環境にて本問題に気づけなかったこと,お詫びいたします。

状況を報告頂ける方は,以下のトゥートの通り,詳細な情報を頂けますと幸いです。

なお,今後の障害情報については,以下ページでも配信します。将来的にはこのブログも移行する予定です。

status.handon.highemerly.net

「通報」機能についてのお願い

はんドンクラブ管理人のはんです。

この記事では通報機能の使い方について,お願いを記載いたします。最近意図の分からない通報が増えており,インスタンス運営上の困りごとの一つとなっています。厳密なルールにしたいわけではないので,どうしても難しい場合は柔軟に運用することとしたいと思いますが,ご協力をお願いします。

通報は管理者対処が必須の場合のみお願いします

マストドンには「フォロー解除」「ミュート」「ブロック」などの機能があります。この機能は,マストドンに登録しているユーザであれば誰でも自分の意思のみで利用でき,管理者に報告する必要はありません。

機能の名前 効果
フォロー解除 対象の人の発言が,あなたのHTLに流れなくなります
ミュート 対象の人の発言が,あなたのHTL/LTL共に流れなくなります(フォロー状態には影響しません)
ブロック 対象の人の発言が,あなたのHTL/LTL共に流れなくなります(その上で互いにフォロー解除されます)

これらの機能は,サーバ(インスタンス)全体に影響を与えることはなく,あなた個人だけに影響する設定です。そのため,管理者への通報は「サーバ全体で統一的な処置が必要な場合」にのみ実施していただきたいです。

ここで,サーバ全体に影響する機能としては,「アカウント削除」「ログイン停止」「サイレンス*1」などがあります。これらの機能は,管理者*2だけが利用出来ます。そのため,このような機能を用いて,サーバレベルで対処が必要と考えられる場合にのみ通報をお願いします。つまり,あなたが「苦手な人や発言を見たくない」「自分の信念と合わない」というだけの場合には,通報の必要はありません。

通報した理由を書いてください

上記の要件を満たす場合,通報した理由があるはずです。通報には,そういった「なぜこの発言やユーザを通報したのか」という理由を明記してください。

無言で通報が行われると,それが真に必要な通報なのか,私怨なのか,はたまた操作ミスなのか判断出来ません。更に,そのユーザの詳細や前後のトゥートを確認して通報理由を類推する,という作業も手間がかかりすぎますので,(申し訳無いですが)難しいです。WebUIからは複数のトゥートをまとめて通報することも可能*3ですので,問題のあるトゥートを全て選択したうえで,どういう理由でこのトゥート群を通報したのかを記載してください。

なお,通報理由に長文を書いてくれと言っている訳ではありません。例えば以下の様な記載でも十分と考えられます(これに拘るものではありません)。

  • 明らかに不適切なURL付きの広告トゥート→「spam広告
  • 明らかに機械的かつスパム目的と思われるフォロー→「follow spam
  • 平均的な職場や公共の場での閲覧が不適切な画像へのNSFW未付与→「NSFWなし

今後,はんドンクラブでは,無言の通報の場合,無条件で無視する運用にいたします。申し訳ありませんが,ご協力をお願いします。

*1:対象の人の発言が,全員のLTLに表示されなくなります(HTLには表示されます)。

*2:正確には管理者またはモデレータ。

*3:通報自体は3rdパーティー製クライアントからも可能ですが,複数トゥートをまとめて通報する機能は実装されているクライアントは少ない印象です。ご自身の使っているクライアントの対応状況が分からない場合は,ブラウザからWebUIをご利用ください。

【バージョンアップ】2.9.3にバージョンアップしました

handon.club は v2.9.2 → v2.9.3 へアップデートしました🎉

アップデートの概要

Mastodon 2.9 のメンテナンスリリースがありましたので,アップデートを行いました。

  • githubへリリースされてからアップデート完了まで,2日を要しました
  • アップデートにかかるサービス中断時間は 29 秒でした

前回バージョンからの変更点

v2.9.2からのアップデート内容は以下の通りです。

  • 新機能
    • カスタム絵文字登録時の形式追加(#11519
      • これまでカスタム絵文字を登録する際はかならずpng形式である必要がありましたが,今回からgifおよびwebp形式がサポートされます。はんドンクラブにおいても,カスタム絵文字登録依頼時は,png/gif/webp形式の何れかであれば,受け付けるように変更します。

その他,管理者向け機能の修正やバグ修正,およびセキュリティー関連のアップデートが行われています。その他詳細は,Githubのリリースページ(2.9.3も参照ください。

その他のお知らせ

Mastodon公式リポジトリでは,v3.0リリースへ向けた開発が着々と進んでいるようです。様々な目玉機能がありますが,管理人一押しは「カスタム絵文字のカテゴリ分け機能」です。webpickerにおけるカスタム絵文字が,サーバ管理人の指定したカテゴリ毎に表示可能となります。ユーザにとっては,カスタム絵文字の入力がより簡単になることが期待されます。

前回のアップデート

handon.hatenablog.jp

3rd Party製クライアントの通知機能障害によるMastodonサーバへの遅延発生とソースコード修正内容について

2019年7月11日頃より,3rd Party製のiOS向けMastodonクライアントである「Tootle」において,そのプッシュ通知用サーバの輻輳が発生していました。その結果,はんドンクラブにおいて処理遅延が発生し,TLの配送遅延など複数の問題が発生していました。この記事では,その詳細な原因と影響範囲に加え,せっかくなのでプルリクを送るまでの流れを整理しておこうと思います。

本ブログにおけるご報告が遅くなったことをお詫びいたします。

サマリ

問題1:TLの配送遅延

  • 日時: 2019年7月11日 21:28〜21:52頃
  • 影響範囲: HTLやLTLの表示速度低下(配送遅延は最大1分程度)
  • 原因: Tootleプッシュ通知サーバのレスポンスの大幅な低下による,重要キューの処理遅延
  • 実施した対処:Tootleプッシュ通知サーバへのアクセスを遮断
    • /etc/hosts でTootleプッシュ通知サーバを 0.0.0.0 と解決させることで対応

問題2: Tootleプッシュ通知サーバへのアクセス不可

  • 日時: 2019年7月11日 21:52〜7月14日 23:14頃
  • 影響範囲: Tootleユーザにはんドンクラブからのプッシュ通知を送らない
  • 原因: 上記問題への暫定対処
  • 実施した対処: ソースコードの修正によりプッシュ通知のリトライ回数を削減
    • リトライ回数を26回から5回に削減

今回の障害の原因について

Tootleのプッシュ通知サーバが原因ではんドンクラブ全体が重くなった理由を説明します。

〇原因1: プッシュ通知用サーバの輻輳

そもそもiOSクライアントのPush通知機能は,Tootleも含め,以下の様な通信フローとなっている場合が大半です。

+----------+      +--------+      +--------+      +----------+
| Mastodon | ---> | Client | ---> | Apple  | ---> |   iOS    |
|  Server  | Push | Server | Push | Server | Push | Terminal |
+----------+      +--------+      +--------+      +----------+

図中の「Client Server」が,Tootleが独自に立てているプッシュ通知専用のサーバとなります。今回はこのサーバのレスポンスが極端に悪くなっていました。

〇原因2: MastodonのWebPushの処理方法

とはいえ,本来であれば,関係のないサーバの処理が遅くなったからといって,Mastodonサーバの処理が遅延するのはおかしいはずです。にもかかわらず今回配送遅延が発生した理由は,以下2つの要因が重なっていました。

  • 【要因1】Tootleサーバが即座にエラーを返さなかった(例えば30秒以上かかっていた)
  • 【要因2】エラーが返るまでの間,Mastodonサーバ側が他の処理をできなくなり,結果としてTL配送処理に遅延が発生した

特に【要因2】についてですが,本来Mastodonサーバ側で実装されている並列処理により,他処理に影響はないはずでした。実際はんドンクラブでは,今回のWebPush通知が処理されるDefaultキューは,15個の処理が並列処理できるよう設定されています。しかしながら,このエラーがあまりに多量に発生してしまい,15個の処理が全てTootleサーバ宛の処理で埋まってしまう事象が発生してしまいました。Defaultキューでは,LTL/HTLのへのトゥート配信を担う処理も行われるため,結果としてTL配送遅延になっていました。なお,もちろんTootleサーバが完全に断となっており,即座にエラーを返してくれればこうはならなかったのですが,【要因1】でも記載したとおり即座にエラーが返らなかったため,タイムアウト処理を待つ形となり,こういった事象となりました。

f:id:highemerly:20190716223054p:plain
はんドンクラブにおける各キューの並列処理数

参考までに,mstdn.jpなどの他サーバへのPush(ActivityPub)については,Defaultキュートは別キューになっています。はんドンクラブでは8個の処理が(Defaultキューとは別のスレッドで)並列処理されるようになっています。そのため,はんドンに限っては,大規模サーバがダウンしたからといって,今回に類似する事象は発生しないはずです(初期設定のまま運用しているサーバでは,DefaultキューとPushキューが同じsidekiqプロセスで処理されてることが多いため,発生する可能性が高いです)。

f:id:highemerly:20190716220024p:plain
リトライ待ちの処理数と遅延時間の関係

次に,上図に,リトライ待ちの処理数と遅延時間の時間変化を示します。緑の線で示されているのがリトライ待ちの処理数(左軸)で,青の棒で示されているのがDefaultキューの処理の平均遅延時間(右軸)を表しています。Mastodonでは,様々な処理が失敗したとき,何度か決められた回数分だけリトライを行うことになっています。そのリトライ待ちの処理数が,数時間で一気に増えていることが分かるかと思います(通常運用時は100程度ですが,このときは3000超となっています)。それに伴って,青軸で示される遅延時間が増えており,最大60秒弱の遅延が発生していることが分かります(通常運用時は0.1〜1秒程度です)。先ほどの説明のとおり,このキューにはWebPush通知だけでなく,LTL/HTLへのトゥート配送処理も含まれていますので,WebPush通知もトゥート配送も青の棒で示される同じ時間だけ遅延していることとなります。このようにして配送遅延が発生しました。

今回の対処内容

〇暫定対処

実際には以下の様なエラーが大量に出力されていました(セキュリティ上の理由から,ログは一部をマスクしています)。

WARN: {"context":"Job raised exception","job":{"class":"Web::PushNotificationWorker","args":[XXXXX,XXXXX],"queue":"default","backtrace":true,"jid":"XXXXXXXXXX","created_at":XXXXXXXXX.XXX,"enqueued_at":XXXXXXXXX.XXX,"error_message":"Net::ReadTimeout with #<TCPSocket:(closed)>","error_class":"Net::ReadTimeout","failed_at":XXXXXXXXX.XXX,"retry_count":3,"error_backtrace
WARN: Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>

原因を特定するため,argsにあるWebPushIDを調査したところ,すべてがTootleサーバ宛の通信であることが分かりました。そのため,かなりの強引な処理ですが,以下を /etc/hosts に追加することで対処しました。

0.0.0.0 tootleformastodon.appspot.com

〇本格対処

対処案は以下3つがありました。

  • 【案1】WebPush通知のタイムアウトを短くする
  • 【案2】WebPush通知が処理されるキューをDefaultキューから変更する
  • 【案3】WebPush通知のリトライ回数を減らす

最終的にMastodonの本家ソースコードへ反映させたいと言うことで,既存コードとの整合性も考慮した結果,【案3】を選びました。本当は【案1】が最も良いと思ったのですが,これはおそらくRubyライブラリのデフォルト値で,WebPush通知だけ変更することは難しいのではないかと思いました(注意: 筆者の推測であり,確認はしていません)。更に【案2】については,有効な案ではあったと思うのですが,Mastodonソースコードを大きく変える方式であり,本家Githubへのプルリクを行ってもどうせMergeしてくれないだろうなと判断しました。

【案3】の詳細な内容についてです。WebPush処理のリトライ実装は,リトライ回数を明示的に指定されていませんでした。そのため,sidekiqのデフォルト値である26回になっていたと思われます。今回はそこを5回に変更しました。また,【案3】で本当に効果が得られるかを確認するため,検証環境での試験を行い,確かに効果があることを確認しました。そのうえで,Githubにプルリクを送りました。

github.com

早速マージされたので,結果的に初めてのMastodonへのコントリビュートとなりました😝 たいしたことのないコードですが,大きなプロジェクトにコントリビュートするのは初めてなので,ちょっぴり嬉しいですね。

今回の障害の検知について

違う話題です。

今回の障害は私の想定より検知が遅れました。今回の障害は,私自身がサーバを使っていて,TL表示が遅いと気づいたために調査を行ったために発覚しました。本来であれば,Defaultキューの遅延が長時間閾値を超えた場合,私のLINEにアラートが飛ぶ仕組みになっていましたが,このアラートが発報されず,結果として検知が数分〜数十分遅れてしまいました。もし私が障害発生時刻にTLを見ていなければ,もっと遅くなったのではないかと思います・・・。

原因は詳しくは説明しませんが,本件は再発防止済となりますのでご安心頂ければと思います。簡単に説明すると,他のMetricsが数時間前に警戒域になった際に正常にアラートが発報されておりましたが,ただちに影響はないと判断し無視していたところ,このアラートの発報が継続されていたため,Defaultキュー遅延が発生しても新たなアラートが発報されないようになっていました。

おわりに

まず,念のため申し上げておきますが,Tootleはとても素晴らしいクライアントだと思っています。私も愛用させて頂いています。今回の問題は,Tootleのサーバ実装が悪い訳ではなく,Mastodonサーバの実装が悪いものだと理解しています。とはいえ,パラメータ設定というのはとても難しいものです。今回は実運用の中で,StatsD経由で取得しているMetricsとにらめっこしながらパラメータチューニングを行うことができました。ある程度の規模のサーバでないとできないチューニング方法だと思いますので,はんドンクラブの皆様には感謝しかありませんね。

なお,今回の障害については,はんドンクラブでは既に解消しているものと考えています。引き続き安定運用に努めたいと思います。

【バージョンアップ】2.9.2にバージョンアップしました

handon.club は v2.9.0 → v2.9.2 へアップデートしました🎉

アップデートの概要

Mastodon 2.9 のメンテナンスリリースがありましたので,アップデートを行いました。

  • githubへリリースされてからアップデート完了まで,4日を要しました
  • アップデートにかかるサービス中断時間は 58秒でした

前回バージョンからの変更点

v2.9.0からのアップデート内容は以下の通りです。

  • 新機能
    • オーディオアップロード(#11123
      • .mp3 などの音声ファイルが直接アップロードできるようになりました。ブラウザまたはPWAで再生できます。

その他,管理者向け機能の修正やバグ修正が行われています。その他詳細は,Githubのリリースページ(2.9.12.9.2)も参照ください。

前回のアップデート

handon.hatenablog.jp