Postgres 问题……又来了!

您好,我在停止并重新启动 Discourse 时遇到了两个大问题。

第一个问题
在我执行 2 到 3 次停止操作后(无论是使用 ./launcher stop 还是通过 Portainer 停止),容器拒绝再次启动,持续卡在 “rm: cannot remove ‘/shared/nginx.http.sock’: Is a directory” 错误上。(我刚刚注意到该 socket 文件并不在 “shared” 目录下,而是在 “shared/standalone” 中,这是否只是错误消息的笔误?
出于某种我尚不清楚的原因,这个 socket 文件在停止后似乎变成了一个目录,而模板无法删除它,因为它试图删除的是目录而非 socket。手动删除它没有任何作用,它每次都会重新出现。

第二个问题
运行 ./launcher rebuild app 时,它在 “FATAL: the database system is starting up” 处卡住,此前出现了第一个错误 “PANIC could not locate a valid checkpoint record”。我已经阅读并尝试了所有关于此问题的解决方案,但我找到的唯一有效“解决方法”是删除 discourse 目录及其内部所有内容,然后重新设置所有配置……这显然不是一个真正的解决方案!

看起来有时停止 Discourse 容器会导致数据库处于不良状态,由于“正在启动”而无法继续,可能是在尝试修复某些问题。但我尚未找到如何解决这个问题,该问题似乎在某些停止和重启操作后出现。

有什么线索吗?有没有办法让 Postgres 自行修复这些问题?

不,这不是错误。该文件位于挂载到容器中的卷内,因此根据视角不同(即容器内与容器外),其路径会有所不同。

当容器未正确停止时会出现此情况。PostgreSQL 需要一些时间才能正常关闭,而当我们使用启动器命令停止时,会执行此操作。然而,如果您的实例规模足够大,或者存在过多的运行中事务,数据库可能无法在接收到的截止时间前正常停止。

但我发现 “nginx.http.sock” 文件也在宿主机的 “shared/standalone” 目录下被创建了。起初它显示为粉色(表示套接字),但过了一段时间(也许是在停止后),它变成了蓝色(表示目录),导致容器拒绝启动,卡在尝试删除一个已变成目录的套接字上。

那么,我们该如何解决呢?到目前为止,我只是在实验,但如果我上线运行,有数百人连接且数十万篇帖子,我会因为 PostgreSQL 无法处理突然中断而失去一切吗?这将需要采取措施来修复损坏的数据库。Discourse 能否运行在外部 PostgreSQL 上?这样如果 Discourse 容器无法启动,我们可以自行管理。简而言之,在出现“恐慌(PANIC)”或“致命错误(FATAL)”的情况下,应该有一些修复方案……

实际上,我正在尝试通过设置“容器化”的 Postgres 并将其附加到 Discourse 来解决该问题(供将来参考),希望这样在停止 Discourse 时不会损坏数据库(或者至少能够在 Discourse 停机的情况下进行一些维护操作)。