Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove direct placement #8230

Merged
merged 17 commits into from
Mar 18, 2022
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions information-schema/information-schema-placement-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ summary: 了解 information_schema 表 `PLACEMENT_RULES`。

# PLACEMENT_RULES

`PLACEMENT_RULES` 表展示所有已显式配置的 [Placement Rules in SQL](/placement-rules-in-sql.md) 信息,包括通过放置策略 (placement policy) 和通过直接放置 (directly placement) 进行配置的信息
`PLACEMENT_RULES` 表展示所有已显式配置的 [Placement Rules in SQL](/placement-rules-in-sql.md) 信息,即所有放置策略 (placement policy) 的信息
xhebox marked this conversation as resolved.
Show resolved Hide resolved

{{< copyable "sql" >}}

Expand Down Expand Up @@ -39,17 +39,16 @@ DESC placement_rules;

## 示例

`PLACEMENT_RULES` 表只展示显式配置的规则。如要查看 Placement Rules 放置规则的规范版本(包括附加到表格的放置策略),请改用 `SHOW PLACEMENT` 语句:
`PLACEMENT_RULES` 表只展示已显式配置的规则。如要查看 Placement Rules 放置规则的规范版本(包括绑定了对象的放置策略),请改用 `SHOW PLACEMENT` 语句:

{{< copyable "sql" >}}

```sql
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (a INT) primary_region="us-east-1" regions="us-east-1";
CREATE PLACEMENT POLICY p1 primary_region="us-east-1" regions="us-east-1";
CREATE TABLE t3 (a INT) PLACEMENT POLICY=p1;
SHOW PLACEMENT; -- 包含 t3
SELECT * FROM information_schema.placement_rules; -- 不包含 t3
CREATE TABLE t2 (a INT) PLACEMENT POLICY=p1;
SHOW PLACEMENT; -- 包含 t2
SELECT * FROM information_schema.placement_rules; -- 不包含 t2
```

```sql
Expand All @@ -66,15 +65,13 @@ Query OK, 0 rows affected (0.11 sec)
+---------------+------------------------------------------------+
| POLICY p1 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1" |
| TABLE test.t2 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1" |
| TABLE test.t3 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1" |
+---------------+------------------------------------------------+
3 rows in set (0.00 sec)
2 rows in set (0.00 sec)

+-----------+--------------+-------------+-------------+------------+----------------+----------------+-----------+-------------+--------------------+----------------------+---------------------+----------+-----------+----------+
| POLICY_ID | CATALOG_NAME | POLICY_NAME | SCHEMA_NAME | TABLE_NAME | PARTITION_NAME | PRIMARY_REGION | REGIONS | CONSTRAINTS | LEADER_CONSTRAINTS | FOLLOWER_CONSTRAINTS | LEARNER_CONSTRAINTS | SCHEDULE | FOLLOWERS | LEARNERS |
+-----------+--------------+-------------+-------------+------------+----------------+----------------+-----------+-------------+--------------------+----------------------+---------------------+----------+-----------+----------+
| 3 | def | p1 | NULL | NULL | NULL | us-east-1 | us-east-1 | | | | | | 0 | 0 |
| NULL | def | NULL | test | t2 | NULL | us-east-1 | us-east-1 | | | | | | 0 | 0 |
+-----------+--------------+-------------+-------------+------------+----------------+----------------+-----------+-------------+--------------------+----------------------+---------------------+----------+-----------+----------+
2 rows in set (0.00 sec)
```
83 changes: 61 additions & 22 deletions placement-rules-in-sql.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ summary: 了解如何通过 SQL 接口调度表和分区的放置位置。

Placement Rules in SQL 特性用于通过 SQL 接口配置数据在 TiKV 集群中的放置位置。通过该功能,用户可以将表和分区指定部署至不同的地域、机房、机柜、主机。适用场景包括低成本优化数据高可用策略、保证本地的数据副本可用于本地 Stale Read 读取、遵守数据本地要求等。
xhebox marked this conversation as resolved.
Show resolved Hide resolved

