Placement Rules in SQL
该功能可以实现以下业务场景:
- 合并多个不同业务的数据库,大幅减少数据库常规运维管理的成本
- 增加重要数据的副本数,提高业务可用性和数据可靠性
- 将最新数据存入 SSD,历史数据存入 HDD,降低归档数据存储成本
- 把热点数据的 leader 放到高性能的 TiKV 实例上
- 将冷数据分离到不同的存储中以提高可用性
- 支持物理隔离不同用户之间的计算资源,满足实例内部不同用户的隔离需求,以及不同混合负载 CPU、I/O、内存等资源隔离的需求
指定放置规则,首先需要通过 语句创建放置策略 (placement policy)。
然后可以使用 CREATE TABLE
或者 ALTER TABLE
将规则绑定至表或分区表,这样就在表或分区上指定了放置规则:
CREATE TABLE t1 (a INT) PLACEMENT POLICY=myplacementpolicy;
CREATE TABLE t2 (a INT);
ALTER TABLE t2 PLACEMENT POLICY=myplacementpolicy;
PLACEMENT POLICY
为全局作用域,不与任何数据库表结构相关联。因此,通过 CREATE TABLE
指定放置规则时,无需任何额外的权限。
要修改放置策略,你可以使用 ALTER PLACEMENT POLICY
语句。修改将传播到所有绑定此放置策略的对象。
ALTER PLACEMENT POLICY myplacementpolicy FOLLOWERS=5;
要删除没有绑定任何分区或表的放置策略,你可以使用 :
DROP PLACEMENT POLICY myplacementpolicy;
查看放置规则
如果一张表绑定了放置规则,你可以用 来查看。还可以用 SHOW CREATE PLACEMENT POLICY
来查看已经创建的放置策略。
你也可以用 系统表查看所有放置策略的定义。
tidb> select * from information_schema.placement_policies\G
***************************[ 1. row ]***************************
POLICY_ID | 1
CATALOG_NAME | def
POLICY_NAME | p1
REGIONS | us-east-1,us-west-1
CONSTRAINTS |
LEADER_CONSTRAINTS |
FOLLOWER_CONSTRAINTS |
LEARNER_CONSTRAINTS |
SCHEDULE |
FOLLOWERS | 4
LEARNERS | 0
1 row in set
information_schema.tables
表和 information_schema.partitions
表也有一列 tidb_placement_policy_name
,用于展示所有绑定了放置规则的对象:
SELECT * FROM information_schema.tables WHERE tidb_placement_policy_name IS NOT NULL;
SELECT * FROM information_schema.partitions WHERE tidb_placement_policy_name IS NOT NULL;
除以上配置选项外,你还可以使用高级配置,详细介绍见。
示例
max-replicas
配置项的默认值为 3
。如要为特定的表调大该值,可使用配置策略,示例如下:
注意,PD 配置中包含了 leader 数和 follower 数。因此,5 个副本为 4 个 follower + 1 个 leader。
对于以上示例,你还可使用 PRIMARY_REGION
和 REGIONS
选项来描述 follower 的放置规则:
CREATE PLACEMENT POLICY eastandwest PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2,us-west-1" SCHEDULE="MAJORITY_IN_PRIMARY" FOLLOWERS=4;
CREATE TABLE t1 (a INT) PLACEMENT POLICY=eastandwest;
SCHEDULE
选项指示 TiDB 如何平衡 follower。该选项默认的 EVEN
调度规则确保 follower 在所有区域内分布平衡。
如要保证在主区域内 (us-east-1
) 放置足够多的 follower 副本,你可以使用 MAJORITY_IN_PRIMARY
调度规则来使该区域的 follower 达到指定数量。该调度牺牲一些可用性来换取更低的事务延迟。如果主区域宕机,MAJORITY_IN_PRIMARY
无法提供自动故障转移。
CREATE PLACEMENT POLICY p1 FOLLOWERS=5;
CREATE PLACEMENT POLICY europe PRIMARY_REGION="eu-central-1" REGIONS="eu-central-1,eu-west-1";
SET tidb_enable_list_partition = 1;
CREATE TABLE t1 (
country VARCHAR(10) NOT NULL,
userdata VARCHAR(100) NOT NULL
) PLACEMENT POLICY=p1 PARTITION BY LIST COLUMNS (country) (
PARTITION pEurope VALUES IN ('DE', 'FR', 'GB') PLACEMENT POLICY=europe,
PARTITION pNorthAmerica VALUES IN ('US', 'CA', 'MX') PLACEMENT POLICY=northamerica,
PARTITION pAsia VALUES IN ('CN', 'KR', 'JP')
);
如果分区没有绑定任何放置策略,分区将尝试继承表上可能存在的策略。比如,pEurope
分区将会应用 europe
策略,而 pAsia
分区将会应用表 t1
的放置策略 p1
。如果 t1
没有绑定任何策略,pAsia
就不会应用任何策略。
给分区绑定放置策略后,你可以更改指定分区的放置策略。示例如下:
ALTER TABLE t1 PARTITION pEurope PLACEMENT POLICY=p1;
你可以为某个数据库指定默认的放置策略,类似于为数据库设置默认字符集或排序规则。如果没有指定其他选项,就会使用数据库上指定的配置。示例如下:
注意分区与表之间的继承和这里的继承不同。改变表的放置策略,也会让分区应用新的策略。但是只有建表时没有指定放置策略的时候,表才会从数据库继承放置策略,且之后再改变数据库也不影响已经继承的表。
放置选项 PRIMARY_REGION
、REGIONS
和 可满足数据放置的基本需求,但会缺乏一些灵活性。在较复杂的场景下,若需要更灵活地放置数据,可以使用高级放置选项 CONSTRAINTS
和 FOLLOWER_CONSTRAINTS
。PRIMARY_REGION
、REGIONS
和 SCHEDULE
选项不可与 CONSTRAINTS
选项同时指定,否则会报错。
以下示例设置了一个约束,要求数据必须位于某个 TiKV 节点,且该节点的 disk
标签必须匹配特定的值:
CREATE PLACEMENT POLICY storeonfastssd CONSTRAINTS="[+disk=ssd]";
CREATE PLACEMENT POLICY storeonhdd CONSTRAINTS="[+disk=hdd]";
CREATE PLACEMENT POLICY companystandardpolicy CONSTRAINTS="";
CREATE TABLE t1 (id INT, name VARCHAR(50), purchased DATE)
PLACEMENT POLICY=companystandardpolicy
PARTITION BY RANGE( YEAR(purchased) ) (
PARTITION p0 VALUES LESS THAN (2000) PLACEMENT POLICY=storeonhdd,
PARTITION p1 VALUES LESS THAN (2005),
PARTITION p2 VALUES LESS THAN (2010),
PARTITION p3 VALUES LESS THAN (2015),
PARTITION p4 VALUES LESS THAN MAXVALUE PLACEMENT POLICY=storeonfastssd
);
该约束可通过列表格式 ([+disk=ssd]
) 或字典格式 ({+disk=ssd: 1,+disk=hdd: 2}
) 指定。
在列表格式中,约束以键值对列表格式。键以 +
或 -
开头。+disk=ssd
表示 disk
标签必须设为 ssd
,-disk=hdd
表示 disk
标签值不能为 hdd
。
在字典格式中,约束还指定了适用于该规则的多个实例。例如,FOLLOWER_CONSTRAINTS="{+region=us-east-1: 1,+region=us-east-2: 1,+region=us-west-1: 1}";
表示 1 个 follower 位于 us-east-1
,1 个 follower 位于 us-east-2
,1 个 follower 位于 us-west-1
。再例如,FOLLOWER_CONSTRAINTS='{"+region=us-east-1,+disk=hdd": 1,"+region=us-west-1": 1}';
表示 1 个 follower 位于 us-east-1
区域中有 hdd
硬盘的机器上,1 个 follower 位于 us-west-1
。
使用限制
- 临时表不支持放置规则。
- 设置
PRIMARY_REGION
和REGIONS
时允许存在语法糖。但在未来版本中,我们计划为PRIMARY_RACK
、PRIMARY_ZONE
和PRIMARY_HOST
添加变体支持,见 issue #18030。 - 放置规则仅保证静态数据被放置在正确的 TiKV 节点上。该规则不保证传输中的数据(通过用户查询或内部操作)只出现在特定区域内。