使用 AWS RDS/S3 的无状态讨论

您好,我刚刚设置好了一个新的 discourse 安装——感谢您付出的辛勤努力,让这一切如此简单!

理想情况下,我想让我的 discourse 服务器可以被替换,这样,如果例如有人不小心在 EC2 控制台中将其销毁,我也不会丢失任何数据。

内置的备份/恢复功能很棒,我已经对其进行了一些测试运行。我将 app.yml、上传文件和备份存储在 S3 中。

下一步是将数据库迁移到 Amazon RDS,为此有一个很棒的指南 在此处

我的问题是——如果我这样做,理论上我是否可以安全地终止实例,然后在全新的服务器上简单地克隆 discourse,获取我的 app.yml 并运行 ./launcher rebuild app?或者除了 postgres/uploads/app.yml 之外还有其他状态吗?也许在 Redis 中?

提前感谢!

2 个赞

我认为这在很大程度上是正确的。您需要确保不要同时运行两个实例。在构建新容器时,您将迁移数据库,这可能会使另一个容器无法使用(您可以通过 skip_post_deployment_migrations 避免这种情况)。Redis 中的内容被认为是短暂的,不会被备份。我不确定那里的某些内容是如何或是否会被恢复,但您可能并不关心。

2 个赞

@phil22 - 我曾在一个与您提议类似的设置上工作过,它的复杂程度比您想象的要高:

  • Discourse 团队每月发布多个版本,因此当您克隆到新的 ec2 时,您需要保持原始版本。通常情况下,盲目升级应用程序是可以的,但有些版本包含主要的数据库升级(PG 12 → PG 13),如果您不跟踪这一点而忽略升级外部 RDS,您可能会陷入困境。

  • 我们发现让 ec2 使用 EBS 卷(该卷也配置为挂载到您的应用程序容器内)取得了成功。通过这种方式,我们可以存储所有 /shared 文件夹的内容。这样,当您的 ec2 实例出现或消失时,您所有的 /shared 文件夹内容都会持久保存在 EBS 上。此外,有时您会改变关于将文件存储在 s3 中的想法。在这种情况下,有一个替代位置来存储上传的文件(如 /shared 文件夹)是很有益的。

希望这有帮助。

2 个赞

非常感谢 @pfaffman@Poster_Nutbag——非常有帮助!

EBS 听起来是个更好的选择——这意味着我们可以避免偏离 https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md。

根据你们的建议,我认为我将选择 RDS,但将其固定到 discourse_docker 仓库的特定提交。虽然这听起来会使升级更加复杂,但我希望这意味着如果我们遇到服务器问题,我们将在 RDS 上拥有安全的一切,并且能够相当迅速地恢复到相同的工作状态,而无需手动恢复。

(我认为使用 EBS 也可以达到同样的效果,但由于卷加密和在实例之间挂载/卸载卷的 Unix 魔术,我对自动执行此过程感到有些害怕)