在Pacemaker集群中,为什么要禁用 DRBD

分享于 

5分钟阅读

互联网

 

问题:

DRBD文档( 在节,将DRBD与起搏器集群集成。) 建议在起搏器集群中禁用 DRBD:

如果你使用DRBD资源代理,建议你只将DRBD启动。关闭。升级和降级仅限于OCF资源代理 agent。 这意味着你应该禁用DRBD初始化脚本: chkconfig drbd off

在systemd下,这将等于 systemctl disable drbd.service

是否有什么危害在启用 DRBD,尽管这个建议? 这样做的目的是启用 DRBD,但是禁用Corosync和起搏器,这样在集群 node 失败后,它将继续接收DRBD同步的数据,但会继续接收到"被动"。 这应该允许在重新输入群集之前分析失败的node,但同时仍保存在两个群集节点上的实时数据。 推荐的建议背后的基本原理是什么?


回答 1:

在操作系统级别禁用DRBD服务的目的是,所有的东西都是由心脏起搏器控制的。 如果两个服务( PCMK和你的操作系统,例如) 正在尝试 start/stop/promote/demote 等等,那么你就会有分裂的风险。 对于受控集群环境,要避免集群节点之间的混淆,必须由集群资源管理器( 在本例中为 pacemaker ) 处理。 在分割大脑或者类似的情况下,你可以使用STONITH或者围栏或者在它的他节点上使用配置的仲裁。


回答 2:

在使用集群资源管理器时,任何资源都应该由资源管理器控制。 无论是管理员还是资源管理器本身,从集群资源管理器外部启用/禁用的资源都是一个潜在的混淆源。


回答 3:

明细明白,这是一个不好的理念,但也许有些细节可以帮助你解决这些问题。

首先,Pacemaker日志和资源故障的帐户。 默认情况下,资源从 node 获取"已经被禁止"之前的默认失败计数是resource-failure-timeout窗口中3 个,默认情况下不会超时。 因此,如果你的DRBD资源( 或者任何其他的资源) 连续三次失败,那么它将通过使用一个强的约束来禁止当前活动的node,这意味着资源可以在任何地方运行,而不是当前。 一旦规则就位,资源就可以在它的他地方移动,或者在解决故障之前停止。

你可以看到,Pacemaker可以在自己的系统上优雅地处理这些故障。

你需要了解什么是起搏器,以及如何理解它为什么管理它外部的资源是坏的。 起搏器是一种有限状态系统。 它取决于它所管理的资源的完整控制,以便能够优雅地从失败中恢复或者启动资源。

一个简单的资源一次只能在一个 node 上运行,以免成为"分割大脑"并创建一个差异数据集。

Pacemaker控制这个资源,并在 node"能够"上启动软件的实例。 meaning管理员发现服务已经启动,但它的systemd单元文件是"已经禁用"。 管理员启用了这个单元文件,这样服务就会在重启时启动,不知道心脏起搏器已经在处理这个问题。 将systemd单元文件配置为在失败时重新启动资源,如下所示。

一旦 node 尝试将这个资源迁移到群集"baker"中的第二个,该资源会遇到停止失败。 由于资源不能停止,因这里不能在lana上启动,而且不会导致断开大脑状态。 停止和开始作为systemd和起搏器战斗之间的资源翼翼。 最终,资源上的起搏器"放弃"并将它的放入"非托管模式",意味着在该资源上不执行启动或者停止操作。

所以在那个场景中Systemd获胜是因为它是"。stupider和更坚持"而不是 Pacemaker。 管理员不熟悉起搏器和Systemd这两种行为非常困难,因为在实际情况下,这仅仅是起搏器在实际工作中所要做的事情的Pacemaker。

同时考虑到上面的场景有最好的结束条件。 由于基础结构失败,群集将成为分散大脑,这两个节点上的资源都是活动的。

除这里之外,通过STONTIH可以阻止群集在这个场景中被拆分,但STONITH是集群稳定的最后一个方法。 一如既往,你需要STONITH才能使集群生产就绪。



PAC  集群  pacemaker  drbd  drb