跳转到内容

HA 资源与 affinity 规则 ​

在高可用入门里已经能把一台虚拟机纳入 HA 管理。这篇讲更进一步的问题:它应该优先跑在哪些节点上,以及哪些资源必须(或不能)分布在同一个节点。

本文只覆盖 PVE 9.0 及以后

Proxmox VE 9.0 起,旧的 HA Groups(/etc/pve/ha/groups.cfg)已被标记为弃用,官方文档说明其功能已迁移到 HA Node Affinity 规则。如果你在从 PVE 8.x 升级上来的集群里,已有的 HA Groups 会在升级时自动转换成等价的 node-affinity 规则,旧的命令和 API 目前还能用,但不建议再用来新建配置。具体保留到哪个版本、界面上入口的确切措辞,请以你当前版本的 HA 文档和 Web UI 实际显示为准。

两种规则 ​

规则统一保存在 /etc/pve/ha/rules.cfg,通过 ha-manager rules 管理,有两种类型:

类型解决什么问题默认严格程度
node-affinity(节点亲和)让某些 HA 资源优先跑在指定节点上,可选节点优先级默认是"偏好"而非强制(strict 默认为 0):找不到偏好节点时仍会跑到其他节点
resource-affinity(资源亲和/反亲和)让多个资源必须同节点(正向)或必须不同节点(反向)默认就是严格的(strict by default)

node-affinity:替代旧的 HA Groups ​

sh
# 让虚拟机 100 优先跑在 node1 上(非强制)
ha-manager rules add node-affinity ha-rule-vm100 --resources vm:100 --nodes node1

# 改成强制:只允许在指定节点上运行
ha-manager rules set node-affinity ha-rule-vm100 --strict

以前用 HA Groups 给一批虚拟机设置相同的节点优先级,现在的做法是:建一条node-affinity 规则,把这些虚拟机都加进它的 resources 字段,而不是每个虚拟机建一条规则。

从 HA Groups 迁移过来的两个对应关系

  • 旧的"nofailback"标记,现在是资源级别的 failback 属性(在 /etc/pve/ha/resources.cfg 里,默认值为 1,即故障恢复后自动"失而复得"迁回原节点)。
  • 旧的"这个资源属于哪个 HA Group",现在对应"这个资源出现在哪条 node-affinity 规则的 resources 列表里"。

resource-affinity:新增的资源间约束 ​

sh
# 让 vm:200 和 ct:300 不要跑在同一个节点(反亲和,例如两个互为备份的服务)
ha-manager rules add resource-affinity keep-separate --affinity negative --resources vm:200,ct:300

--affinity 取 positive(尽量放在一起,例如应用和它强依赖的缓存服务)或 negative(尽量分开,例如同一服务的两个副本)。

开始之前 ​

  • 先完成高可用入门,被规则引用的资源需要已经在 HA 管理之下。
  • 规划规则前想清楚:strict 规则更"听话"但也更"脆弱"——如果指定的节点都不可用,严格的 node-affinity 规则会让资源无处可去,而非严格规则至少能跑到别的节点上(即使不是你偏好的)。
  • 涉及节点变化(比如按安全移除节点下线一台机器)时,记得同步清理规则里对它的引用。

修改规则会立即影响正在运行的资源调度

新增或修改 affinity 规则后,下一次该资源发生迁移、恢复或 CRS 重新调度时就会按新规则执行,可能导致资源被迁移到和你预想不同的节点,产生一次迁移带来的短暂负载或(极端情况下)迁移失败。

规则会做冲突检查:如果一条规则和其他规则冲突(比如两条互相矛盾的 node-affinity 规则同时管着一个资源),失败校验的规则会被自动禁用,而不是报错阻止你保存。改完规则后一定要用下面的检查步骤确认规则真的生效了,而不是被静默禁用。

回退方法:ha-manager rules set <规则 ID> --disable(或用 Web UI/命令删除该规则)可以立刻撤销影响,资源会回到"无特殊约束"的默认调度行为。

检查结果 ​

sh
# 查看当前所有规则的配置
ha-manager config

# 查看资源实际所在节点和状态
ha-manager status

确认新加的规则出现在输出里,且没有被标记为禁用状态;再观察被规则约束的资源在一次迁移或重新调度后,是否落在了预期的节点上。

常见问题 ​

PVE 9 里虚拟机的 HA 设置里找不到"Group"选项了。 这是预期变化——Group 已经被 node-affinity 规则取代。现在通常需要先在 数据中心 → HA 层级创建规则并把资源加入其中,而不是在虚拟机自己的 HA 设置页里直接选组,具体入口以你的界面为准。

规则保存后好像没生效。 检查 ha-manager config 里这条规则是否因为和其他规则冲突被系统自动禁用;冲突的规则需要先解决矛盾(比如同一个资源被两条互斥的 node-affinity 规则同时约束)。

想要"尽量均衡分布"而不是固定绑定某个节点。 这不是 affinity 规则要解决的问题,均衡调度见CRS 调度与动态负载均衡。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。