我正在设置 4 台主机,每台主机都导出一个本地存储iscsi
设备target
。每隔一个主机导入它,这样每个主机都可以同时访问所有 4 个存储设备。我构建了一个包含所有这 4 个设备的LVM
共享卷组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 的答案是否定的,是否有任何方法可以表达一对或资源之间或资源集中的互斥,最好是优先设置有利于使用最多设备的资源变体?
- 是否有任何其他起搏器向导可以建议的其他解决方法?
事实证明,
ocf:heartbeat:mdraid
我使用的代理完全能够组装一个缺少体积的设备。因此,我按照问题中描述的方案创建了 11 个虚拟资源,即:LVs
。LVs
在1 和 3 资源之后开始的一个。LVs
在1 和 4 资源之后开始的一个。我让 raid 资源在所有这些虚拟资源之后启动,并
require-all=false
设置为约束中的虚拟资源集。下一个麻烦是
LVs
1、2、3 和 4 的并置隐含地添加了从LV 1
到LV 2
、到LV 2
到LV 3
等的顺序约束,这意味着如果由于某种原因LV 3
停止,则LV 4
也停止;即使没有其他东西阻止它。我通过删除所有资源之间的共置约束LV
、添加另一个虚拟资源并在该虚拟资源和每个资源之间创建 4 个共置约束来解决它LV
。这个问题似乎是固定的。还有更多需要解决的问题,但它们不在这个问题的范围内。