如何在细粒度单元级别管理 Juju 中的服务关系?

如何在细粒度单元级别管理 Juju 中的服务关系?

我的服务方案:数据库服务器<->应用服务器<-> Web 反向代理。

我的关系要求是:

  • 1 个 DB 服务器相关 1 个(特定)应用服务器
  • 与所有应用服务器相关的 1 个 Web 反向代理单元

下面给出了一系列 Juju 命令,这些命令将在我的案例中发生。

预期步骤是(如果我错了请纠正我):

阶段 - 安装

  1. 部署数据库
  2. 部署应用服务器
  3. 部署 Web 反向代理
  4. 将关系应用服务器添加到数据库
  5. 将 Web 反向代理添加到应用服务器

阶段 - 扩展

  1. 添加单位 Db
  2. 添加单元应用服务器(问题步骤):哦不!我不需要基于 charm 元数据中的 Provides/Required 设置的自动行为。我想在这里以单元级别指定应用服务器与数据库的关系。

理想情况下,我希望 relationship-xxx 钩子只在 Db 的新单元上触发。可能存在类似于为部署

考虑到目前的特点,我对解决方法的想法如下:

  • 一种方法是在回调中有条件地执行。检查是否已经与远程单元相关,并忽略传入的关系添加/更改回调。会很乱。重新启动服务时可能会出现错误,因为每个数据库应用程序单元对的启动顺序必须小心管理,否则错误的应用程序服务将与错误的数据库服务通信。我已经使用 Juju 作为后端服务,并使用 python 脚本管理 juju cli。
  • 另一种方法是,我有一个特定代码,该代码对于应用服务器/数据库对是通用的。与部署后阶段的 set 命令非常相似,我可以使用它来设置添加单元后特定服务实例的值吗?

  • 另一个选择是具有容器范围的从属服务 - 但我希望 Db 作为单独的机器实例而不是应用服务器机器实例。

至于 Web 代理,我希望钩子能够被触发,这样代理就可以将新的应用服务器添加为后端。当前的 Juju 行为是理想的。

我期待找到最佳的解决方法。提前致谢。

答案1

在我看来,您希望将两个应用服务器唯一地绑定到唯一的数据库服务器。这意味着它们实际上是两个独立的服务。那么这可能有意义:

juju deploy mysql app1-db
juju deploy app app1
juju deploy mysql app2-db
juju deploy app app2
juju add-relation app1-db app1
juju add-relation app2-db app2

这将使 app1 和 app2 都独立(即使它们具有相同的 charm),我认为这就是您想要的。如果您希望它们都从同一个 haproxy 进行负载平衡:

juju deploy haproxy app-reverse-proxy
juju add-relation app1 app-reverse-proxy
juju add-relation app2 app-reverse-proxy

请注意,旧版本的 haproxy 无法处理这个问题(在 charm 修订版 23 之前)。

以下是跟踪此修复的错误:

https://bugs.launchpad.net/charms/+source/haproxy/+bug/1029078

相关内容