Placement Rules 使用文档

article/2025/8/29 19:30:56

注意

本文介绍如何手动在 Placement Driver (PD) 中设置 Placement Rules。推荐使用 Placement Rules in SQL,让你更方便地设置表和分区的放置。

Placement Rules 是 PD 在 4.0 版本引入的一套副本规则系统,用于指导 PD 针对不同类型的数据生成对应的调度。通过组合不同的调度规则,用户可以精细地控制任何一段连续数据的副本数量、存放位置、主机类型、是否参与 Raft 投票、是否可以担任 Raft leader 等属性。

Placement Rules 特性在 TiDB v5.0 及以上的版本中默认开启。如需关闭 Placement Rules 特性,请参考关闭 Placement Rules。

规则系统介绍

整个规则系统的配置由多条规则即 Rule 组成。每条 Rule 可以指定不同的副本数量、Raft 角色、放置位置等属性,以及这条规则生效的 key range。PD 在进行调度时,会先根据 Region 的 key range 在规则系统中查到该 Region 对应的规则,然后再生成对应的调度,来使得 Region 副本的分布情况符合 Rule。

多条规则的 key range 可以有重叠部分的,即一个 Region 能匹配到多条规则。这种情况下 PD 根据 Rule 的属性来决定规则是相互覆盖还是同时生效。如果有多条规则同时生效,PD 会按照规则的堆叠次序依次去生成调度进行规则匹配。

此外,为了满足不同来源的规则相互隔离的需求,支持更灵活的方式来组织规则,还引入了分组 (Group) 的概念。通常情况下,用户可根据规则的不同来源把规则放置在不同的 Group。

Placement Rules 示意图如下所示:

规则字段

以下是每条规则中各个字段的具体含义:

字段名类型及约束说明
GroupIDstring分组 ID,标识规则的来源
IDstring分组内唯一 ID
Indexint分组内堆叠次序
Overridetrue/false是否覆盖 index 的更小 Rule(限分组内)
StartKeystring,十六进制编码适用 Range 起始 key
EndKeystring,十六进制编码适用 Range 终止 key
Rolestring副本角色,包括 leader/follower/learner
Countint,正整数副本数量
LabelConstraint[]Constraint用于按 label 筛选节点
LocationLabels[]string用于物理隔离
IsolationLevelstring用于设置最小强制物理隔离级别

LabelConstraint 与 Kubernetes 中的功能类似,支持通过 innotInexists 和 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 级别的隔离,以此类推。

IsolationLevel 的意义和作用详细请参考配置集群拓扑。例如已配置 LocationLabels 为 [zone,rack,host] 的前提下,设置 IsolationLevel 为 zone,则 PD 在调度时会保证每个 Region 的所有 Peer 均被放置在不同的 zone。假如无法满足 IsolationLevel 的最小强制隔离级别限制(比如配置 3 副本但总共只有 2 个 zone),PD 也不会尝试补足,以满足该限制。IsolationLevel 默认值为空字符串,即禁用状态。

规则分组字段

以下是规则分组字段的含义:

字段名类型及约束说明
IDstring分组 ID,用于标识规则来源
Indexint不同分组的堆叠次序
Overridetrue/false是否覆盖 index 更小的分组

如果不单独设置规则分组,默认 Override=false,对应的行为是不同分组之间相互不影响,不同分组内的规则是同时生效的。

配置规则操作步骤

本节的操作步骤以使用 pd-ctl 工具为例,涉及到的命令也支持通过 HTTP API 进行调用。

开启 Placement Rules 特性

Placement Rules 特性在 TiDB v5.0 及以上的版本中默认开启。如需关闭 Placement Rules 特性,请参考关闭 Placement Rules。如需在关闭后重新开启该特性,可以集群初始化以前设置 PD 配置文件:

 

[replication] enable-placement-rules = true

这样,PD 在初始化成功后会开启这个特性,并根据 max-replicas 及 location-labels 配置生成对应的规则:

 

{ "group_id": "pd", "id": "default", "start_key": "", "end_key": "", "role": "voter", "count": 3, "location_labels": ["zone", "rack", "host"], "isolation_level": "" }

如果是已经初始化过的集群,也可以通过 pd-ctl 进行在线开启:

 

pd-ctl config placement-rules enable

PD 同样将根据系统的 max-replicas 及 location-labels 生成默认的规则。

