PlacementRules in SQL 初试

1. 概述

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

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

2. PlacementRules in SQL

2.1 如何使用

        Tidb 5.3版本开始支持直接使用SQL配置放置规则(即placement rule in SQL),以更加灵活、方便的控制表的放置策略,避免使用pd-ctl工具配置的复杂性,放置规则的设置依赖label标签,可通过show placement labels查看当前的label设置和具体值。
image
        使用放置规则时有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 region leader被放到指定region标签的主机上
REGIONS Region follower被放到指定region标签的主机上
FOLLOWERS 指定region followers的数量
SCHEDULE 指定follower的分布策略,默认为EVEN在所有的区域分布。
高级选项 CONSTRAINT 适用于所有角色的region副本,根据label标签进行配置
LEADER_CONSTRAINTS 设置region leader的放置规则
FOLLOWER_CONSTRAINTS 设置region followers的放置规则,必须同时指定FOLLOWERS,CONSTRAINT或LEADER_CONSTRAINTS
LEARNER_CONSTRAINTS 设置region leaners的放置规则

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

2.2 查看方式

        放置规则配置后会将相关信息存于tikv内,可通过show placement或information_schema.placement_rule查看,同时在informatio_schema.tables/partitions里记录了表直接放置选项和放置策略,pd会根据规则设置进行调度以满足要求。
image
        Target: 表示放置选项应用的对象,包括表、分区、库、策略等

        Placement:放置选项的具体内容

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

        NULL:policy的状态一直是null。

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

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

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

3. 测试结果

        本次测试环境如上,有3个数据中心,分别设置region标签为:bj、xian、xn.
image
image
        使用过程中发现目前5.3.0版本存在以下限制情或非预期情况:

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

        2、 数据放置依赖tikv的label标签,使用PRIMARY_REGION、REGIONS放置选项,标签中必须设置region作为一个层级(此处region可以看做一个数据中心)。
image
        3、使用高级放置选项时label标签不需要必须设置region层级标签。
image
        4、 PRIMARY_REGION中只能设置一个region标签值,且该标签值必须在REGIONS设置,否则会报错。高级放置规则中LEADER_CONSTRAINTS同层级的label只能设置1个,否则会产生冲突,该限制导致不能将leader根据数据中心级标签放到2个数据中心。
image
image
        5、 使用高级放置规则时必须设置FOLLOWERS数量否则只有1个raft region
        注: 此处测试时xn,xian 有3个tikv的disk标签为hdd,但无法完成调度满足1 leader+ 2 followers的需求。
image
        6、设置FOLLOWER_CONSTRAINTS必须同时设置FOLLOWERS数量,且raft region follower数量不能大于 FOLLOWERS指定的数量
image
        7、测试过程出现以下非预期情况:

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

        (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,能完成调度
image

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

时间 日志操作
18:47:39.516 [add learner peer 129 on store 11, promote learner peer 129 on store 11 to voter]
18:47:39.516 [step=“add learner peer 129 on store 11”] [source=create]
18:47:39.532 [step=“add learner peer 129 on store 11”] [source=heartbeat]
18:47:40.601 [step=“promote learner peer 129 on store 11 to voter”] [source=heartbeat]
18:47:40.619 steps:[add learner peer 129 on store 11, promote learner peer 129 on store 11 to voter]) finished
18:47:40.628 steps:[transfer leader from store 1 to store 13])""]
18:47:40.695 steps:[transfer leader from store 1 to store 13]) finished\

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的地址

7赞

测试过程好详细,收藏!

小哥威武

大佬666,已收藏

@h5n1

正在根据放置策略进行region调度,当实际环境不满足调度要求时会一直处于该状态,如followers数量大于max_replicas

应该是小于吧, 而且现在placement rules默认开启的情况下, max_replicas其实无效, 全部按照rules里的数量为准.

高级放置规则中LEADER_CONSTRAINTS同层级的label只能设置1个,否则会产生冲突,该限制导致不能将leader根据数据中心级标签放到2个数据中心。

其实是因为语法上有些困难, CONSTRAINTS里都是以逗号分隔的+xx=nn的段落, 这种情况下不好表达+x1=n1,n2,n3,+x2=n4. 但是反过来说, 因为不限制可以用什么标签, 所以你可以+dc=dc1_and_dc2来解决.

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

初版5.3有调度bug, 可以用pd-ctl检查一下rules里有没有isolationlevel相关的字样, 有的话就是碰上了, 升级可解决. 之后的很多测试看起来也可能和此bug有关系.

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

5.4会默认2 follower.

另外建议官方文档中的充完善相关描述,比如具体的调度规则和限制、和PD间的关系和实现、事务执行和提交时如何使用和处理PlacementRule。

值得一试.

  1. ‘’应该是小于吧, 而且现在placement rules默认开启的情况下, max_replicas其实无效, 全部按照rules里的数量为准’ 这块描述发文档时没改刚开始测试时以为跟max_replicas有关,后来发现是没关系的,主要还是和tikv实例数有关系,我把文章里这块改下,但是有时满足条件的tikv实例数>follower数时也不调度不知道为啥。
  2. “初版5.3有调度bug, 可以用pd-ctl检查一下rules里有没有isolationlevel相关的字样, 有的话就是碰上了, 升级可解决. 之后的很多测试看起来也可能和此bug有关系.”
    $ pd-ctl config show all|grep isolation
    “isolation-level”: “”
    另外请教个问题就是 https://github.com/pingcap/tidb/blob/6db56bb5ece37a6abe94e80216006878230d74ed/docs/design/2020-06-24-placement-rules-in-sql.md 文档里有描述会将Placement rule同步到PD,但不知道PD工具怎么查看?
    总之这个功能挺好的,后续成熟了估计会有很多用的。
1赞

pd-ctl config show all|grep isolation

不是这个, 这个是全局的设置, rules自己也有isolation level. 简单来说就说config里面的全局设置一旦开启placement-rules就无效了. 不过后续的话, pd可能还是会把isolation相关的统一改成全局设置. rules里就不再能指定isolationlevel了.

文档里有描述会将Placement rule同步到PD,但不知道PD工具怎么查看?

pd-ctl config placement-rules, 参考这里

如果要测试的话强烈建议用最新的来测, 或者至少是5.4. 因为还有个learner的tikv调度问题也是最近修复的.

1赞

找到了,刚想起来我这机器上2个tidb集群,默认是另一套5.2的,习惯了pd-ctl 工具不带地址,我说之前测试pd-ctl咋看都没有placement-rule,这样就对上了。


另外看系统给自动加了个region层的标签,看来调度还是得依靠该标签
image

那从你这个看, 10.161.67.82的集群是有这个bug的. 合掉的pr是这个link

另外看系统给自动加了个region层的标签,看来调度还是得依靠该标签

location_labels之后可能也会删掉, 和isolationlevel一样变成全局的. 这两个其实都不是必要的, 而是为了满足隔离级别. 但是pd这一侧在调度满足隔离级别时候, 可能会违反placement-rules, 这其实就是你遇到的bug. 如果你通过pd-ctl手动删掉isolationlevel, 就不会出现这种情况了.

测试了下,删除rule的isolation_level后确实能调度,但是使用alter placement policy后又会给rule上添加isolation_level,需要再次删除才行
image

image