> **注意:**
> Placement Rules in SQL 底层实现依赖 PD 提供的放置规则 (placement rules) 功能,参考 [Placement Rules 使用文档](/configure-placement-rules.md)。在 Placement Rules in SQL 语境下,放置规则既可以代指绑定对象的放置策略 (placement policy),也可以代指 TiDB 发给 PD 的放置规则。
xhebox marked this conversation as resolved.
Show resolved Hide resolved

该功能可以实现以下业务场景:

- 合并多个不同业务的数据库,大幅减少数据库常规运维管理的成本
Expand All @@ -19,23 +22,51 @@ Placement Rules in SQL 特性用于通过 SQL 接口配置数据在 TiKV 集群
- 把热点数据的 leader 放到高性能的 TiKV 实例上
- 将冷数据分离到不同的存储中以提高可用性

## 指定放置选项
## 指定放置规则

指定放置规则,首先需要创建*放置策略 (placement policy)*。
xhebox marked this conversation as resolved.
Show resolved Hide resolved

要使用 Placement Rules in SQL 特性,你需要在 SQL 语句中指定一个或多个放置选项 (placement option)。可通过*直接放置 (direct placement)* 或*放置策略 (placement policy)* 来指定放置选项。
```sql
CREATE PLACEMENT POLICY myplacementpolicy PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-west-1";
```

以下示例中,表 `t1` 和 `t2` 的放置规则相同。`t1` 是通过直接放置指定的规则,而 `t2` 是通过放置策略来指定的规则。
然后可以使用 `CREATE TABLE` 或者 `ALTER TABLE` 将规则绑定至表或分区表,这样就在表或分区上指定了放置规则:

```sql
CREATE TABLE t1 (a INT) PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-west-1";
CREATE PLACEMENT POLICY eastandwest PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-west-1";
CREATE TABLE t2 (a INT) PLACEMENT POLICY=eastandwest;
CREATE TABLE t1 (a INT) PLACEMENT POLICY myplacementpolicy;
CREATE TABLE t2 (a INT);
ALTER TABLE t2 PLACEMENT POLICY myplacementpolicy;
```

为了能够更轻松地管理放置规则,推荐使用放置策略来指定规则。当你通过 [`ALTER PLACEMENT POLICY`](/sql-statements/sql-statement-alter-placement-policy.md) 更改放置策略后,此更改会自动传播至所有数据库对象
`PLACEMENT POLICY` 为全局作用域,不与任何数据库表结构相关联。因此,通过 `CREATE TABLE` 指定放置规则时,无需任何额外的权限

如果你使用直接放置选项,你需要为每个对象(例如表和分区)都单独更改放置规则。
## 查看放置规则

如果一张表绑定了放置规则,你可以用 `SHOW CREATE TABLE` 来查看。还可以用 `SHOW CREATE PLACEMENT POLICY` 来查看已经创建的规则。

```sql
tidb> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`myplacementpolicy` */
1 row in set (0.00 sec)
tidb> SHOW CREATE PLACEMENT POLICY myplacementpolicy\G
*************************** 1. row ***************************
Policy: myplacementpolicy
Create Policy: CREATE PLACEMENT POLICY myplacementpolicy PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-west-1"
1 row in set (0.00 sec)
```

`PLACEMENT POLICY` 为全局作用域,不与任何数据库表结构相关联。因此,通过 `CREATE TABLE` 指定放置策略时,无需任何额外的权限。
`information_schema.tables` 表和 `information_schema.partitions` 表也有一列 `tidb_placement_policy_name`,用于展示所有绑定了放置规则的对象:

```sql
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;
```

所有绑定规则的对象都是异步调度的。可以用 [`SHOW PLACEMENT`](/sql-statements/sql-statement-show-placement.md) 来查看放置规则的调度进度。

## 放置选项参考

Expand All @@ -62,7 +93,7 @@ CREATE TABLE t2 (a INT) PLACEMENT POLICY=eastandwest;
| `SCHEDULE` | 用于调度 follower 放置位置的策略。可选值为 `EVEN`(默认值)或 `MAJORITY_IN_PRIMARY`。 |
| `FOLLOWERS` | Follower 的数量。例如 `FOLLOWERS=2` 表示数据有 3 个副本(2 个 follower 和 1 个 leader)。 |