注意

开启 Placement Rules 后,原先的 max-replicas 及 location-labels 配置项将不再生效。如果需要调整副本策略,应当使用 Placement Rules 相关接口。

关闭 Placement Rules 特性

使用 pd-ctl 可以关闭 Placement Rules 特性,切换为之前的调度策略。

 

pd-ctl config placement-rules disable

注意

关闭 Placement Rules 后,PD 将使用原先的 max-replicas 及 location-labels 配置。在 Placement Rules 开启期间对 Rule 的修改不会导致这两项配置的同步更新。此外,设置好的所有 Rule 都会保留在系统中,会在下次开启 Placement Rules 时被使用。

使用 pd-ctl 设置规则

注意

规则的变更将实时地影响 PD 调度,不恰当的规则设置可能导致副本数较少,影响系统的高可用。

pd-ctl 支持使用多种方式查看系统中的 Rule,输出是 json 格式的 Rule 或 Rule 列表:

  • 查看所有规则列表

     

    pd-ctl config placement-rules show

  • 查看 PD Group 的所有规则列表

     

    pd-ctl config placement-rules show --group=pd

  • 查看对应 Group 和 ID 的某条规则

     

    pd-ctl config placement-rules show --group=pd --id=default

  • 查看 Region 所匹配的规则列表

     

    pd-ctl config placement-rules show --region=2

    上面的例子中 2 为 Region ID。

新增和编辑规则是类似的,需要把对应的规则写进文件,然后使用 save 命令保存至 PD:

 

cat > rules.json <<EOF [ { "group_id": "pd", "id": "rule1", "role": "voter", "count": 3, "location_labels": ["zone", "rack", "host"] }, { "group_id": "pd", "id": "rule2", "role": "voter", "count": 2, "location_labels": ["zone", "rack", "host"] } ] EOF pd-ctl config placement save --in=rules.json

以上操作会将 rule1、rule2 两条规则写入 PD,如果系统中已经存在 GroupID+ID 相同的规则,则会覆盖该规则。

如果需要删除某条规则,只需要将规则的 count 置为 0 即可,对应 GroupID+ID 相同的规则会被删除。以下命令将删除 pd/rule2 这条规则:

 

cat > rules.json <<EOF [ { "group_id": "pd", "id": "rule2" } ] EOF pd-ctl config placement save --in=rules.json

使用 pd-ctl 设置规则分组

  • 查看所有的规则分组列表

     

    pd-ctl config placement-rules rule-group show

  • 查看指定 ID 的规则分组

     

    pd-ctl config placement-rules rule-group show pd

  • 设置规则分组的 index 和 override 属性

     

    pd-ctl config placement-rules rule-group set pd 100 true

  • 删除规则分组配置(如组内还有规则,则使用默认分组配置)

     

    pd-ctl config placement-rules rule-group delete pd

使用 pd-ctl 批量更新分组及组内规则

使用 rule-bundle 子命令,可以方便地同时查看和修改规则分组及组内的所有规则。

该子命令中 get {group_id} 用来查询一个分组,输出结果为嵌套形式的规则分组和组内规则:

 

pd-ctl config placement-rules rule-bundle get pd

输出示例:

 

{ "group_id": "pd", "group_index": 0, "group_override": false, "rules": [ { "group_id": "pd", "id": "default", "start_key": "", "end_key": "", "role": "voter", "count": 3 } ] }

rule-bundle get 子命令中可以添加 --out 参数来将输出写入文件,方便后续修改保存。

 

pd-ctl config placement-rules rule-bundle get pd --out="group.json"

修改完成后,使用 rule-bundle set 子命令将文件中的配置保存至 PD 服务器。与前面介绍的 save 不同,此命令会替换服务器端该分组内的所有规则。

 

pd-ctl config placement-rules rule-bundle set pd --in="group.json"

使用 pd-ctl 查看和修改所有配置

用户还可以使用 pd-ctl 查看和修改所有配置,即把全部配置保存至文件,修改后再覆盖保存。该操作同样使用 rule-bundle 子命令。

下面的命令将所有配置保存至 rules.json 文件:

 

pd-ctl config placement-rules rule-bundle load --out="rules.json"

编辑完文件后,使用下面的命令将配置保存至 PD 服务器:

 

pd-ctl config placement-rules rule-bundle save --in="rules.json"

