规则系统介绍
整个规则系统的配置由多条规则即 Rule 组成。每条 Rule 可以指定不同的副本数量、Raft 角色、放置位置等属性,以及这条规则生效的 key range。PD 在进行调度时,会先根据 Region 的 key range 在规则系统中查到该 Region 对应的规则,然后再生成对应的调度,来使得 Region 副本的分布情况符合 Rule。
多条规则的 key range 可以有重叠部分的,即一个 Region 能匹配到多条规则。这种情况下 PD 根据 Rule 的属性来决定规则是相互覆盖还是同时生效。如果有多条规则同时生效,PD 会按照规则的堆叠次序依次去生成调度进行规则匹配。
此外,为了满足不同来源的规则相互隔离的需求,支持更灵活的方式来组织规则,还引入了分组 (Group) 的概念。通常情况下,用户可根据规则的不同来源把规则放置在不同的 Group。

规则字段
以下是每条规则中各个字段的具体含义:
| 字段名 | 类型及约束 | 说明 |
|---|---|---|
GroupID | string | 分组 ID,标识规则的来源 |
ID | string | 分组内唯一 ID |
Index | int | 分组内堆叠次序 |
Override | true/false | 是否覆盖 index 的更小 Rule(限分组内) |
StartKey | string,十六进制编码 | 适用 Range 起始 key |
EndKey | string,十六进制编码 | 适用 Range 终止 key |
Role | string | 副本角色,包括 leader/follower/learner |
Count | int,正整数 | 副本数量 |
LabelConstraint | []Constraint | 用于按 label 筛选节点 |
LocationLabels | []string | 用于物理隔离 |
IsolationLevel | string | 用于设置最小强制物理隔离级别 |
LabelConstraint 与 Kubernetes 中的功能类似,支持通过 in、notIn、exists 和 notExists 四种原语来筛选 label。这四种原语的意义如下:
in:给定 key 的 label value 包含在给定列表中。notIn:给定 key 的 label value 不包含在给定列表中。exists:包含给定的 label key。notExists:不包含给定的 label key。
LocationLabels 的意义和作用与 PD v4.0 之前的版本相同。比如配置 [zone,rack,host]
定义了三层的拓扑结构:集群分为多个 zone(可用区),每个 zone 下有多个 rack(机架),每个 rack 下有多个
host(主机)。PD 在调度时首先会尝试将 Region 的 Peer 放置在不同的 zone,假如无法满足(比如配置 3 副本但总共只有 2
个 zone)则保证放置在不同的 rack;假如 rack 的数量也不足以保证隔离,那么再尝试 host 级别的隔离,以此类推。




