如何让控制器高可用
为确保已部署应用程序的高可用性 (HA),控制器本身必须具有高可用性。这需要创建额外的控制器,所有这些都自然地驻留在“控制器”模型中。初始控制器被称为主控制器,如果它失去与集群对等点的连接,则会发生自动故障转移。
有关应用程序方面的信息,请参阅应用程序高可用性。
本页涵盖以下主题:
- 概述
- 启用控制器 HA
- 从集群中移除机器
- 将机器添加到集群
- 查看扩展控制器 HA 信息
- 从控制器故障中恢复
- 控制器 HA 和日志记录
概述
控制器 HA 使用该juju enable-ha
命令进行管理。它通过确保集群具有所需数量的控制器来做到这一点。默认情况下,这个数字是 3,但-n
可以使用开关来改变它。因此,此命令用于启用 HA 以及补偿任何丢失的控制器,例如启用 HA 然后删除一个或多个控制器的情况。
供应控制器时,API 服务器代码与 MongoDB 数据库一起安装。
控制器的数量必须是奇数,以便主节点在其对等节点中“投票”。具有偶数个成员的集群将导致随机成员变为非活动状态。后一个系统将成为“热备用”,并在其他成员出现故障时自动变为活动状态。此外,由于 HA 上下文中基础数据库的限制,该数量不能超过七个。这意味着一个集群只能有三个、五个或七个活动成员。
Juju 客户端和代理与集群中的任何控制器通信。这意味着控制器 (API) 级别的处理是分布式的。但是,在任何给定时间只有一个主数据库,所有控制器都写入它。因此,“master”实际上是指底层数据库。
启用控制器 HA
要启用控制器 HA,只需调用以下enable-ha
命令:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju enable-ha
</code></span></span>
由于未请求特定数量的集群机器,因此使用默认值 3。因此,我们预计会出现两个新的控制器。实际上,上述命令的输出反映了这一点:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">maintaining machines: <span style="color:#77216f">0</span>
adding machines: <span style="color:#77216f">1</span>, <span style="color:#77216f">2</span>
</code></span></span>
我们还可以在“控制器”模型中查询机器:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju machines -m controller
</code></span></span>
输出应显示正在配置的两台新机器:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Machine State DNS Inst <span style="color:#c7162b">id</span> Series AZ Message
<span style="color:#77216f">0</span> started <span style="color:#77216f">54.166</span>.164.0 i-04790c2414e4c8e80 xenial us-east-1a running
<span style="color:#77216f">1</span> pending <span style="color:#77216f">54.145</span>.192.13 i-071660e9ce3c3cee5 xenial us-east-1c running
<span style="color:#77216f">2</span> pending <span style="color:#77216f">54.80</span>.176.66 i-0b36284d1ebb816cf xenial us-east-1a running
</code></span></span>
juju enable-ha
再次调用将无效,因为三个控制器已经存在。
刷新控制器列表juju controllers --refresh
显示 HA 级别为 3:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Controller Model User Access Cloud/Region Models Machines HA Version
aws-ha* default admin superuser aws/us-east-1 <span style="color:#77216f">2</span> <span style="color:#77216f">3</span> <span style="color:#77216f">3</span> <span style="color:#77216f">2.4</span>-beta2
</code></span></span>
从集群中移除机器
可以随时从集群中删除机器。这样做的典型原因是:
- 控制器行为不端,您的意图是用另一个控制器替换它。
- 您已决定不需要您当前的 HA 级别并希望降低它。
- 如果移除控制器将导致系统数量为偶数,则其中一个将充当“热备用”。
- 如果移除控制器会导致系统数量为奇数,那么每个系统都将积极参与集群。
控制器通过从模型中移除其机器(juju remove-machine
)从集群中移除。
使用上一节中的示例,我们将删除机器“1”:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju remove-machine -m controller <span style="color:#77216f">1</span>
</code></span></span>
juju controllers --refresh
现在的输出变为:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Controller Model User Access Cloud/Region Models Machines HA Version
aws-ha* default admin superuser aws/us-east-1 <span style="color:#77216f">2</span> <span style="color:#77216f">2</span> <span style="color:#77216f">1</span>/2 <span style="color:#77216f">2.4</span>-beta2
</code></span></span>
现在这个集群中只有一个活动控制器(和一个备用控制器)(即两个中的一个是活动的)。请注意,这种情况应尽快纠正。
该enable-ha
命令不能用于从集群中删除机器。
将机器添加到集群
使用该enable-ha
命令来实现所需的控制器数量(即 HA 级别)。
在我们正在进行的示例中,我们原来的 3 成员集群现在有两台机器。我们可以通过juju enable-ha
再次发布将其恢复为三个,但如果我们决定将其设为 5 成员集群,我们将执行以下操作:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju enable-ha -n <span style="color:#77216f">5</span>
</code></span></span>
这将导致生成三个控制器 (2 + 3 = 5)。
juju controllers --refresh
现在的输出变为:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Controller Model User Access Cloud/Region Models Machines HA Version
aws-ha* default admin superuser aws/us-east-1 <span style="color:#77216f">2</span> <span style="color:#77216f">5</span> <span style="color:#77216f">5</span> <span style="color:#77216f">2.4</span>-beta2
</code></span></span>
查看扩展控制器 HA 信息
有关控制器 HA 的扩展信息可以从以下show-controller
命令获得:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju show-controller
</code></span></span>
此处列出了我们的 5 成员集群的部分输出:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash"> <span style="color:#111111">..</span>.
<span style="color:#111111">..</span>.
controller-machines:
<span style="color:#0e811f">"0"</span><span style="color:#c7162b">:</span>
instance-id: i-04790c2414e4c8e80
ha-status: ha-enabled
<span style="color:#0e811f">"2"</span><span style="color:#c7162b">:</span>
instance-id: i-0b36284d1ebb816cf
ha-status: ha-enabled
<span style="color:#0e811f">"3"</span><span style="color:#c7162b">:</span>
instance-id: i-09ff42ba5fb9429b0
ha-status: ha-enabled
<span style="color:#0e811f">"4"</span><span style="color:#c7162b">:</span>
instance-id: i-098222dad56cbe9a0
ha-status: ha-enabled
<span style="color:#0e811f">"5"</span><span style="color:#c7162b">:</span>
instance-id: i-0613fb1fa8346de8a
ha-status: ha-enabled
models:
controller:
uuid: e8c4d910-8818-4a8a-8839-25766a1875d3
machine-count: <span style="color:#77216f">5</span>
core-count: <span style="color:#77216f">5</span>
<span style="color:#111111">..</span>.
<span style="color:#111111">..</span>.
</code></span></span>
这里,machine-count
是模型“控制器”中的机器总数,是core-count
控制器机器的数量。ha-status
如果成员处于活动状态,则该键显示“ha-enabled”,如果处于热备用模式,则显示“ha-pending”。
从控制器故障中恢复
在失败的控制器出现时,新的控制器不会自动重新生成,也不会删除失败的控制器。但是,只要超过一半的原始集群成员数量保持可用,手动恢复就很简单:
- 从集群中移除机器
- 将机器添加到集群
必须在添加新控制器之前删除控制器,因为该enable-ha
命令不会检查故障。它只是确保存在成员总数。
在工作控制器数量不足的不幸情况下,您必须从备份中恢复。请参阅备份和恢复 Juju以了解其工作原理。
如果控制器进入“关闭”状态,则认为控制器失败。这可以通过将status
命令应用于“控制器”模型来监控:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju status -m controller
</code></span></span>
此输出显示在机器“3”上运行的控制器已失去与集群其余部分的连接:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Machine State DNS Inst <span style="color:#c7162b">id</span> Series AZ Message
<span style="color:#77216f">0</span> started <span style="color:#77216f">54.166</span>.164.0 i-04790c2414e4c8e80 xenial us-east-1a running
<span style="color:#77216f">2</span> started <span style="color:#77216f">54.80</span>.176.66 i-0b36284d1ebb816cf xenial us-east-1a running
<span style="color:#77216f">3</span> down <span style="color:#77216f">54.157</span>.161.147 i-09ff42ba5fb9429b0 xenial us-east-1e running
<span style="color:#77216f">4</span> started <span style="color:#77216f">54.227</span>.91.241 i-098222dad56cbe9a0 xenial us-east-1d running
<span style="color:#77216f">5</span> started <span style="color:#77216f">174.129</span>.90.47 i-0613fb1fa8346de8a xenial us-east-1c running
</code></span></span>
但是,输出中的“HA”列juju controllers --refresh
仍然显示“5”,如前所述:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">Controller Model User Access Cloud/Region Models Machines HA Version
aws-ha* default admin superuser aws/us-east-1 <span style="color:#77216f">2</span> <span style="color:#77216f">5</span> <span style="color:#77216f">5</span> <span style="color:#77216f">2.4</span>-beta2
</code></span></span>
要从此降级的集群中恢复,您将执行以下操作:
<span style="background-color:rgba(0, 0, 0, 0.03)"><span style="color:#111111"><code style="margin-left:0px" class="language-bash">juju remove-machine -m controller <span style="color:#77216f">3</span>
juju enable-ha -n <span style="color:#77216f">5</span>
</code></span></span>
cdnaphttp://cdnap.org/zixun/27707.html
控制器 HA 和日志记录
所有 Juju 机器都将它们的日志发送到 HA 集群中的控制器。每个控制器依次将这些日志发送到跨控制器同步的 MongoDB 数据库。用户juju debug-log
正常使用命令读取日志信息。见Juju 日志。