除以上配置选项外,你还可以使用高级配置,详细介绍见[高级放置](#高级放置)。
除以上配置选项外,你还可以使用高级配置,详细介绍见[高级放置选项](#高级放置选项)。

| 选项名 | 描述 |
|----------------------------|------------------------------------------------------------------------------------------------|
Expand Down Expand Up @@ -99,7 +130,7 @@ CREATE TABLE t1 (a INT) PLACEMENT POLICY=eastandwest;
>
> 以下示例使用的 List 分区目前为 TiDB 实验特性。在表的分区功能中,要求主键里包含所有分区函数中使用的列。

除了将放置选项分配给表之外,你还可以将选项分配给表分区。示例如下:
除了给表绑定放置策略之外,你还可以给表分区绑定放置策略。示例如下:

```sql
CREATE PLACEMENT POLICY europe PRIMARY_REGION="eu-central-1" REGIONS="eu-central-1,eu-west-1";
Expand All @@ -117,25 +148,33 @@ CREATE TABLE t1 (

### 为数据库配置默认的放置规则

你可以为某个数据库指定默认的放置选项,类似于为数据库设置默认字符集或排序规则。如果没有指定其他选项,就会使用数据库上指定的配置。示例如下:
你可以为某个数据库指定默认的放置策略,类似于为数据库设置默认字符集或排序规则。如果没有指定其他选项,就会使用数据库上指定的配置。示例如下:

```sql
CREATE TABLE t1 (a INT); -- 创建表 t1,且未指定放置选项。
CREATE PLACEMENT POLICY p1 PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2"; -- 创建放置策略

CREATE PLACEMENT POLICY p2 FOLLOWERS=4;

CREATE PLACEMENT POLICY p3 FOLLOWERS=2;

CREATE TABLE t1 (a INT); -- 创建表 t1,且未指定放置规则。
xhebox marked this conversation as resolved.
Show resolved Hide resolved

ALTER DATABASE test POLICY=p2; -- 更改默认的放置规则,但更改不影响已有的表 t1。

ALTER DATABASE test FOLLOWERS=4; -- 更改默认的放置选项,但更改不影响已有的表 t1
CREATE TABLE t2 (a INT); -- 创建表 t2,默认的放置策略 p2 在 t2 上生效

CREATE TABLE t2 (a INT); -- 创建表 t2,默认的放置规则 FOLLOWERS=4 在 t2 上生效
CREATE TABLE t3 (a INT) POLICY=p1; -- 创建表 t3。因为语句中已经指定了其他放置规则,默认的 p2 策略在 t3 上不生效

CREATE TABLE t3 (a INT) PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2"; -- 创建表 t3。因为语句中已经指定了其他放置规则,默认的 FOLLOWERS=4 规则在 t3 上不生效
ALTER DATABASE test POLICY=p3; -- 再次更改默认的放置规则,此更改不影响已有的表

ALTER DATABASE test FOLLOWERS=2; -- 再次更改默认的放置选项,此更改不影响已有的表
CREATE TABLE t4 (a INT); -- 创建表 t4,默认的放置策略 p3 生效
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
CREATE TABLE t4 (a INT); -- 创建表 t4,默认的放置策略 p3 生效。
CREATE TABLE t4 (a INT); -- 创建表 t4,默认的放置规则 p3 生效。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

故意的, p3是策略, 所以这个不改规则.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里英文中是 rules

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那我改一下英文

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creates a table t4 with the default policy p3. 不对啊就是policy


CREATE TABLE t4 (a INT); -- 创建表 t4,默认的放置规则 FOLLOWERS=2 生效
ALTER PLACEMENT POLICY p3 FOLLOWERS=3; -- 绑定策略 p3 的表,也就是t4,会采用 FOLLOWERS=3
xhebox marked this conversation as resolved.
Show resolved Hide resolved
```

由于只有在创建表时才会从数据库继承放置选项,因此推荐使用 `PLACEMENT POLICY` 放置策略来设置默认的放置选项。使用后,用户可以通过改动放置策略,改变继承自数据库的放置选项
用户可以通过改变放置策略 [ALTER PLACEMENT POLICY](/sql-statements/sql-statement-alter-placement-policy.md),改变已从数据库继承放置规则的表
xhebox marked this conversation as resolved.
Show resolved Hide resolved

### 高级放置
### 高级放置选项

放置选项 `PRIMARY_REGION`、`REGIONS` 和 `SCHEDULE` 可满足数据放置的基本需求,但会缺乏一些灵活性。在较复杂的场景下,若需要更灵活地放置数据,可以使用高级放置选项 `CONSTRAINTS` 和 `FOLLOWER_CONSTRAINTS`。`PRIMARY_REGION`、`REGIONS` 和 `SCHEDULE` 选项不可与 `CONSTRAINTS` 选项同时指定,否则会报错。

Expand Down Expand Up @@ -171,9 +210,9 @@ PARTITION BY RANGE( YEAR(purchased) ) (

目前已知 Placement Rules in SQL 实验特性存在以下限制:

* Dumpling 不支持导出放置策略,见 [issue #29371](https://github.com/pingcap/tidb/issues/29371)。
* Dumpling 不支持导出放置规则,见 [issue #29371](https://github.com/pingcap/tidb/issues/29371)。
xhebox marked this conversation as resolved.
Show resolved Hide resolved
* TiDB 生态工具,包括 Backup & Restore (BR)、TiCDC、TiDB Lightning 和 TiDB Data Migration (DM),不支持放置规则。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

目前生态工具的情况是,Lightning 目前不支持放置规则。CDC/Binlog 不会同步 placement 到下游数据库。BR 支持 placement (In review:https://github.com/pingcap/tidb/pull/33007)需要修改下当前文档的描述。

之后需要 @IANTHEREAL @leoppro @sunzhaoyang 看下?

* 临时表不支持放置选项,直接放置和放置策略均不支持
* 临时表不支持放置规则
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里英文写的是“placement options”,不知需要把这里的“规则”改回为“选项”,还是改英文的“option”呢?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我觉得不改也行, 这两个都是一种意思. 中文更抽象, 英文更具体.

* 设置 `PRIMARY_REGION` 和 `REGIONS` 时允许存在语法糖。但在未来版本中,我们计划为 `PRIMARY_RACK`、`PRIMARY_ZONE` 和 `PRIMARY_HOST` 添加变体支持,见 [issue #18030](https://github.com/pingcap/tidb/issues/18030)。
* 不能通过放置规则语法配置 TiFlash 副本。
* 放置规则仅保证静态数据被放置在正确的 TiKV 节点上。该规则不保证传输中的数据(通过用户查询或内部操作)只出现在特定区域内。
17 changes: 12 additions & 5 deletions sql-statements/sql-statement-alter-placement-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@ summary: TiDB 数据库中 ALTER PLACEMENT POLICY 的使用概况。
>
> Placement Rules in SQL 是 TiDB 在 v5.3.0 中引入的实验特性,其语法在 GA 前可能会发生变化,还可能存在 bug。如果你知晓潜在的风险,可通过执行 `SET GLOBAL tidb_enable_alter_placement = 1;` 来开启该实验特性。

`ALTER PLACEMENT POLICY` 用于修改已创建的放置策略。此修改会自动更新至所有使用这些放置策略的表和分区。
`ALTER PLACEMENT POLICY` 用于修改已创建的放置策略。此修改会自动更新至所有绑定这些放置策略的表和分区。

`ALTER PLACEMENT POLICY` 会*完全替换*之前定义的规则,而不会和之前的规则*合并*,比如在下面的例子中,`FOLLOWERS=4` 就被 `ALTER PLACEMENT POLICY` 语句覆盖了:
xhebox marked this conversation as resolved.
Show resolved Hide resolved

```sql
CREATE PLACEMENT POLICY p1 FOLLOWERS=4;
ALTER PLACEMENT POLICY p1 PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-west-1";
```

## 语法图

Expand All @@ -21,11 +28,11 @@ PolicyName ::=
Identifier

PlacementOptionList ::=
DirectPlacementOption
| PlacementOptionList DirectPlacementOption
| PlacementOptionList ',' DirectPlacementOption
PlacementOption
| PlacementOptionList PlacementOption
| PlacementOptionList ',' PlacementOption

DirectPlacementOption ::=
PlacementOption ::=
"PRIMARY_REGION" EqOpt stringLit
xhebox marked this conversation as resolved.
Show resolved Hide resolved
| "REGIONS" EqOpt stringLit
| "FOLLOWERS" EqOpt LengthNum
Expand Down
10 changes: 5 additions & 5 deletions sql-statements/sql-statement-create-placement-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ summary: TiDB 数据库中 CREATE PLACEMENT POLICY 的使用概况。
>
> Placement Rules in SQL 是 TiDB 在 v5.3.0 中引入的实验特性,其语法在 GA 前可能会发生变化,还可能存在 bug。如果你知晓潜在的风险,可通过执行 `SET GLOBAL tidb_enable_alter_placement = 1;` 来开启该实验特性。
`CREATE PLACEMENT POLICY` 用于创建命名的放置策略,随后可以将该策略分配给表、分区或数据库
`CREATE PLACEMENT POLICY` 用于创建命名的放置策略,随后可以将该策略绑定到表、分区或数据库上

## 语法图

Expand All @@ -21,11 +21,11 @@ PolicyName ::=
Identifier
PlacementOptionList ::=
DirectPlacementOption
| PlacementOptionList DirectPlacementOption
| PlacementOptionList ',' DirectPlacementOption
PlacementOption
| PlacementOptionList PlacementOption
| PlacementOptionList ',' PlacementOption
DirectPlacementOption ::=
PlacementOption ::=
"PRIMARY_REGION" EqOpt stringLit
| "REGIONS" EqOpt stringLit
| "FOLLOWERS" EqOpt LengthNum
Expand Down
8 changes: 4 additions & 4 deletions sql-statements/sql-statement-drop-placement-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,20 @@ PolicyName ::=

## 示例

删除放置策略时,确保该策略未被任何表或分区引用,否则会删除失败。
删除放置规则时,确保该策略未被任何表或分区引用,否则会删除失败。

{{< copyable "sql" >}}

```sql
CREATE PLACEMENT POLICY p1 FOLLOWERS=4;
CREATE TABLE t1 (a INT PRIMARY KEY) PLACEMENT POLICY=p1;
DROP PLACEMENT POLICY p1; -- 该语句执行失败,因为放置策略 p1 被引用。
DROP PLACEMENT POLICY p1; -- 该语句执行失败,因为放置规则 p1 被引用。

-- 查看引用放置策略的表和分区
-- 查看引用放置规则的表和分区
SELECT table_schema, table_name FROM information_schema.tables WHERE tidb_placement_policy_name='p1';
SELECT table_schema, table_name FROM information_schema.partitions WHERE tidb_placement_policy_name='p1';

ALTER TABLE t1 PLACEMENT POLICY=default; -- 移除表 t1 上的默认放置策略
ALTER TABLE t1 PLACEMENT POLICY=default; -- 移除表 t1 上的默认放置规则
DROP PLACEMENT POLICY p1; -- 执行成功。
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ summary: TiDB 数据库中 SHOW CREATE PLACEMENT POLICY 的使用概况。
>
> Placement Rules in SQL 是 TiDB 在 v5.3.0 中引入的实验特性,其语法在 GA 前可能会发生变化,还可能存在 bug。如果你知晓潜在的风险,可通过执行 `SET GLOBAL tidb_enable_alter_placement = 1;` 来开启该实验特性。
`SHOW CREATE PLACEMENT POLICY` 语句可用于查看放置策略当前的定义,并在另一个 TiDB 集群中重新创建该策略。
`SHOW CREATE PLACEMENT POLICY` 语句可用于查看放置规则当前的定义,并在另一个 TiDB 集群中重新创建该策略。

## 语法图

Expand Down
Loading