使用 tidb-ctl 查询表相关的 key range

若需要针对元数据或某个特定的表进行特殊配置,可以通过 tidb-ctl 的 keyrange 命令来查询相关的 key。注意要添加 --encode 返回 PD 中的表示形式。

 

tidb-ctl keyrange --database test --table ttt --encode

 

global ranges: meta: (6d00000000000000f8, 6e00000000000000f8) table: (7400000000000000f8, 7500000000000000f8) table ttt ranges: (NOTE: key range might be changed after DDL) table: (7480000000000000ff2d00000000000000f8, 7480000000000000ff2e00000000000000f8) table indexes: (7480000000000000ff2d5f690000000000fa, 7480000000000000ff2d5f720000000000fa) index c2: (7480000000000000ff2d5f698000000000ff0000010000000000fa, 7480000000000000ff2d5f698000000000ff0000020000000000fa) index c3: (7480000000000000ff2d5f698000000000ff0000020000000000fa, 7480000000000000ff2d5f698000000000ff0000030000000000fa) index c4: (7480000000000000ff2d5f698000000000ff0000030000000000fa, 7480000000000000ff2d5f698000000000ff0000040000000000fa) table rows: (7480000000000000ff2d5f720000000000fa, 7480000000000000ff2e00000000000000f8)

注意

DDL 等操作会导致 table ID 发生变化,需要同步更新对应的规则。

典型场景示例

本部分介绍 Placement Rules 的使用场景示例。

场景一:普通的表使用 3 副本,元数据使用 5 副本提升集群容灾能力

只需要增加一条规则,将 key range 限定在 meta 数据的范围,并把 count 值设为 5。添加规则示例如下:

 

{ "group_id": "pd", "id": "meta", "index": 1, "override": true, "start_key": "6d00000000000000f8", "end_key": "6e00000000000000f8", "role": "voter", "count": 5, "location_labels": ["zone", "rack", "host"] }

场景二:5 副本按 2-2-1 的比例放置在 3 个数据中心,且第 3 个中心不产生 Leader

创建三条规则,分别设置副本数为 2、2、1,并且在每个规则内通过 label_constraints 将副本限定在对应的数据中心内。另外,不需要 leader 的数据中心将 role 改为 follower

 

[ { "group_id": "pd", "id": "zone1", "start_key": "", "end_key": "", "role": "voter", "count": 2, "label_constraints": [ {"key": "zone", "op": "in", "values": ["zone1"]} ], "location_labels": ["rack", "host"] }, { "group_id": "pd", "id": "zone2", "start_key": "", "end_key": "", "role": "voter", "count": 2, "label_constraints": [ {"key": "zone", "op": "in", "values": ["zone2"]} ], "location_labels": ["rack", "host"] }, { "group_id": "pd", "id": "zone3", "start_key": "", "end_key": "", "role": "follower", "count": 1, "label_constraints": [ {"key": "zone", "op": "in", "values": ["zone3"]} ], "location_labels": ["rack", "host"] } ]

场景三:为某张表添加 2 个 TiFlash Learner 副本

为表的 row key 单独添加一条规则,限定数量为 2,并且通过 label_constraints 保证副本产生在 engine=tiflash 的节点。注意这里使用了单独的 group_id,保证这条规则不会与系统中其他来源的规则互相覆盖或产生冲突。

 

{ "group_id": "tiflash", "id": "learner-replica-table-ttt", "start_key": "7480000000000000ff2d5f720000000000fa", "end_key": "7480000000000000ff2e00000000000000f8", "role": "learner", "count": 2, "label_constraints": [ {"key": "engine", "op": "in", "values": ["tiflash"]} ], "location_labels": ["host"] }

场景四:为某张表在有高性能磁盘的北京节点添加 2 个 Follower 副本

这个例子展示了比较复杂的 label_constraints 配置,下面的例子限定了副本放置在 bj1 或 bj2 机房,且磁盘类型不能为 ssd。

 

{ "group_id": "follower-read", "id": "follower-read-table-ttt", "start_key": "7480000000000000ff2d00000000000000f8", "end_key": "7480000000000000ff2e00000000000000f8", "role": "follower", "count": 2, "label_constraints": [ {"key": "zone", "op": "in", "values": ["bj1", "bj2"]}, {"key": "disk", "op": "notIn", "values": ["ssd"]} ], "location_labels": ["host"] }

