项目与 Git

使用应用节点实现高可用性

如何在多台服务器上运行同一个生产 Odoo 数据库,由一个运行数据库的主项目和为其提供服务的应用节点组成。

工作原理

高可用性让同一个 Odoo 数据库的生产环境同时运行在多台服务器上。如果某台服务器停止响应,访问者会被转到其他服务器。

集群由运行相同代码的项目组成:

  • 主节点:一个项目,其生产实例同时运行 Odoo 和数据库。它的数据库只向应用节点开放,不向其他任何人开放。
  • 应用节点:其他项目,每个位于不同的生产服务器上,其生产实例只运行 Odoo,并使用主节点的数据库。

访问者使用主节点的地址。CICDoo 会将该地址指向主节点以及每个正在响应的应用节点,并每隔几分钟检查一次每个节点。停止响应的节点会从该地址中移除,直到它恢复。

数据库本身仍然只运行在一台服务器上,即主节点的服务器。应用节点让 Odoo 这一层具备冗余;如果主节点的服务器宕机,站点也会随之宕机。

开始之前

  • 相同的代码:集群中的每个项目都必须使用相同的仓库、默认分支、Odoo 版本和版本类型。如果开启了 Time Machine,固定的提交也必须一致。
  • 不同的服务器:每个应用节点都必须有自己的生产服务器,与主节点以及其他节点的服务器都不同。
  • Cloudflare 代理:目前,在节点之间分配流量仅适用于启用了 Cloudflare 代理的服务器。请使用同一地区的服务器,因为应用节点提供的每个页面都要与主节点的数据库通信。
  • 共享文件存储:集群中的每台服务器都必须挂载同一个共享存储,用作 Odoo 文件存储。否则,通过一个节点上传的附件在其他节点上会缺失,落到另一个节点上的访问者也会被登出。如需帮助设置,请联系支持。
  • 数据库连接:每个应用节点都会向主节点的数据库打开自己的连接。随着节点增加,请在主节点生产实例控制台的 设置 标签页中,于 PostgreSQL 配置 里提高 max_connections。

高可用性设置位于 项目设置 的 高级 标签页中的 高可用性 卡片里。您需要有更改项目设置的权限。

设置主节点

打开将要运行数据库的项目,进入 项目设置 > 高级,在 高可用性 中将 角色 设为 主节点(应用 + 数据库)。点击 应用 并确认。

生产实例会重启。重启完成后,它的数据库会接受来自集群应用节点的连接。除非您的服务器共享一个私有网络,否则服务器之间的连接是加密的。

生产实例必须使用它自带的数据库。生产实例指向外部数据库的项目不能成为主节点。

添加应用节点

像平常一样为该节点创建一个项目:相同的仓库和默认分支,相同的版本和版本类型,以及一台属于它自己的生产服务器。删除它拥有的所有预发布和开发实例:应用节点只运行生产环境,预发布和开发分支都放在主项目上。

然后打开该节点的 项目设置 > 高级,将 角色 设为 应用节点(使用主节点的数据库),在 数据库来源 中选择主节点,点击 应用 并确认。只有同一工作区中运行相同代码的主节点才会出现在选项中。

节点不会立即启动。主节点的服务器需要先允许它接入,这会在下一次检查时发生,通常在五分钟内。在此之前,卡片会显示 "正在等待主节点允许此节点",一旦获准,节点会自动启动。它开始响应几分钟后,就会开始接收访问者。

在主节点上,高可用性 卡片会列出它的应用节点,以及数据库服务器是否已应用当前的访问列表。

应用节点上有哪些变化

  • 它的生产实例没有自己的数据库。它的数据库设置由 CICDoo 管理,无法在实例的 Odoo 配置中更改。
  • 计划任务(Odoo 定时任务)只在主节点上运行。
  • 备份在主节点上进行。请从主项目备份和恢复集群的数据库。
  • 推送到应用节点的分支本身不会产生任何效果。集群是从主节点更新的。

部署更新

像往常一样推送到主节点的分支。CICDoo 随后会按顺序更新整个集群:

  1. 停止每个应用节点。
  2. 在没有其他服务器使用数据库的情况下更新主节点,包括任何模块升级。
  3. 使用新代码重新启动每个应用节点。

您可以在每个步骤所在实例的 队列 标签页中跟踪该步骤。如果主节点的更新失败,应用节点不会被重新启动,它们的队列条目会说明原因。修复问题后再次部署。

由于模块升级需要独占数据库,主节点更新期间站点不可用,这与单个实例的情况相同。

离开集群

要移除一个应用节点,请将它的 角色 改回 独立(自有数据库) 并点击 应用。它的生产实例会停止,因为它自己的数据库中没有集群的数据。请先将备份恢复到其中,再重新启动它。

主节点在仍有应用节点时无法更改。请先移除这些节点。

故障排查

  • 节点一直在等待获准:检查主节点的生产实例是否正在运行,以及它的服务器是否在线。主节点在成为主节点后必须重启一次,之后才会允许任何节点接入。
  • 节点启动了但 Odoo 没有起来:打开节点的日志。如果有消息说主节点的数据库尚未初始化,说明主节点还没有完成首次启动。
  • 上传的文件或登录状态在节点之间不能跟随访问者:服务器没有共享文件存储。请参阅上文的 "开始之前"。

有关实例如何对应分支,请参阅 分支与实例;有关服务器级别的负载均衡器设置(这是另一项功能),请参阅 使用负载均衡器。

仍未解决?在应用中提交工单,或与工程师沟通。