我的服务方案:数据库服务器<->应用服务器<-> Web 反向代理。
我的关系要求是:
- 1 个 DB 服务器相关 1 个(特定)应用服务器
- 与所有应用服务器相关的 1 个 Web 反向代理单元
下面给出了一系列 Juju 命令,这些命令将在我的案例中发生。
预期步骤是(如果我错了请纠正我):
阶段 - 安装
- 部署数据库
- 部署应用服务器
- 部署 Web 反向代理
- 将关系应用服务器添加到数据库
- 将 Web 反向代理添加到应用服务器
阶段 - 扩展
- 添加单位 Db
- 添加单元应用服务器(问题步骤):哦不!我不需要基于 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