我正在设置 4 个主机,每个主机都导出一个本地存储iscsi
设备target
其他每台主机都将其导入,这样每台主机都可以同时访问所有 4 个存储设备。我建立了一个LVM
共享卷组包括所有这 4 个iscsi
设备。在这个卷组中,我创建了 4 个逻辑卷,每个卷都与一个iscsi
导入的设备一起烘焙。最后,我使用LVM
共享VG
同步机制,使用lvmlockd
和dlm
确保每次只有一个主机可以使用这些逻辑卷。最后,我raid6
在这 4 个逻辑卷之上构建了一个阵列,这样原则上最多可以有 2 个主机停机而不会中断存储服务。
我使用pacemaker
,从导出iscsi
卷target
到构建raid6
阵列。到目前为止,一切都运行良好,除了管理 1 或 2 个节点关闭的情况;数据是安全的,但由于我设置了raid6
在 4 个逻辑卷资源启动后启动阵列的约束,pacemaker
因此一旦至少 1 个主机脱机,就会禁用该阵列。我想pacemaker
继续提供服务,直到 2 个主机丢失。
为此,我需要顺序(和共置)约束,raid6
当且仅当这些逻辑卷中至少有 2 个处于联机状态时才启用阵列。更好的方法是:raid6
当且仅当最多 2 个逻辑卷无法联机(无论出于何种原因)pacemaker
时才启用阵列。不幸的是,只有当满足以下任一条件时,才允许按顺序排列前任资源集和共置约束(即必须首先启动的资源或资源集)被视为已启动全部集合中的资源已启动(require-all=true
)或至少一已启动(require-all=false
),但至少二已开始或最多二缺失。
作为一种解决方法,我考虑创建 11 个raid6
资源,每个可能的使用场景一个,即,每个可能场景一个,其中最多缺少 2 个逻辑设备:
LVs
1 和 2 可用LVs
1 和 3 可用LVs
1 和 4 可用LVs
2 和 3 可用LVs
2 和 4 可用LVs
3 和 4 可用LVs
1、2 和 3 可用LVs
1、2 和 4 可用LVs
1、3 和 4 可用LVs
2、3 和 4 可用LVs
1、2、3 和 4 可用
我将创建raid6
具有顺序和共置约束的资源,每个资源都与上面枚举中的一行匹配。然后,我需要一个额外的约束,将这些raid6
资源相互排除,以便在任何给定时间,实际阵列仅组装一次。
以下是我的 3 个问题:
- 有没有办法按顺序和共置约束来表达前任集合中的“最多 2 个缺失”,或者如果没有,是否存在任何“至少 2 个活动”的类似约束构造?
- 如果问题 1 的答案是否定的,那么是否有任何方法可以表达一对或多个资源之间或一个资源集内的互斥,最好使用优先级设置来支持使用最多设备数量的资源变体?
- 有没有起搏器专家可以建议其他解决方法?
答案1
事实证明,ocf:heartbeat:mdraid
我使用的代理完全能够组装缺少卷的设备。因此,我按照问题中描述的方案创建了 11 个虚拟资源,即:
LVs
在1 和 2 个资源之后启动的资源。LVs
在1 和 3 个资源之后启动的资源。LVs
在1 和 4 个资源之后启动的资源。- ETC。
我让突袭资源在所有这些虚拟资源之后启动,并将其require-all=false
设置为约束中设置的虚拟资源。
下一个麻烦是LVs
1、2、3 和 4 的共置隐式添加了从LV 1
到LV 2
、到LV 2
到LV 3
等的顺序约束,这意味着如果出于某种原因LV 3
停止,那么LV 4
也会停止;即使没有其他任何因素阻止它。我通过删除所有资源之间的共置约束LV
、添加另一个虚拟资源并在此虚拟资源和每个 之间创建 4 个共置约束来解决这个问题LV
。
这个问题似乎已经解决了。还有更多问题需要解决,但它们超出了这个问题的范围。