场景五:将某张表迁移至 SSD 节点

与场景三不同,这个场景不是要在原有配置的基础上增加新副本,而是要强制覆盖一段数据的其它配置,因此需要通过配置规则分组来指定一个足够大的 index 以及设置 override 来覆盖原有规则。

规则:

 

{ "group_id": "ssd-override", "id": "ssd-table-45", "start_key": "7480000000000000ff2d5f720000000000fa", "end_key": "7480000000000000ff2e00000000000000f8", "role": "voter", "count": 3, "label_constraints": [ {"key": "disk", "op": "in", "values": ["ssd"]} ], "location_labels": ["rack", "host"] }

规则分组:

 

{ "id": "ssd-override", "index": 1024, "override": true, }

 


http://chatgpt.dhexx.cn/article/A6Tofpo6.shtml

相关文章

Placement Driver

目录 PD架构 路由功能 TSO分配 时间窗口 调度 Label 例题 PD架构 PD由至少三个节点组成&#xff0c;并集成了ETCD&#xff0c;支持自动故障转移&#xff0c;无需担心单点故障 &#xff1b;同时ETCD raft 保证数据一致性 三个PD节点中有一个leader&#xff0c;当leader出…

Placement

程序功能&#xff1a;进入brd版图环境下的布局显示模式。 快捷键为&#xff1a;p或者P 布局模式&#xff0c;只显示器件的焊盘、器件外形丝印、ROUTE KEEPOUT铜皮、PACKAGE KEEPOUT铜皮和器件的PLACE_BOUND铜皮。

ICC图文流程——(三)布局Placement

ICC布局阶段 在布局规划阶段完成了芯片的整体规划&#xff0c;而布局阶段主要是软件自动的标准单元的摆放。 在布局开始之前&#xff0c;需要对设计进行确认和检查。 主要确认内容包括&#xff1a; 检查设计中的所有macro是否设置为dont_touch属性。在大多数情况下&#xff0…

想要彻底掌握placement各种技巧,这个一定可以如你所愿

想要彻底掌握placement各种技巧&#xff0c;这个一定可以如你所愿&#xff01; 文章右侧广告为官方硬广告&#xff0c;与吾爱IC社区无关&#xff0c;用户勿点。点击进去后出现任何损失与社区无关。 大家应该也都知道最近小编在忙项目&#xff0c;而且是相当的忙&#xff0c;到处…

openstack 【T版】(四)——部署placement

openstack 【T版】&#xff08;四&#xff09;——部署placement 一、Placement概念二、OpenStack-Placement组件部署1.创建数据库实例和数据库用户2.创建placement用户、授权、创建placement服务3.注册API端口到placement的service中&#xff1b;注册的信息会写入到mysql中4.安…

牛血清白蛋白标记微囊藻毒素(MCLR)(BSA-MCLR)

