簇重建
存储簇可自我修复。如果节点或磁盘出现故障,簇将自动尝试恢复丢失的数据,即,重建自身。
重建先决条件
若使簇能够重建自身,它必须至少具备:
-
冗余模式所需的正常运行的节点数
考虑以下示例。在以 5+2 纠删码模式工作并且有七个节点(即,最低数量)的簇中,每个用户数据副本都被分发到 5+2 个节点用于冗余,即,使用了每个节点。如果一个或两个节点失败,则用户数据不会丢失,但簇将降级并且不能重建自身,直到至少七个节点都重新正常运行(直到添加了丢失的节点)。为了对照,并且有七个节点的簇中,每个用户数据副本都被分发到十个节点中的 5+2 个随机节点上,以均衡 CSe 的负载。如果最多有三个节点发生故障,则此类簇仍将有足够的节点重建自身。
-
足够的空闲空间以容纳任意一个节点可存储的数据量
考虑以下示例。在具有 10 TB 节点的簇上,每个节点至少有 1 TB 应保持空闲,因此如果一个节点发生故障,可以在剩余的九个节点上重建其 9 TB 的数据。然而,如果簇有十个 10 TB 的节点和一个 20 TB 的节点,每个较小的节点应至少有 2 TB 的空闲空间,以免最大的节点发生故障(尽管最大的节点应有 1 TB 的空闲空间)。
重建过程
重建过程包括几个步骤。每个 CS 将每隔 5 秒钟将一条反馈消息发送给 MDS。如果未发送反馈,则 CS 将被认为非活动状态,MDS 会通知所有簇组件,它们停止请求对其数据的操作。如果 15 分钟内未收到来自 CS 的反馈,MDS 会认为 CS 脱机,并开始簇重建。在此过程中,MDS 会查找没有丢失数据副本的 CS,并恢复数据(一次一个副本),如下所示:
- 如果使用了复制,则降级区块的现有副本将锁定(以确保所有副本保持一致),并且其中一个被复制到新 CS。如果在此时,客户端需要读取某些还未重建的数据,它将读取该数据任意剩余的副本。
- 如果使用了纠删码,则新 CS 将请求几乎所有剩余的数据片段以重建丢失的片段。如果在此时,客户端需要读取某些还未重建的数据,则该数据将不按顺序重建,然后读取。
如果使用了复制,自我修复需要更多的网络流量和 CPU 资源。另一方面,使用擦除代码进行重建将更慢。
如果在维护期间,节点或磁盘脱机,将延迟集群自我修复以节省集群资源。默认延迟为 30 分钟。通过使用 vstorage -c <cluster_name> set-config 命令以毫秒设置 mds.wd.offline_tout_mnt 参数来调整它。
簇重建的建议
有两个建议可帮助消除重建开销:
- 要简化重建,请在所有节点上保留统一的磁盘数和容量大小。
- 重建会给网络带来额外的负载,并增加读取和写入操作的延迟。集群的网络带宽越大,完成重建和释放带宽的速度就越快。