黄介下 發表於 2026-5-5 09:02:56

一文看懂SBD (一种基于存储的扩展防护服务)

<p><img src="https://storage.deepin.org/thread/202309151437258193_蓝色扁平简约新闻话题__2023-09-14+18_37_54.png" alt="" width="900" height="383" /></p>
<h2 class="ql-direction-ltr ql-long-10365" data-header="2" data-foldable="true" data-default-linespacing="100"><strong class="ql-author-10365 ql-font-microsoftyahei">概述</strong></h2>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">SBD 是一种基于存储的扩展防护服务,是 </span><em class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">STONITH Block Device</em><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> (STONITH 块设备)的缩写。</span><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> </span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">高可用集群的最高优先级是保护数据完整性。此项保护通过防止对数据储存进行未协调的并行访问来实现。集群会使用几种控制机制来实现此目标。</span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">但是,如果在集群中选出数个 DC,则可能导致网络分区或软件故障。如果允许出现这种所谓的 “节点分裂” 情况,则可能会发生数据损坏。</span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">避免出现这种情况可采用的主要机制是通过 STONITH 实现节点屏蔽。如果使用 SBD 作为节点屏蔽机制可在节点分裂情况下关闭节点而无需使用外部关闭设备。</span></p>
<h2 class="ql-direction-ltr ql-long-10365" data-header="2" data-foldable="true" data-default-linespacing="100"><strong class="ql-author-10365 ql-font-microsoftyahei">SBD 组件和机制</strong></h2>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">SBD 分区</strong><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> </span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">在所有节点都可访问共享储存的环境中,设备的某个小分区会格式化,以用于 SBD。该分区的大小取决于所用磁盘的块大小(例如,对于块大小为 512 字节的标准 SCSI 磁盘,该分区大小为 1 MB;块大小为 4 KB 的 DASD 磁盘需要 4 MB 大小的分区)。初始化过程会在设备上创建消息布局,配置最多 255 个节点的讯息槽。<br />
</span></p>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">SBD 守护程序</strong></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">配置完相应的 SBD 守护程序后,在每个节点上使其联机,然后启动集群。它在所有其他集群组件都关闭之后才终止,从而确保了集群资源绝不会在没有 SBD 监督的情况下被激活。</span></p>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">消息</strong><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> </span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">此守护程序会自动将分区上的消息槽之一分配给其自身,并持续监视其中有无发送给它自己的消息。收到消息后,守护程序会立即执行请求,如启动关闭电源或重引导循环以进行屏蔽。</span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">另外,此守护程序会持续监视与储存设备的连接性,当无法连接分区时会自行终止。这就保证了它不会从屏蔽消息断开连接。如果集群数据驻留在不同分区中的同一个逻辑单元,则一旦与储存失去连接,工作负载便将终止,因此不会增加额外的故障点。</span></p>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">检查包(softdog)</strong></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">只要使用 SBD,就必须确保检查包正常工作。新式系统支持 </span><em class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">硬件检查包</em><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> ,此功能需由软件组件来 “激发” 或 “馈送数据”。软件组件(在此案例中为 SBD 守护程序)通过将服务脉冲定期写入检查包来 “供给” 检查包。如果守护程序停止供给检查包,硬件将强制系统重启动。这可防止出现 SBD 进程本身的故障,如失去响应或由于 I/O 错误而卡住。</span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">如果 Pacemaker 集群已激活,则当设备大多数节点丢失时,SBD 将不会进行自我屏蔽。例如,假设您的群集包含三个节点:A、B 和 C。由于网络分隔,A 只能看到它自己,而 B 和 C 仍可相互通讯。在此案例中,有两个集群分区,一个因节点占多数(B 和 C)而具有法定票数,而另一个则不具有 (A)。如果在大多数屏蔽设备无法访问时发生此情况,则节点 A 会立即自我关闭,而节点 B 和 C 将会继续运行。</span></p>
<h2 class="ql-direction-ltr ql-long-10365" data-header="2" data-foldable="true" data-default-linespacing="100"><strong class="ql-author-10365 ql-font-microsoftyahei">SBD 使用要求</strong></h2>
<ul>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">最多可将三个 SBD 设备用于基于存储的屏蔽。使用一到三个设备时,必须可从所有节点访问共享存储。</span></li>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">集群中的所有节点上,共享存储设备的路径都必须永久且一致。使用稳定的设备名称,如 /dev/disk/by-id/dm-uuid-part1-mpath-abcedf12345。</span></li>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">可通过光纤通道 (FC)、以太网光纤通道 (FCoE) 甚至 iSCSI 来连接共享存储,建议使用基于存储区的 RAID 和多路径,以提高可靠性。</span></li>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">可以在不同集群之间共享某个 SBD 设备,只要共享该设备的节点数不超过 255 个。</span></li>
</ul>
<h2 class="ql-direction-ltr ql-long-10365" data-header="2" data-foldable="true" data-default-linespacing="100"><strong class="ql-author-10365 ql-font-microsoftyahei">设置 SBD 设备</strong><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> </span></h2>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">SBD 设备初始化</strong></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">要将 SBD 与共享储存搭配使用,必须先在一到三个块设备上创建消息布局。sbd create 命令会将元数据头写入指定的一个或多个设备。它还将初始化最多 255 个节点的讯息槽。如果该命令不带任何其他选项,则执行时将使用默认的超时设置。</span><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei"> </span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">注:确保要用于 SBD 的一个或多个设备未保存任何重要数据。执行 sbd create 命令时,会直接重写指定块设备的大约第一个 MB,而不会进一步发出请求或进行备份。</span></p>
<ol>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">决定要将哪个块设备或哪些块设备用于 SBD。</span></li>
<li><span class="ql-author-10365 ql-font-microsoftyahei"><span class="ql-author-10365 ql-font-microsoftyahei">使用以下命令初始化 SBD 设备:</span></span></li>
</ol>
<p>root # sbd -d /dev/SBD create</p>
<p><span class="ql-author-10365 ql-font-microsoftyahei">请将 /dev/SBD 替换为实际路径名称,例如:</span></p>
<p>/dev/disk/by-id/scsi-ST2000DM001-0123456_Wabcdefg。</p>
<ol>
<li class=""><span class="ql-author-10365 ql-font-microsoftyahei">检查已写入设备的内容:</span></li>
</ol>
<p>root # sbd -d /dev/SBD dump<br />
Header version : 2.1<br />
UUID : 619127f4-0e06-434c-84a0-ea82036e144c<br />
Number of slots : 255<br />
Sector size : 512<br />
Timeout (watchdog) : 5<br />
Timeout (allocate) : 2<br />
Timeout (loop) : 1<br />
Timeout (msgwait) : 10<br />
==Header on disk /dev/SBD is dumped</p>
<p><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">初始化 SBD 设备之后,编辑 SBD 配置文件,然后启用并启动相应的服务以让更改生效。</span></p>
<p class="ql-direction-ltr ql-long-10365"><strong class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">编辑 SBD 配置文件</strong></p>
<ol>
<li><span class="ql-author-10365 ql-font-microsoftyahei"><span class="ql-author-10365 ql-font-microsoftyahei">打开文件</span></span></li>
</ol>
<p>/etc/sysconfig/sbd</p>
<ol>
<li><span class="ql-author-10365 ql-font-microsoftyahei"><span class="ql-author-10365 ql-font-microsoftyahei">搜索以下参数:</span></span></li>
</ol>
<p>SBD_DEVICE</p>
<p><span class="ql-author-10365 ql-font-microsoftyahei">该参数指定要监视和要用于交换 SBD 消息的设备。 </span></p>
<p><span class="ql-author-10365 ql-font-microsoftyahei">编辑此行,并用您的 SBD 设备替换 SBD:</span></p>
<p>SBD_DEVICE="/dev/SBD"</p>
<p><span class="ql-author-10365 ql-font-microsoftyahei">如果需要指定多个设备,请使用分号分隔设备(设备顺序无关紧要):</span></p>
<p>SBD_DEVICE="/dev/SBD; /dev/SBD1;/dev/SBD2"</p>
<p><span class="ql-author-10365 ql-font-microsoftyahei">如果无法访问 SBD 设备,守护程序将无法启动集群,并会禁止集群启动。</span></p>
<ol>
<li><span class="ql-author-10365 ql-font-microsoftyahei">搜索以下参数: </span></li>
</ol>
<p>SBD_DELAY_START</p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">启用或禁用延迟。设置 SBD_DELAY_START 为 yes(如果 msgwait 相对较长,而集群节点引导很快)。将此参数设置为 yes 可在引导时延迟 SBD 启动。虚拟机有时候需要此项延迟。</span></p>
<p class="ql-direction-ltr ql-long-10365"><span class="ql-author-10365 ql-size-12 ql-font-microsoftyahei">将 SBD 设备添加到 SBD 配置文件之后,启用 SBD 守护程序。SBD 守护程序是集群的关键部分。当集群正在运行时,需要运行该守护程序。因此,每当启动 pacemaker 服务时,作为依赖项,也要启动 sbd 服务。</span></p>
<div>
<div><strong>启用和启动 SBD 服务</strong></div>
<div></div>
</div>
<div>
<div>在每个节点,启用 SBD 服务:</div>
<div>root # systemctl enable sbd</div>
<div></div>
</div>
<div>
<div>每当启动 Pacemaker 服务时,SBD 服务将与 Corosync 服务一起启动。</div>
<div></div>
</div>
<div>
<div>在每个节点上重启动集群:</div>
<div>root # pcs stonith sbd enable device="/dev/SBD"<br />
root # pcs cluster restart</div>
<div></div>
<div>此操作会自动触发 SBD 守护程序的启动。</div>
</div>
<div>
<div>
<div></div>
<div><strong>测试 SBD 设备</strong></div>
<div></div>
</div>
<div>
<div>以下命令会将节点槽及其当前消息从 SBD 设备进行转储:</div>
<div>root # sbd -d /dev/SBD list</div>
<div></div>
</div>
<div>
<div>现在,您应该会看到曾随 SBD 启动的所有群集节点都列在此处。例如,如果您拥有双节点群集,讯息槽对于两个节点都应显示 clear:</div>
<div>0 alice clear</div>
<div>1 bob clear</div>
</div>
<div>
<div></div>
<div>尝试将测试消息发送到节点之一:</div>
<div>root # sbd -d /dev/SBD message alice test</div>
<div></div>
</div>
<div>
<div>此节点将在系统日志文件中确认收到了该讯息:</div>
</div>
<div>May 03 16:08:31 alice sbd: /dev/SBD: notice: servant: Received command test from bob on disk /dev/SBD</div>
<div></div>
<div>
<div>这就确认了 SBD 确实在节点上正常运行,并已准备好接收消息。</div>
</div>
</div>
                        </div>
頁: [1]
查看完整版本: 一文看懂SBD (一种基于存储的扩展防护服务)