本制品以牛血清白蛋白BSA-微囊藻毒素MCLR经化学交联获得的偶联物。 微囊藻毒素(Microcystin&#xff0c;MC)是一类具有生物活性的环状七肽化合物 MC具有水溶性和耐热性&#xff0c;加热煮沸都不能将毒素破坏&#xff1b;自来水处理工艺的混凝沉淀、过滤、加氯、氧化、活性炭吸…

you-get使用二三谈 (亲测感想 )

1.you-get是什么 you-get是Github上的一个项目&#xff0c;源项目托管地址对其介绍如下&#xff1a;You-Get is a tiny command-line utility to download media contents (videos, audios, images) from the Web, in case there is no other handy way to do it. You-Get是一…

预训练语言模型论文分类整理

© 作者&#xff5c;王晓磊 机构&#xff5c;中国人民大学高瓴人工智能学院博士生 导师&#xff5c;赵鑫教授 研究方向 | 对话系统 1. 引言 近年来&#xff0c;以 BERT 和 GPT 系列为代表的大规模预训练语言模型&#xff08;Pre-trained Language Model, PLM&#…

Antigen for exchange 部署+评测

antigen系列是Forefront系列的早期版本&#xff0c;基本上除了换了个名字意外别的界面都没有换&#xff0c;微软的windows让我们家喻户晓&#xff0c;可是微软做杀毒软件却远不及诺顿等杀软大牌厂商&#xff0c;当微软推出Forefront的时候&#xff0c;又一次的给人以惊喜&#…

Windows10内置Linux子系统初体验

转载自&#xff1a; http://www.jianshu.com/p/bc38ed12da1d WSL 前言 前段时间&#xff0c;机子上的win10又偷偷摸摸升级到了一周年正式版&#xff0c;比较无奈。不过之前听闻这个版本已经支持内置的linux子系统&#xff0c;于是就怀着好奇心试玩了一把。虽然期间遇到了很多问…

《预训练周刊》第29期:Swin Transformer V2:扩大容量和分辨率、SimMIM:用于遮蔽图像建模的简单框架...

No.29 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 本期周刊&#xff0c;我们选择了10篇预训练相关的论文&#xff0c;涉及图像处理、图像屏蔽编码、推荐系统、语言模型解释、多模态表征、多语言建模、推理优化、细胞抗原预测、蛋白结构理解和化学反应的探索。此…

《预训练周刊》第51期:无重构预训练、零样本自动微调、一键调用OPT

No.51 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息&#xff0c;《预训练周刊》已经开启“订阅功能”&#xff0c;以后我们会向您自动推送最新版的《预训练周刊》。订阅方法&#xff1a; 方式1&#xff1a;扫描下面二维码&#xff0c;进入《预…

Antigen for LCS2005

Antigen For LCS2005<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /> Antigen for LCS2005是一款应用于即时通信内的杀毒&#xff0c;防毒软件。 试验拓扑图如下&#xff1a; Berlin是域LCS的域控制器也是DNS服务器&#xff0c;…

forefront for antigen

forefront for antigen antigen软件是保护企业Exchange 2003和Exchange 2000的。可以有效的防止病毒通过邮件的传输来危害计算机&#xff0c;而且antigen软件集合了八家杀毒公司的引擎&#xff0c;是让人心动的一面&#xff0c;如果能把杀毒的工作做好&#xff0c;那是很有潜力…

详解Microsoft Antigen for exchange9.0部署与测试

今天为大家介绍的是Microsoft Forefront系列的早期版本Antiget&#xff0c;Antigen for exchange9.0集成了九款杀毒引擎。微软的windows已经让我们家喻户晓了&#xff0c;当微软推出Forefront的时候&#xff0c;又一次的给人以惊喜&#xff0c;最具有竞争力的就是微软用自己雄厚…

antigen for exchange 部署

今天部署antigen for exchange。这是基于exchange 的安全软件&#xff0c;有扫描邮件病毒的功能&#xff0c;等。搭建exchange 就不说了。 拓扑图如下&#xff0c; <?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /><?xml:namespace pre…

Microsoft Antigen for Exchange 9.0+Exchangesp2 简单搭建与测试

网络的安全性一直是大家所讨论的问题&#xff0c;有完全的安全吗&#xff1f;呵呵&#xff0c;大家都是明白人&#xff0c;明白人不用细说&#xff0c;没有绝对的安全&#xff0c;只有相对意义下的安全&#xff0c;在企业中无所谓一些常用的服务安全性了&#xff0c;对于安全的…

Microsoft Antigen for LCS2005详细部署、客户端测试

前面的博文中我说了下Microsoft Antigen for Exchange搭建&#xff0c;今天我们在来说说微软在Forefront配合LCS详细搭建&#xff0c;大家知道LCS(Live Communications Server)即时通讯产品&#xff0c;和我们用的Q&#xff0c;MSN&#xff0c;旺旺一样&#xff0c;而我们有的企…

详解部署antigen for exchange及配置来实现邮件的安全及优化

详解部署antigen for exchange及实现邮件的安全及优化 现在科学技术越来越发达&#xff0c;竞争越来越激烈&#xff0c;安全成为忧患&#xff0c;尤其是自己发的邮件及给自己的邮件怕被别的公司知道&#xff0c;或者是怕别人利用邮件给自己发一些病毒之类的东西今天我们利用ant…

Antigen Detector(新冠试剂盒检测)

转自AI Studio&#xff0c;原文链接&#xff1a;Antigen Detector&#xff08;新冠试剂盒检测&#xff09; - 飞桨AI Studio 1、检测效果展示 2、Antigener_Detector思路说明 Antigener Detector通过两种方法串行&#xff0c;来完成检测。从而提高阳性样本的召回率。 首先是…