2.6.0b2 アップグレードが非常に遅い

参考までに-- プライムタイムにこのアップグレードを試さないでください。

2.6.0b2 のアップグレードは通常数分で完了するはずが、サーバー上で 40 分以上も実行されています。通常は戻って確認する頃には終わっているものです。壊れたのではないかと心配しましたが、PostgreSQL にログインして確認すると、巨大な更新処理が実行されているのが見えました。どうやらプライベートメッセージの投稿検索データを変更しているようです。

壊れていないことを願っています。いずれわかりますね。本当にこの処理を強制終了したり、アップグレード中にコンテナを再起動したくありません。

実行中のクエリ:

postgres=# SELECT pid, age(clock_timestamp(), query_start), usename, query 
FROM pg_stat_activity 
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' 
ORDER BY query_start desc;
  pid  |       age       |  usename  |                                            query                          
                   
-------+-----------------+-----------+---------------------------------------------------------------------------
-------------------
   698 |                 |           | 
   701 |                 | postgres  | 
   699 |                 |           | 
   697 |                 |           | 
   696 |                 |           | 
 14572 | 00:10:31.484201 | discourse | UPDATE post_search_data                                                   
                  +
       |                 |           | SET private_message = X.private_message                                   
                  +
       |                 |           | FROM                                                                      
                  +
       |                 |           | (                                                                         
                  +
       |                 |           |   SELECT post_id,                                                         
                  +
       |                 |           |     CASE WHEN t.archetype = 'private_message' THEN TRUE ELSE FALSE END pri
vate_message      +
       |                 |           |   FROM posts p                                                            
                  +
       |                 |           |   JOIN post_search_data pd ON pd.post_id = p.id                           
                  +
       |                 |           |   JOIN topics t ON t.id = p.topic_id                                      
                  +
       |                 |           |   WHERE pd.private_message IS NULL OR                                     
                  +
       |                 |           |     pd.private_message <> CASE WHEN t.archetype = 'private_message' THEN T
RUE ELSE FALSE END+
       |                 |           |   LIMIT 3000000                                                           
                  +
       |                 |           | ) X                                                                       
                  +
       |                 |           | WHERE X.post_id = post_search_data.post_id                                
                  +
       |                 |           | 
 14573 | 00:47:02.814489 | discourse | SELECT pg_try_advisory_lock(2859260972035668690)
(7 rows)
「いいね!」 8

アップグレードが正常に完了したのは、私のパニックが頂点に達した直後でした。いい時でしたね、本当にいい時でした。

「いいね!」 4

私の環境でも、高速な共同設置ハードウェア上でのアップグレードは非常に遅かったです。なぜかは完全にわかりませんが、確実に認識しておくべき点です。

「いいね!」 4

はい、チェンジログに「今回のアップデートは通常よりも大幅に時間がかかる見込みです。強制終了や過剰な操作は避けてください。これは想定される動作です」という注意書きを入れることをお勧めします。

「いいね!」 2

@Wingtip フォーラムの投稿数を確認してもよろしいでしょうか?残念ながら、投稿数の多いサイトでは処理に時間がかかる可能性があります。

「いいね!」 4

はい、500 万以上あります。

「いいね!」 1

私のローカルサイトには投稿数がそれほど多くありませんでしたが、それでもかなり遅かったです。40分も遅かったわけではありませんが、以前のアップグレードに比べて3〜4倍ほど、明らかに遅かったです。

「いいね!」 2

参考までに:

再構築し、現在 2.6.0.beta2 (2aa1482421) を実行しています。

ビルドプロセスは、当社のサーバーで目に見えるほど遅くなりませんでした。

「いいね!」 2

@Wingtip さん、ありがとうございます。私たちだけの問題だと思っていたのですが!

実は、あなたが言及されているクエリで処理が停止していると思い、再構築をキャンセルしてアプリを再起動する必要がありました。投稿数は 600 万件あり、約 45 分経っても完了しなかったので、再構築には少なくとも 1 時間かかることを想定し、事前にユーザーに通知する必要がありますね。

「いいね!」 3

リリースノートに、Docker Manager の拡張および/または SSH 経由での再構築にかかる時間に関する注記が追加されました。

「いいね!」 4

