写点什么

PlacementRules in SQL 初试

  • 2022 年 7 月 11 日
  • 本文字数:2543 字

    阅读完需:约 8 分钟

作者: h5n1 原文来源:https://tidb.net/blog/2dd85a80

1. 概述

        TiDB 4.0 版本开始推出 Placement Rule(放置规则) 功能,是用于控制 region 副本调度的一套规则系统,通过 placementrule 可以控制某段连续数据的副本数、位置、region 类型等,以满足不同的数据分布需求,默认集群初始化完成后会有一个默认的控制副本数的 placement rule。5.0 版本前该功能为默认关闭,且官方建议仅在 tiflash 上使用。


        Placement rule 使用时需要 json 格式的配置文件,并通过 pd-ctl 工具设置和查看,需要设置好规则的应用顺序,操作较为繁琐且不便于理解, 比如要设置某个表的放置规则时需要使用 key range 作为条件,当有多个小表位于同一 region 时可能会影响其他表。


2. PlacementRules in SQL

2.1 如何使用

        Tidb 5.3 版本开始支持直接使用 SQL 配置放置规则 (即 placement rule in SQL),以更加灵活、方便的控制表的放置策略,避免使用 pd-ctl 工具配置的复杂性,放置规则的设置依赖 label 标签,可通过 show placement labels 查看当前的 label 设置和具体值。



        使用放置规则时有 2 种方式


        (1) 直接放置


        直接放置是指在 create table 时或使用 alter table 方式直接在表的 DDL 语句中使用放置选项,从而达到设置表的放置规则目的。


        Create table t (id int) primary_region=’beijing’ folllowers=4


        (2) 放置策略


        使用放置策略时首先通过 create placement policy 建立放置策略,然后在 create table 或 alter table 中直接指定放置策略。放置策略在删除时必须没有对象在引用该策略,否则无法删除。


        Create placement policy bj_policy primary_region=’beijing’ folllowers=4;


        Alter table t placement policy bj_policy;


        放置规则不仅可以用于表级设置,也可以对分区和库设置,当设置库级放置策略后,默认库下的所有表都会继承库级规则,库级和表级同时设置时表级规则生效。分区和索引继承表的放置规则,但不能单独对索引设置规则。


        放置选项根据实现的功能复杂度可以分为基本选项和高级选项



PRIMARY_REGION、REGIONS 、 SCHEDULE 选项不可与 CONSTRAINTS 选项同时指定,否则会报错。

2.2 查看方式

        放置规则配置后会将相关信息存于 tikv 内,可通过 show placement 或 information_schema.placement_rule 查看,同时在 informatio_schema.tables/partitions 里记录了表直接放置选项和放置策略,pd 会根据规则设置进行调度以满足要求。



        Target: 表示放置选项应用的对象,包括表、分区、库、策略等


        Placement:放置选项的具体内容


        Schedule_state: 当前对象上放置规则的应用状态,


        NULL:policy 的状态一直是 null。


        INPROGRESS:正在根据放置策略进行 region 调度,当实际环境不满足调度要求时会一直处于该状态。


        SCHEDULED: 已经按放置规则完成调度。


        PENDING: 放置规则没有语法错误,但是在当前集群拓扑无法调度

3. 测试结果

        本次测试环境如上,有 3 个数据中心,分别设置 region 标签为:bj、xian、xn.




        使用过程中发现目前 5.3.0 版本存在以下限制情或非预期情况:


        1、 当前默认不允许对表设置放置规则,需全局启用变量 tidb_enable_alter_placement


        2、 数据放置依赖 tikv 的 label 标签,使用 PRIMARY_REGION、REGIONS 放置选项,标签中必须设置 region 作为一个层级 (此处 region 可以看做一个数据中心)。



        3、使用高级放置选项时 label 标签不需要必须设置 region 层级标签。



        4、 PRIMARY_REGION 中只能设置一个 region 标签值,且该标签值必须在 REGIONS 设置,否则会报错。高级放置规则中 LEADER_CONSTRAINTS 同层级的 label 只能设置 1 个,否则会产生冲突,该限制导致不能将 leader 根据数据中心级标签放到 2 个数据中心。




        5、 使用高级放置规则时必须设置 FOLLOWERS 数量否则只有 1 个 raft region


        注: 此处测试时 xn,xian 有 3 个 tikv 的 disk 标签为 hdd,但无法完成调度满足 1 leader+ 2 followers 的需求。



        6、设置 FOLLOWER_CONSTRAINTS 必须同时设置 FOLLOWERS 数量,且 raft region follower 数量不能大于 FOLLOWERS 指定的数量



        7、测试过程出现以下非预期情况:


        (1) followers=4 时,设置非 leader region 中心存储 2 个副本可以完成调度,设置 followers=6 时不能完成调度,:




        (2) 设置 follower=3,leader 为 region=bj, follower 按如下:


        a. 设置 bj=1,xian=2, 不能完成调度。


        b. 设置 xn=1,xian=2, 不能完成调度。


        c. 设置 xn=1,xian=1, 能完成调度


        d. 设置 bj=1,xian=1, 能完成调度



      (3) 设置 label 为 2 个中心,其中 xian 中心 4 个 disk=hdd 标签,放置规则仅在 hdd 上,follower=2,系统不能完成调度。查看 pd 日志,region 在目标 label 主机创建 peer 和 transfer leader 后不再产生调度,导致此时有 3 个 follower。通过 leader_constraints/fowllower_constraints 也无法将 region 全部放到同一数据中心。



4. 总结

        PlacementRule in SQL 增加了配置放置规则的灵活性,通过放置规则可以实现类似存储分层、数据中心就近读取、关键表增加副本数等实用性功能,作为实验特性还有一些不完善的地方,出现非预期情况,另外建议官方文档中的充完善相关描述,比如具体的调度规则和限制、和 PD 间的关系和实现、事务执行和提交时如何使用和处理 PlacementRule。


参考文档:


https://docs.pingcap.com/zh/tidb/stable/placement-rules-in-sql/#placement-rules-in-sql

上述测试过程如有错误之处,还请指正!

2022.2.7 补充:配置的 placement rules 会从 tikv 同步到 pd,可使用 pd-ctl config placement-rules show 查看,注意 PD 的地址


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
PlacementRules in SQL 初试_TiDB 社区干货传送门_InfoQ写作社区