Postgres 升级:空间极其有限

论坛上的文档化流程列出了两种升级 PostgreSQL 的方法。

  1. 让 Discourse 自动处理。这需要 3 倍 的磁盘空间。因此,如果您的数据库为 100GB,则需要额外 200GB 的 空闲 空间才能完成升级。显然,这对拥有大型安装的用户来说是个大问题。
  2. 遵循他们的“手动更新”流程。这需要 2 倍 的磁盘空间,因此如果您的数据库为 100GB,则需要额外 100GB 的空闲空间。这对某些用户来说也是个不小的问题。

这篇帖子中,@Falco 建议使用 --link 选项,通过硬链接就地执行升级。他们建议使用的 Docker 容器 支持该参数,但 Discourse 开发者在该帖子中并未推荐使用它。

所以我的问题是,是否应该将第 3 种方案列为:

  1. 运行以下命令,这仅需 极少 的额外磁盘空间。因此,如果您的数据库为 100GB,可能只需要额外 10GB 左右的空间?如果是这样,这是否是 Discourse 开发者推荐的流程?是否有人实际尝试过并成功完成?

的就地升级命令:

docker run --rm \
	-v DIR:/var/discourse/shared/standalone/postgres_data:/var/lib/postgresql \
	tianon/postgres-upgrade:12-to-13 \
	--link

 

的升级到新目录的命令(需要双倍空间)相比:

docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/12/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/13/data \
	tianon/postgres-upgrade:12-to-13

附注:我本可以直接回复那条 PG13 升级主题的帖子,但该主题会在 7 天后删除帖子。为什么配置成这样?我知道当初这个话题刚出现时有很多讨论,本可作为有用的参考。

1 个赞

如果他们做过,他们并没有在这里提及。这里的指导说明大多力求尽可能万无一失,并尽可能减少系统管理知识的需求。这里的大多数人更愿意采用最安全、经过最充分测试的方法,而不是某种旨在节省极少成本的方法。

如果这对你有效,你可以相应地更新 PostgreSQL 13 升级。但在你这样做之前,你是否有信心向一个连 bash 是什么都不知道的人推荐这种方式?你确定这不会搞砸他们的数据库,导致他们的网站永远无法恢复吗?

这样做的初衷是,如果有其他有价值的信息出现,应将其添加到原始帖子(OP)中,而不是要求人们去翻阅可能毫无用处或已过时的、长达数年的帖子记录。

1 个赞

不,我不确定。我对 PostgreSQL 不太熟悉,希望 Discourse 的开发者能确认这是否可行。

即使它确实可行,我也不建议将其作为默认的升级流程,因为旧方法会保留一份独立的数据库副本以便回滚。不过,如果可行,它将成为存储空间受限环境下的一个绝佳选择。

另一种简单的方法是启动新服务器,迁移数据,然后关闭旧服务器。如果必须使用旧服务器,请在临时服务器上执行升级,然后在原始服务器上进行全新安装(该服务器可能还需要操作系统升级),最后再将服务迁回。

这种方法安全、简单且文档齐全,已有数百人成功采用。

是的,但这需要一两天时间。在此期间,我们要么a) 告知用户此期间的帖子将会丢失,要么b) 将论坛设为只读。这两种方案都不是最佳选择。

1 个赞

我认为服务器停机时间不会比重建期间长太多。如果你迁移到新服务器并一直使用它,可以在迁移过程中将旧服务器设置为只读模式。如果担心停机时间,迁移到新服务器会好得多,好得多。

1 个赞

我们的论坛规模相当大,但我从未尝试过恢复备份,所以不确定需要多长时间。如果这样做,我们确实会留在新主机上。如果可能的话,我希望避免这种情况,因为这会带来额外的工作和麻烦。

1 个赞

没错,正如我最初在这里建议的那样:Discourse on postgres 12 breaks upgrades - #8 by merefield

我干脆直接硬着头皮上吧?

1 个赞

我在这里发布的所有帖子,都是为了不断尝试避免那样做。

@Wingtip,你升级过这个吗?

1 个赞

解决空间有限的升级问题的另一种方法是进行备份,删除(rm - r)postgres目录,重新构建,然后恢复备份。我上周在一个站点上这样操作过。

2 个赞

备份占用的空间几乎和复制数据目录一样多(甚至更多,因为它还需要压缩)?

1 个赞

不,从未成功升级。删除数据库并恢复备份听起来风险很大。我们基本上需要就地升级才能奏效。

我们目前运行的是 Ubuntu 18.04,它将在 2023 年停止支持,所以我想届时我们别无选择,只能迁移到新主机,并计划在那时下定决心,构建一台运行 22.04 LTS 的新主机,并从备份恢复。

嗯。可能是白费力气。我认为使用备份模型,其中一个副本被压缩了,这可能会产生影响?我进行操作的网站在 S3 上有备份。而且它是一个测试网站,所以如果出现问题,风险很低。

除了备份的使用频率比就地升级高得多,使用场景也多得多。我认为它安全得多。

1 个赞

也许可以,但我对 PostgreSQL 的专业知识不多,做起来不放心。不过,从备份中恢复整个站点到一个完全不同的虚拟机,我倒是很在行,但这会意味着丢失几个小时的帖子,直到恢复完成,所以我对此也不是特别热衷。但由于 18.04 即将被停止支持,明年我将别无选择。

1 个赞

除非你的数据库有几十GB,否则不会花费数小时。而且你在备份和恢复之前会把论坛设为只读模式,所以你不会丢失任何帖子。这并不难做到,几乎没有停机时间,只有只读时间。

root@forum-app:/shared/postgres_data# du -sh
97G     .

我不会将其设为只读,而是会发布一个横幅,告知人们他们今天的帖子是短暂的。在我看来,最好让他们就此聊天,即使那些帖子会丢失。

1 个赞

届时,您还将可以使用内置的 Discourse 聊天功能,该功能将在 2.9 版本中发布(可能默认关闭,但处于测试阶段并支持使用)。

3 个赞