云原生存储高可用容器编排【免费下载链接】longhornCloud-Native distributed storage built on and for Kubernetes项目地址https://gitcode.com/gh_mirrors/lo/longhorn点击查看免费下载导读Longhorn 允许每个节点挂载多块磁盘但在默认调度策略下同一卷的两个副本即使落在同一节点上也可能被调度到同一块磁盘从而失去磁盘层面的冗余。本文基于 Longhorn 官方 enhancement 文档enhancements/20230718-disk-anti-affinity.md系统讲解 Disk Anti-Affinity 磁盘级反亲和特性的设计动机、全局设置与卷级字段的完整配置方法、调度器实现原理、升级兼容策略与测试计划帮助你在单节点或小规模多节点集群上把副本真正打散到不同磁盘实现类似 RAID 1 的磁盘级镜像保护。背景为什么需要磁盘级反亲和Longhorn 原生支持一个节点挂载多块磁盘multiple disks per node。在没有磁盘级反亲和特性之前调度器对同一卷的两个副本没有任何机制保证它们被放置到不同磁盘——即使调度时明明有更优的选择也可能把两个副本塞进同一块磁盘。这意味着一块磁盘故障时同节点的另一块磁盘上可能找不到健康副本单节点集群上磁盘故障可能直接导致卷崩溃。从功能定位上看虽然不能做到严格等价但磁盘级反亲和可以类比为 Longhorn 的 RAID 1——在同一节点内跨多块磁盘做镜像是节点级、区域级反亲和之外的第三层数据保护维度相关设计背景见 enhancement 文档的 Summary 与 Motivation 章节。已有的两级软反亲和节点级与区域级在引入磁盘级反亲和之前Longhorn 已经具备两级调度约束它们与磁盘级反亲和共同构成节点 → 区域 → 磁盘的三级副本分散体系级别设置项默认值作用节点级Replica Node Level Soft Anti-Affinity对应卷字段spec.replicaSoftAntiAffinity关闭Disabled关闭时阻止副本调度到已存在同一卷健康副本的节点可在卷级覆盖全局默认值区域级Replica Zone Level Soft Anti-Affinity对应卷字段spec.replicaSoftZoneAntiAffinity开启Enabled关闭时阻止副本调度到已存在同一卷健康副本的区域可在卷级覆盖全局默认值磁盘级新增Replica Disk Level Soft Anti-Affinity对应卷字段spec.replicaDiskSoftAntiAffinity开启true见下文动机哪些集群真正受益特性本身面向明确的使用场景并非所有集群都能从中获益大型多节点集群副本数通常远小于可用节点数调度器天然会把副本分散到不同节点从而也分散到不同磁盘此特性收益有限单节点集群与小规模多节点集群副本数超过可用节点数时收益显著更高的数据持久性单块磁盘故障后仍有健康副本存在于未故障的磁盘上更高的数据可用性节点上某块磁盘不可用时只要节点本身健康至少还有一个副本保持健康。在单节点集群上这可以直接避免卷崩溃在小规模多节点集群上可以防止后续因丢失另一个节点而引发的卷崩溃。设计目标Goals在任何情况下副本调度器都尽力保证同一卷的两个副本不被调度到同一磁盘可选地当卷级或全局配置要求严格时调度器拒绝把副本调度到已存在同一卷副本的磁盘。配置方式全局设置与卷级字段1. 全局设置Replica Disk Level Soft Anti-Affinity新增一个全局调度设置默认值为true。官方文档给出的定义如下Golang 伪代码形式SettingDefinitionReplicaDiskSoftAntiAffinity SettingDefinition{ DisplayName: Replica Disk Level Soft Anti-Affinity, Description: Allow scheduling on disks with existing healthy replicas of the same volume, Category: SettingCategoryScheduling, Type: SettingTypeBool, Required: true, ReadOnly: false, Default: true, }默认取true的原因把副本调度到不同磁盘通常更可取但若在磁盘不足时直接拒绝调度会破坏既有行为因此默认采用尽力分散、不拒绝调度的软约束语义。该设置属于SettingCategoryScheduling调度类别、布尔类型、必填、可修改默认值为true。在 Helm Chart 中对应defaultSettings.replicaDiskSoftAntiAffinity值chart/values.yaml渲染为 Longhorn 全局设置replica-disk-soft-anti-affinity见 chart/templates/default-setting.yaml相关说明同样收录在 chart/README.md 中。2. 卷级字段spec.replicaDiskSoftAntiAffinity在 Volume CRD 中新增spec.replicaDiskSoftAntiAffinity字段默认值为ignored。与既有的spec.replicaSoftAntiAffinity、spec.replicaSoftZoneAntiAffinity语义一致当字段设置为enabled或disabled时覆盖全局设置设置为ignored时跟随全局。官方文档给出的字段 schema 定义replicaDiskSoftAntiAffinity: description: Replica disk soft anti affinity of the volume. Set enabled to allow replicas to be scheduled in the same disk. enum: - ignored - enabled - disabled type: string该字段在仓库中的 CRD 定义与此一致取值枚举为ignored/enabled/disabled类型为字符串见 chart/templates/crds.yaml 与 deploy/longhorn.yaml。注意enabled的语义是允许副本调度到同一磁盘即此时调度器不做磁盘分散约束对应全局设置的软语义为尽力分散但允许同盘。3. 完整配置示例方式一通过 Helm values 设置全局默认值# values.yamlHelm 安装时指定 defaultSettings: replicaDiskSoftAntiAffinity: true # 默认即 true设为 false 则严格拒绝同盘调度Rancher 集成场景下该值同样暴露在 Chart 的交互式配置界面defaultSettings.replicaDiskSoftAntiAffinity见 chart/questions.yaml。方式二通过 Volume 对象设置卷级覆盖apiVersion: longhorn.io/v1beta1 kind: Volume metadata: name: demo-volume spec: numberOfReplicas: 3 replicaSoftAntiAffinity: true # 允许同一节点多副本否则单节点集群无法调度 replicaDiskSoftAntiAffinity: enabled # 允许副本落在同一磁盘软约束尽力分散 # 若希望磁盘不足时调度显式失败请将卷级或全局设置为 disabled关键取值对照表配置位置取值调度行为全局设置true默认尽力将副本分散到不同磁盘磁盘不足时允许同盘不拒绝调度全局设置false拒绝把副本调度到已有同一卷健康副本的磁盘磁盘不足时调度显式失败卷字段ignored默认跟随全局设置卷字段enabled覆盖全局允许同盘调度尽力分散卷字段disabled覆盖全局拒绝同盘调度磁盘不足时调度失败调度器实现原理官方 enhancement 文档对实现做了明确描述。改造前的副本调度流程根据节点状态以及ReplicaSoftAntiAffinity节点级、ReplicaZoneSoftAntiAffinity区域级设置确定副本可被调度到的节点集合汇总这些节点上所有可调度磁盘形成磁盘列表选择剩余可用空间最大的磁盘完成调度。改造后的流程在步骤 2 与步骤 3 之间插入磁盘级过滤根据节点状态以及节点级、区域级反亲和设置确定可调度节点集合汇总所有可调度磁盘过滤磁盘列表优先保留已有匹配副本数量最少的磁盘当配置为严格模式disabled时仅保留没有任何匹配副本的磁盘在过滤后的磁盘列表中选择剩余可用空间最大的磁盘完成调度。也就是说磁盘可用空间不再是唯一的选盘依据先按磁盘上的副本密度收敛候选集再在候选集中按空间选盘。ReplicaDiskSoftAntiAffinityfalse或卷级disabled时步骤 3 的过滤结果可能为空集此时调度即失败这正是用户故事 2 / 3 所期望的失败要明显可见。用户故事特性解决的实际诉求官方文档通过三个递进的用户故事刻画了特性价值全部围绕单节点 多块 SSD这一核心场景故事 1尽力而为创建任意新卷时希望副本分布到不同磁盘以便承受n - 1块磁盘故障当可用磁盘数少于期望副本数时希望 Longhorn 尽力而为不失败、能调则调。故事 2显式失败同样的场景下当可用磁盘数不足时希望调度明显地失败——用户必须知道卷没有被充分保护以便及时干预。故事 3高优卷显式失败对某个特定的高优先级卷希望强制副本分散磁盘不足时同样要求调度显式失败确保高优先级卷一定处于受保护状态。故事 1 与故事 2/3 的差异正对应全局默认true尽力而为与false/卷级disabled严格拒绝两种语义故事 3 则体现了卷级字段spec.replicaDiskSoftAntiAffinity覆盖全局设置的存在意义。升级策略与兼容性官方文档明确了向后兼容策略全局设置Replica Disk Level Soft Anti-Affinity默认true保持既有行为不变软约束不会让原本能调度的副本突然调度失败仅当设置为false后后续需要调度的新副本才遵循新行为严格拒绝同盘。卷字段spec.replicaDiskSoftAntiAffinity默认ignored同样不影响存量行为仅当在卷上显式设置enabled后该卷后续需要调度的新副本才遵循新行为。两条策略共同保证升级本身不改变任何既有卷的调度结果行为变化只在管理员显式修改配置后才对新调度动作生效。测试计划官方文档建议至少实现两个新测试用例分散性验证在包含多块可用磁盘节点的集群中创建spec.replicaSoftAntiAffinity true、spec.replicaDiskSoftAntiAffinity true、numberOfReplicas等于集群磁盘总数 的卷确认每个副本调度到不同磁盘。测试时可能需要微调附加因素——例如确保存在一块磁盘其空闲空间大到在旧调度逻辑下会把两个副本都分配给它从而验证新逻辑先按副本密度过滤、再按空间选盘确实生效。严格拒绝验证在同样的集群中创建spec.replicaSoftAntiAffinity true、spec.replicaDiskSoftAntiAffinity false、numberOfReplicas比集群磁盘总数多 1 的卷确认有一个副本调度失败。而旧行为下多个副本会调度到同一磁盘且不产生任何错误。运维与观测从仓库中的升级响应器配置可以确认该特性已纳入集群遥测范围升级响应器服务会采集longhornSettingReplicaDiskSoftAntiAffinity全局设置使用情况与longhornVolumeReplicaDiskSoftAntiAffinityTrueCount卷级显式开启的卷数量等指标见 deploy/upgrade_responder_server/chart-values.yaml 与 deploy/upgrade_responder_server/chart-values.yaml便于官方了解该功能的实际采用情况。实践建议单节点集群使用磁盘级反亲和时务必同时确认节点级spec.replicaSoftAntiAffinity已允许同节点多副本否则调度器根本不会把多个副本放到同一节点磁盘级分散无从谈起需要磁盘不足即失败的明确信号时将全局设置设为false或对高优先级卷在卷级显式设置disabled关注副本调度失败事件与卷的调度状态配合 chart/README.md 中的默认设置说明核对配置生效情况。总结Disk Anti-Affinity 为 Longhorn 补上了节点级 → 区域级 → 磁盘级三级副本分散体系中的最后一环。通过全局设置replica-disk-soft-anti-affinity默认true与卷字段spec.replicaDiskSoftAntiAffinity默认ignored可覆盖全局的组合单节点与小规模多节点集群可以在磁盘层面获得接近 RAID 1 的镜像冗余默认尽力把副本打散到不同磁盘磁盘不足时保持既有调度行为显式关闭时则宁可调度失败也要让数据保护缺口清晰可见。官方文档与仓库中的 CRD、Helm 模板及升级响应器遥测配置共同印证了该特性的完整落地形态是提升单节点集群数据安全性的开箱即用能力。赞分享云原生存储高可用容器编排【免费下载链接】longhornCloud-Native distributed storage built on and for Kubernetes项目地址https://gitcode.com/gh_mirrors/lo/longhorn点击查看免费下载相关推荐Kubernetes Scheduler 性能基准测试与剖析完整指南Kubernetes Scheduler 性能基准测试与剖析完整指南 Kubernetes 调度器kube scheduler的性能直接影响集群在大规模节点云原生存储高可用容器编排Karmada 工作负载亲和 / 反亲和调度Workload Affinity / Anti-Affinity完整指南Karmada 工作负载亲和 / 反亲和调度Workload Affinity / Anti Affinity完整指南 导读 Karmada 的 Propa云原生多集群集群管理微服务CloudNativePG 节点亲和性规则优化 PostgreSQL 副本分布CloudNativePG 节点亲和性规则优化 PostgreSQL 副本分布 为什么副本分布是云原生数据库的生命线 当生产环境中单个 Kubernetes云原生数据库高可用灾备容器编排上一篇BabylonJS Spector.js 项目构建与本地开发指南下一篇告别像素模糊Wand阈值操作实战指南含12种算法对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考