ストップウォッチで計測し、2.6.0b1 から b2 への再構築(約 100 万件の投稿があるサイトのみ)をテストしました。開始から完了まで 170 秒かかりました。

これは今日 2 回目の再構築で、b1 から b2 への移行ですが、非常に順調で、ビルド速度に目立った変化はありませんでした。

注:コマンドラインから常にアップグレードしており、UI は使用していません。

「いいね!」 5

私も Docker Manager は使わず、コマンドラインから再ビルドすることを好みます。何か問題が起きた際、ログを確認する方がこの方が良いでしょう。また、より高速だと考えています。

「いいね!」 3

はい、投稿数の多いフォーラムで主に問題が起きているようです。

「いいね!」 1

私は(愚かにも)Webコンソール経由でアップグレードしてしまったため、常に最新のログを持っていませんでした。次は同じ間違いはしません。

「いいね!」 2

以前、ブートストラップが繰り返し失敗する大規模なサイトを持っていました。これは2コンテナ構成のインストールだったため、ブートストラップ中のマイグレーション時に古いコンテナが引き続き稼働していました。最終的に、ブートストラップ時に SKIP_POST_DEPLOYMENT_MIGRATIONS=1 を有効にし、新しいコンテナが起動した後にマイグレーションを実行することで問題を解決しました。ENV セクションに SKIP_POST_DEPLOYMENT_MIGRATIONS=1 を設定すると、マイグレーションが非常に高速になり、サイトはマイグレーション実行中(おそらく若干遅くなるかもしれませんが)も正常に機能できるようになりました。このマイグレーションには20分以上かかったと思います。

まだテストはしていませんが、同じ手法を使えば、シングルコンテナインストールでもダウンタイムを最小限に抑えられるのではないかと考えています。もし私の推測が正しければ、以下の手順を実行することになります。

  • app.ymlSKIP_POST_DEPLOYMENT_MIGRATIONS=1 を追加する
  • ./launcher rebuild app を実行する
  • ./launcher enter app を実行する
  • SKIP_POST_DEPLOYMENT_MIGRATIONS=0rake db:migrate を実行する
  • app.yml の編集を元に戻す(ただし、アップグレードのたびに手動でマイグレーションを実行することを忘れないつもりであれば、この手順は不要です)
  • 念のため、再度ビルドして問題がないか確認する。そうしないと、4ヶ月後に再度試した際に何が原因だったのか全く分からなくなり、誰にも問題の原因を特定するのが難しくなる可能性があります

もし ./launcherapp.yml の編集を必要とせずに SKIP_POST_DEPLOYMENT_MIGRATIONS=1 を自動的に渡せる仕組みがあれば、編集が苦手な人にとって作業がもっと楽になると思います。

もし私が考えているようにこの作業を進めることができれば、発見した内容を新しいトピックとして報告する予定です。ただ、現在は煙の影響で大きなモニターがない部屋に隔離されています。(パンデミックだけでは足りなかったのでしょうか?さらに煙までするなんて。しかも私は火災現場から特に近いわけではありませんが。)

「いいね!」 7

いいアイデアですね。それを実装しました:

https://github.com/discourse/discourse_docker/pull/481

「いいね!」 10

それは素晴らしいニュースですね!(今日は他の2つのプロジェクトが邪魔をして、どうやら私のマルチサイトインスタンスがS3とうまく連携しなくなっているようです。:crying_cat_face:)どうもありがとうございます。

「いいね!」 3

アップグレード後のデータベース変更がデフォルトでブロッキングになるのには技術的な理由がありますか?その動作を変更して、今後のアップグレードでサイトを迅速に復旧させ、その後にバックグラウンドでアップグレード後の処理を実行することは可能でしょうか?

私の考えでは、アップグレードされたアプリケーションの機能に不可欠なもの(DDL など)は、アップグレード後のスクリプトではなく、アップグレード自体の一部であるべきです。

「いいね!」 2

7時間前にコマンドラインから再構築を開始しましたが、まだ続いています…以下にその様子があります:

何かアイデアはありますか?

追記:その間に、ユーザーのためにサイトを再び利用可能にするため、プロセスを停止しました。しかし、この更新をより良い方法で行うべきはずです。

「いいね!」 3

大規模なデータベースをお持ちですか?

「いいね!」 1