如何使用 TiDB 中的 Placement Rules 功能
作者: 数据源的 TiDB 学习之路原文来源:https://tidb.net/blog/3bd668f2
TiDB 中的 Placement Driver(简称”PD”)是整个集群的大脑,它的能力包括:集群 TiKV 元数据存储、分配全局 ID 和事务 ID、生成全局时间戳 TSO、收集集群信息进行调度、提供 Label 标签等能力。在 TiDB 4.0 版本中,PD 模块引入了一套副本规则系统-Placement Rules,它可以用来指导 PD 生成对应的调度。本文具体描述 Placement Rules 的概念及如何使用 Placement Rules 来进行副本的管理调度。
一.Placement Rules 解决什么问题?
Placement Rules 定义不同规则来指定不同数据范围(range)的副本数量、Raft 角色、放置位置等属性,这些规则会在 PD 进行调度的时候使用以生成对应的调度,最终使 Region 副本的分布与规则定义一致。
二.规则有哪些属性?
为了满足不同来源的规则隔离的要求,TiDB 对规则引入了组(group)的概念,也就是说我们可以定义某个规则是属于哪个 group,不同的规则可以属于相同的 group。
定义一个规则时,我们需要组合利用以下这些属性:
1. Group_id:规则所属组的 id
2. Id:规则 id
3. Group_index:组内堆叠次序
4. Group_override:是否覆盖 index 的更小 Rule
5. Start_key:规则适用的数据范围的 start key
6. End_key:规则适用的数据范围的 end key
7. Role:副本角色,如 voter/leader/follower/learner
8. Count:副本数量
9. LabelConstraint:用于按 Label 筛选节点,支持 in/notIn/exists/notExists
10. LocationLabels:用于物理隔离
11. IsolationLevel:用于设置最小强制物理隔离级别,默认为空
三.怎么查看一个集群当前的规则?
上面的描述还是太偏概念性,以一个实际的环境为例,我们怎么知道这个集群当前的 Placement Rules 是怎么设置的。由于 Placement Rules 是集成在 PD 中的功能,我们可以使用 pd-ctl 工具来查看,也可以使用 tiup ctl:<version> pd 命令来查看,具体语法可参考官网文档 PD Control 使用说明 | PingCAP 文档中心。下图展示某集群的规则信息:
通过 config placement-rules show 命令,查看到当前集群只有一个 default 规则,所有数据采用 3 副本且每个副本都是 voter 角色。config placement-rules rule-bundle 命令可以方便地同时查看和修改规则分组及组内的所有规则。
四.怎么修改一个集群的规则?
集群的 Placement Rules 是可以新增或修改的,新增或修改规则是通过编辑规则文件并保存到 pd 中实现,规则也可以直接导出成 json 格式文件。
-- 导出规则,使 –out 生成 json 文件
-- 修改规则,使 –save 载入 json 文件
五.如何验证规则是否生效?
规则成功修改后,使用 config placement-rules show 便能看到修改后的规则。根据规则内容,我们的预期是三个副本分别放置于 dc1、dc2 和 dc3,且 Leader 默认只放置于 dc1 之上。当 dc1 故障后,Leader 会优先切换到 dc2 之上,因为 dc2 的 role 为 voter。
通过 Grafana 中的 leader 图表,我们发现当应用了新的规则后,所有的 Leader 都迁移到 dc1,验证了我们的猜想。
而当 dc1 故障时,所有的 Leader 切换到 dc2 上面,也符合我们的预期。
当 dc1 重新恢复后,Leader 又会自动切换到 dc1 上面。
至此,我们通过一个简单的示例演示如何配置 Placement Rules 来模拟一个三数据中心三个副本的故障恢复场景。相信通过以上内容介绍,大家对使用 Placement Rules 来影响 PD 调度从而实现精细化调度副本以及进一步实现多地多中心有了进一步的认识。另外关于 Placement Rules 的具体使用文档,读者可以参考 Placement Rules 使用文档 | PingCAP 文档中心 章节获取详细内容。
六.加载规则遇到的问题?
首次加载 rules.json 时失败,报错为: [400] “[PD:placement:ErrRuleContent]invalid rule content, rule ‘dc1’ from rule group ‘pd’ can not match any store”,这是因为我们虽然设置了每个规则的 label_constraints 及 location_labels,但在此之前我们并没有给集群拓扑配置 labels。因此,在配置 Placement Rules 之前,需要提前配置 labels。关于根据集群拓扑配置 labels,可参考官网 通过拓扑 label 进行副本调度 | PingCAP 文档中心。
之前我们了解过 tiup 工具可以使用 edit-config 来修改集群配置,这里我们便使用 tiup cluster edit-config <cluster-name> 的方式来增加 PD/TiKV 的 labels 并重新 reload 生效,主要配置 PD 和 TiKV(如果有 TiFlash 的话也需要配置)。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/bdf238799eb4890e25b7e6b7e】。文章转载请联系作者。
评论