更新大约需要20分钟,进度更新在 multisite:migrate 步骤暂时中断

我刚为我们的 Discourse 站点进行了每周更新,发现这次花费了大约 20 分钟,而不是通常的 1-2 分钟。此外,在 Chrome 控制台中,进度更新在 $ SKIP_POST_DEPLOYMENT_MIGRATIONS=1 bundle exec rake multisite:migrate 步骤时因超时错误而暂时中断(截图如下)。

我可以在服务器上看到正在发生一些事情(postmaster 和 ruby 的负载),并且进度更新最终恢复了,但总体而言,当前迁移似乎存在问题。

从更新日志来看,导致运行时间过长的迁移似乎是 DropTrgmIndexesOnUsers。我已将日志的相应部分直接包含在此帖子下方(如果需要进一步分析,完整日志将作为文本文件附加)。

********************************************************
*** Please be patient, next steps might take a while ***
********************************************************
...
$ LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all
discourse-bbcode is already at latest compatible version
discourse-data-explorer is already at latest compatible version
docker_manager is already at latest compatible version
$ SKIP_POST_DEPLOYMENT_MIGRATIONS=1 bundle exec rake multisite:migrate
Multisite migrator is running using 1 threads

Migrating default
== 20240912061702 DropUserSearchSimilarResultsSiteSetting: migrating ==========
-- execute("DELETE FROM site_settings WHERE name = 'user_search_similar_results';\n")
   -> 0.0006s
== 20240912061702 DropUserSearchSimilarResultsSiteSetting: migrated (0.0015s) =

== 20240912061806 DropTrgmIndexesOnUsers: migrating ===========================
-- execute("DROP INDEX IF EXISTS index_users_on_username_lower_trgm;\nDROP INDEX IF EXISTS index_users_on_name_trgm;\n")
   -> 1290.7163s
== 20240912061806 DropTrgmIndexesOnUsers: migrated (1290.7169s) ===============

== 20240912212253 IncreaseExternalAvatarUrlLimitTo2000: migrating =============
-- change_column(:single_sign_on_records, :external_avatar_url, :string, {:limit=>2000})
   -> 0.0011s
== 20240912212253 IncreaseExternalAvatarUrlLimitTo2000: migrated (0.0017s) ====

Seeding default
*** Bundling assets. This will take a while *** 
$ bundle exec rake themes:update assets:precompile
Building
Environment: production
building...
...

完整日志:upgrade-log-2024-09-15.txt (124.7 KB)

我现在不确定我们还能做什么。

我们需要删除索引,如果您的论坛当时非常繁忙,可能需要一段时间。

假设现在一切都好?

是的,现在一切都恢复正常了,所以没有迫在眉睫的问题。

我在这里报告的主要原因是进度指示器暂时损坏了,这可能会让人认为更新已崩溃(不确定能做什么)。

但事实并非如此。该服务器是一个测试服务器(我们需要做很多准备工作),我通常在午夜后运行更新,所以我想我可能是唯一的用户。

所以之后我脑海中浮现的另一个问题是:像我们这样规模的社区(约 6k 用户,约 2.5M 帖子)的 Discourse 是否确实需要 SSD?因为目前的服务器还不错(AMD Ryzen 5 3600,64GB RAM),但它使用的是传统的旋转硬盘,如果这是一个问题,我们需要在上线前更换为带有 SSD 的服务器。

在只有 6k 用户的服务器上删除该索引应该只需要几毫秒,即使是在旋转的物理磁盘上;这强烈表明您的数据库资源不足。

好的,谢谢!我之前不知道还需要进行数据库调优(我们使用的是单容器设置),而且机器上没有运行太多其他东西(Discourse、Mailcow、Traefik、Crowdsec)。但我会仔细看看。

在这方面有什么相关的文档可以参考吗?我现在唯一知道的是 https://meta.discourse.org/t/configure-discourse-docker-on-servers-with-more-ram-and-cpu/18569,而且我们的 db_shared_buffers 已经是 4096MB 了。

我怀疑这是因为我们没有并发删除索引。

普通的 DROP INDEX 会获取表上的 ACCESS EXCLUSIVE 锁,阻止其他访问,直到索引删除完成。

这应该在 PERF: Update migration to drop index concurrently. by tgxworld · Pull Request #28955 · discourse/discourse · GitHub 中修复。

@schneeland 感谢您花时间报告此问题 :+1:

2 个赞