配置与管理实战指南)
存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载故障域Fault Domain是 CubeFS Master 提供的一种数据分布规划能力用于解决多 Zone 场景下副本集copyset分布缺乏规划的问题通过将数据副本按故障域 NodeSet Group维度做隔离编排从而提升数据耐久性。本文基于 docs-zh/source/dev-guide/admin-api/master/failureDomain.md 并结合仓库源码完整讲解故障域的启用条件、两级配置Cluster/Volume、启用决策矩阵、管理命令及底层实现原理帮助你在一套已运行的 CubeFS 集群上安全、正确地开启并运维故障域。为什么需要故障域在多 Zone跨机房/跨可用区部署的 CubeFS 集群中如果没有故障域规划Master 在创建数据分区Data Partition时只会从可用 Zone 中按普通策略挑选节点副本集的分布是无规划的——多个副本可能被分配到同一个 Zone 甚至同一批物理机架上一旦该 Zone 或机架整体故障整个副本集将同时丢失数据的耐久性durability无法得到保证。故障域机制将集群资源组织为Domain故障域→ NodeSet Group → NodeSet → 节点的分层结构见 master/topology.go 中的DomainManager与DomainNodeSetGrpManager在创建数据分区时强制从不同的 NodeSet Group 中挑选副本主机使同一副本集的所有副本分布在相互隔离的故障区域内即使单个区域整体宕机其他区域中的副本仍能保证数据可读可恢复。升级及配置项故障域不是默认开启的能力需要在Cluster 级别和Volume 级别分别配置两者配合才能生效。文档原文中的配置小结明确指出FaultDomain默认值为false不加该配置则 Master 无法区分新建的 Zone 是故障域 Zone还是归属于原有 cross_zone 的普通 Zone。Cluster 级别配置在 Master 配置文件中新增如下配置项对应源码中的配置解析键faultDomain见 master/config.go 与 master/config.goFaultDomain bool # 默认false在源码实现中该配置项最终被赋值给Cluster.FaultDomain字段见 master/cluster.goc.FaultDomain cfg.faultDomain并同步到 Master 的 Raft 元数据状态机中持久化metadata_fsm_op.go中会维护domainExcludeZones、domainNodeSetGrpVec等故障域状态。也就是说开启故障域意味着 Master 需要重启、配置需要更新并且会同步管控现有 Volume 的更新策略。除开关本身外源码还提供了两个与之配套的进阶配置项同为faultDomain前缀见 master/config.go配置项作用faultDomainGrpBatchCnt批量构建 NodeSet Group 的批次数faultDomainBuildAsPossible是否尽可能构建 NodeSet Group即使资源不足也尽量组组Volume 级别配置Volume 级别保留原有的crossZone配置并新增default_prioritycrossZone bool # 跨zone default_priority bool # true优先选择原有的zone而不是从故障域里面分配保留项crossZone标识该 Volume 是否跨 Zone 部署是判断 Volume 是否启用跨 Zone 能力的基础开关。新增项default_priority当 Volume 同时开启跨 Zone 时若该值为trueMaster 会优先在原有普通 Zone 中分配资源只有原有资源不足时才进入故障域分配。在源码中与这两个 Volume 属性对应的键分别为crossZone与normalZonesFirst见 master/const.go。注意文档中的default_priority与 API 参数中的normalZonesFirst是同一个概念的两种叫法——在创建 Volume 的 HTTP API 参数里使用normalZonesFirst它在创建 Volume 时被映射为 Vol 的DefaultPriority字段见 master/cluster.go。配置小结与生效决策文档给出了三组前置约束务必逐条对照你的集群现状对于现有的 Cluster无论自建还是社区版、单 Zone 还是跨 Zone若需要启用故障域必须保证 Cluster 支持故障域配置FaultDomain并重启 Master、更新配置同时要管控现有 Volume 的更新策略否则请继续沿用原有策略不要强行开启。Cluster 支持但 Volume 不选择使用Volume 继续沿用原有策略并在原有 Zone 中分配资源原有资源耗尽后再使用新 Zone故障域的资源。Cluster 不支持Volume 无法启用自己的故障域策略。当 Cluster 与 Volume 两级配置组合时Volume 使用域资源的规则如下表原文档核心表格完整保留Cluster:FaultDomainVol:crossZoneVol:normalZonesFirstRules for volume to use domainNN/AN/ADo not support domainYNN/AWrite origin resources first before fault domain until origin reach thresholdYYNWrite fault domain onlyYYYWrite origin resources first before fault domain until origin reach threshold上述决策逻辑在源码中由Cluster.isFaultDomain(vol)实现见 master/cluster.go。其核心判断为Cluster 必须开启FaultDomain且满足以下任一条件时该 Volume 进入故障域分配Volume 自身已开启domainOn此前已判定为故障域 VolumeVolume 未开crossZone但 Cluster 已进入需要故障域状态needFaultDomain即普通 Zone 资源已用尽见 master/cluster.go或 Volume 指定了 Zone 且该 Zone 状态为unavailableZone不可用或 Volume 开启crossZone且default_priority为 false或为 true 但普通 Zone 已用尽 / 非故障域 Zone 数量不超过 1。一旦判定为故障域 VolumeMaster 会在创建数据分区时走getHostFromDomainZone(vol.domainId, ...)从指定 Domain 的 NodeSet Group 中分配副本主机而不是普通的getHostFromNormalZone(...)路径见 master/cluster.go。这意味着故障域分配是写路径级别的强制行为直接影响每个新数据分区的副本落点。注意事项故障域解决的是多 Zone 场景下 copysets 分布没有规划的问题保证了数据的耐久性但需要明确以下几点原文档要点逐条保留并补充源码依据启用故障域后新区域中的所有设备都将加入故障域Master 会将新建 Zone 纳入故障域管理并在元数据状态机中维护domainExcludeZones非故障域 Zone 列表见 master/topology.go与domainNodeSetGrpVec故障域 NodeSet Group 列表见 master/topology.go。创建的 Volume 会优先选择原 Zone 的资源即default_prioritytrue的默认行为只有原 Zone 资源耗尽needFaultDomain置位才会使用故障域资源。新建卷时需要根据上表添加配置项使用域资源默认情况下如果可用则首先使用原始 Zone 资源。也就是说故障域能力开启 ≠ 所有 Volume 自动使用故障域必须按前文决策矩阵显式配置crossZone与normalZonesFirst。另外原文档特别强调原有数据不能自动迁移。故障域只影响启用后新创建的数据分区存量数据分区不会自动搬迁需要根据业务需求评估是否需要做数据重平衡或迁移。管理命令故障域相关的管理命令均通过 Master 的 HTTP Admin API 提供端口默认为 Master 对外服务端口示例中使用192.168.0.11:17010请替换为你实际集群的 Master 地址。各接口在 master/http_server.go 中注册路由具体 handler 实现位于 master/api_service.go。创建使用故障域的 Volumecurl http://192.168.0.11:17010/admin/createVol?namevolDomaincapacity1000ownercfscrossZonetruenormalZonesFirstfalse参数列表原文档表格完整保留参数类型描述crossZonestring是否跨 zonenormalZonesFirstbool非故障域优先在该示例中crossZonetrue、normalZonesFirstfalse对应决策矩阵中Write fault domain only的规则——新建的volDomain卷只从故障域中分配副本资源。参数在创建 Volume 请求解析中被读取crossZone与normalZonesFirst键定义见 master/const.go解析位于 master/api_args_parse.go最终写入 Vol 的DefaultPriority见 master/cluster.go。查看故障域是否启用curl http://192.168.0.11:17010/admin/getIsDomainOn该接口由getIsDomainOnhandler 处理见 master/api_service.go返回结构SimpleDomainInfo其中DomainOn字段直接取自m.cluster.FaultDomain。即该命令返回的是 Cluster 级别的FaultDomain开关状态用于确认故障域功能是否已在集群层面启用。查看故障域使用情况curl -v http://192.168.0.11:17010/admin/getDomainInfo对应 handler 为getAllNodeSetGrpInfoHandler见 master/api_service.go返回proto.DomainNodeSetGrpInfoList包含以下关键字段DomainOnCluster 是否开启故障域同cluster.FaultDomainNeedDomain是否已进入需要故障域状态cluster.needFaultDomain即普通 Zone 资源是否已用尽DataRatioLimit故障域内数据使用比例上限domainManager.dataRatioLimitZoneExcludeRatioLimit非故障域 Zone 的数据使用上限domainManager.excludeZoneUseRatioExcludeZones非故障域 Zone 列表domainExcludeZonesDomainNodeSetGrpInfo每个故障域Domain下的 NodeSet Group 列表包含DomainId与Status状态信息。查看故障域 copyset group 的使用情况curl http://192.168.0.11:17010/admin/getDomainNodeSetGrpInfo?id37对应 handler 为getNodeSetGrpInfoHandler见 master/api_service.go除id参数外还支持可选的domainId参数返回指定 NodeSet Group 的SimpleNodeSetGrpInfo详情。NodeSet Group 是故障域分配的核心单元Master 在故障域内将节点划分为多个 NodeSet再将 NodeSet 组合成 NodeSet Group构建方法见 master/topology.go 的buildNodeSetGrp以及buildNodeSetGrp3Zone、buildNodeSetGrp2Plus1、buildNodeSetGrpOneZone等不同 Zone 数场景的构建策略创建数据分区时从 Group 内不同 NodeSet 挑选副本从而保证副本跨故障域隔离。更新非故障域数据使用上限curl http://192.168.0.11:17010/admin/updateZoneExcludeRatio?ratio0.7对应 handler 为updateZoneExcludeRatioHandler见 master/api_service.go参数ratio为浮点数。源码中的校验逻辑表明ratio必须提供否则报keyNotFound参数错误解析为float64失败会报参数错误与同类接口updateDataUseRatioHandlermaster/api_service.go的校验一致ratio 0或ratio 1均视为非法参数。该参数控制普通非故障域Zone 资源使用的阈值上限当普通 Zone 的数据使用量达到该比例后Master 将needFaultDomain置位后续创建的 Volume/数据分区开始使用故障域资源——这正是决策矩阵中 Write origin resources first before fault domainuntil origin reach threshold 所描述的阈值行为。故障域分配流程与源码印证将上述管理命令与源码结合故障域的完整工作链路可以概括为初始化Master 启动时解析faultDomain配置master/config.go赋值给Cluster.FaultDomainmaster/cluster.go并在 Raft 状态机恢复时重建domainExcludeZones与domainNodeSetGrpVecmaster/metadata_fsm_op.go。资源组织故障域内的节点被组织为 Domain → NodeSet Group → NodeSet 的层次结构构建逻辑见 master/topology.go含DomainManager、DomainNodeSetGrpManager、buildNodeSetGrp*系列函数。写路径判定每次创建数据分区时调用isFaultDomain(vol)master/cluster.go判定当前 Volume 是否走故障域走故障域则通过getHostFromDomainZone分配副本主机否则走getHostFromNormalZone普通分配master/cluster.go。运维查询通过getIsDomainOn/getDomainInfo/getDomainNodeSetGrpInfo三个查询接口观测开关状态、使用情况与 Group 明细通过updateZoneExcludeRatio动态调整普通 Zone 使用阈值。结语故障域是 CubeFS 面向多 Zone 生产环境提供的高可用增强能力其正确使用依赖Cluster 级开关 Volume 级策略的两级配合先在 Master 配置中开启FaultDomain并重启生效再按决策矩阵为每个 Volume 显式设置crossZone与normalZonesFirst。开启后通过getIsDomainOn、getDomainInfo、getDomainNodeSetGrpInfo持续观测状态并用updateZoneExcludeRatio控制普通 Zone 资源的耗尽阈值。需要特别留意的是故障域只保证新数据分区的分布规划存量数据不会自动迁移升级前务必做好容量与数据布局评估。赞分享存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载相关推荐Polly 混沌工程 Fault 故障注入策略实战指南从注入配置到源码原理Polly 混沌工程 Fault 故障注入策略实战指南从注入配置到源码原理 本文以 docs/chaos/fault.md https://link.gitc后端微服务Composio Salesforce Toolkit 接入与排障指南OAuth 认证、My Domain 子域配置与工具迁移实战Composio Salesforce Toolkit 接入与排障指南OAuth 认证、My Domain 子域配置与工具迁移实战 本篇技术指南以 Compo人工智能AI Agent工具调用MCP 服务MCP ClientsMidway 跨域组件cross-domain完全指南CORS 与 JSONP 配置实战Midway 跨域组件cross domain完全指南CORS 与 JSONP 配置实战 导读 Midway 提供了开箱即用的通用跨域组件 midway后端微服务云原生上一篇ActionBarSherlock扩展视图自定义View实现下一篇Czkawka 完整磁盘清理指南一次扫描找出重复文件、空文件夹与相似图片创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考