diff --git a/TOC.md b/TOC.md index eb976544075a..4fbf3b42216f 100644 --- a/TOC.md +++ b/TOC.md @@ -698,6 +698,7 @@ - [`BACKUP`](/sql-statements/sql-statement-backup.md) - [`BATCH`](/sql-statements/sql-statement-batch.md) - [`BEGIN`](/sql-statements/sql-statement-begin.md) + - [`CALIBRATE RESOURCE`](/sql-statements/sql-statement-calibrate-resource.md) - [`CHANGE COLUMN`](/sql-statements/sql-statement-change-column.md) - [`CHANGE DRAINER`](/sql-statements/sql-statement-change-drainer.md) - [`CHANGE PUMP`](/sql-statements/sql-statement-change-pump.md) @@ -763,6 +764,7 @@ - [`SET DEFAULT ROLE`](/sql-statements/sql-statement-set-default-role.md) - [`SET [NAMES|CHARACTER SET]`](/sql-statements/sql-statement-set-names.md) - [`SET PASSWORD`](/sql-statements/sql-statement-set-password.md) + - [`SET RESOURCE GROUP`](/sql-statements/sql-statement-set-resource-group.md) - [`SET ROLE`](/sql-statements/sql-statement-set-role.md) - [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md) - [`SET [GLOBAL|SESSION] `](/sql-statements/sql-statement-set-variable.md) diff --git a/functions-and-operators/information-functions.md b/functions-and-operators/information-functions.md index c7839eb17ceb..580d2e79715d 100644 --- a/functions-and-operators/information-functions.md +++ b/functions-and-operators/information-functions.md @@ -13,6 +13,7 @@ TiDB 支持使用 MySQL 5.7 中提供的大部分[信息函数](https://dev.mysq | ------ | ---------------------------------------- | | [`BENCHMARK()`](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_benchmark) | 循环执行一个表达式 | | [`CONNECTION_ID()`](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_connection-id) | 返回当前连接的连接 ID (线程 ID) | +| `CURRENT_RESOURCE_GROUP()` | 返回当前连接的资源组名 | | [`CURRENT_USER()`, `CURRENT_USER`](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user) | 返回当前用户的用户名和主机名 | | [`DATABASE()`](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_database) | 返回默认(当前)的数据库名 | | [`FOUND_ROWS()`](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows) | 该函数返回对于一个包含 LIMIT 的 SELECT 查询语句,在不包含 LIMIT 的情况下回返回的记录数 | diff --git a/information-schema/information-schema-resource-groups.md b/information-schema/information-schema-resource-groups.md index bbc9bb94cb16..1c5f5179e761 100644 --- a/information-schema/information-schema-resource-groups.md +++ b/information-schema/information-schema-resource-groups.md @@ -22,6 +22,7 @@ DESC resource_groups; +------------+-------------+------+------+---------+-------+ | NAME | varchar(32) | NO | | NULL | | | RU_PER_SEC | bigint(21) | YES | | NULL | | +| PRIORITY | varchar(6) | YES | | NULL | | | BURSTABLE | varchar(3) | YES | | NULL | | +------------+-------------+------+------+---------+-------+ 3 rows in set (0.00 sec) @@ -33,18 +34,18 @@ DESC resource_groups; mysql> CREATE RESOURCE GROUP rg1 RU_PER_SEC=1000; -- 创建资源组 rg1 Query OK, 0 rows affected (0.34 sec) mysql> SHOW CREATE RESOURCE GROUP rg1; -- 显示 rg1 资源组的定义 -+----------------+---------------------------------------------+ -| Resource_Group | Create Resource Group | -+----------------+---------------------------------------------+ -| rg1 | CREATE RESOURCE GROUP `rg1` RU_PER_SEC=1000 | -+----------------+---------------------------------------------+ ++----------------+---------------------------------------------------------------+ +| Resource_Group | Create Resource Group | ++----------------+---------------------------------------------------------------+ +| rg1 | CREATE RESOURCE GROUP `rg1` RU_PER_SEC=1000 PRIORITY="MEDIUM" | ++----------------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM information_schema.resource_groups WHERE NAME = 'rg1'; -+------+------------+-----------+ -| NAME | RU_PER_SEC | BURSTABLE | -+------+------------+-----------+ -| rg1 | 1000 | NO | -+------+------------+-----------+ ++------+------------+----------+-----------+ +| NAME | RU_PER_SEC | PRIORITY | BURSTABLE | ++------+------------+----------+-----------+ +| rg1 | 1000 | MEDIUM | NO | ++------+------------+----------+-----------+ 1 row in set (0.00 sec) ``` @@ -52,4 +53,5 @@ mysql> SELECT * FROM information_schema.resource_groups WHERE NAME = 'rg1'; * `NAME`:资源组名称。 * `RU_PER_SEC`:资源组的回填速度,单位为每秒回填的 [Request Unit (RU)](/tidb-resource-control.md#什么是-request-unit-ru) 数量。 +* `PRIORITY`:任务在 TiKV 上处理的绝对优先级。不同的资源按照 `PRIORITY` 的设置进行调度,`PRIORITY` 高的任务会被优先调度。如果资源组的 `PRIORITY` 相同,则会根据 `RU_PER_SEC` 的配置按比例调度。如果不指定 `PRIORITY`,资源组的默认优先级为 `MEDIUM`。 * `BURSTABLE`:是否允许此资源组超额使用剩余的系统资源。 diff --git a/optimizer-hints.md b/optimizer-hints.md index 70550a843f4a..5ae0740bef1d 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -804,3 +804,13 @@ SELECT /*+ NTH_PLAN(3) */ count(*) from t where a > 5; > **注意:** > > `NTH_PLAN(N)` 主要用于测试用途,并且在未来不保证其兼容性,请谨慎使用。 + +### RESOURCE_GROUP(resource_group_name) + +`RESOURCE_GROUP(resource_group_name)` 用于[使用资源管控 (Resource Control) 实现资源隔离](/tidb-resource-control.md)。此 Hint 将临时使用指定的资源组执行当前的语句。如果指定的资源组不存在,则该 Hint 将被忽略。 + +示例: + +```sql +SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t limit 10; +``` diff --git a/pd-configuration-file.md b/pd-configuration-file.md index afb7378af7c9..060deaeddf05 100644 --- a/pd-configuration-file.md +++ b/pd-configuration-file.md @@ -447,3 +447,49 @@ PD 中内置的 [TiDB Dashboard](/dashboard/dashboard-intro.md) 相关配置项 + 是否启用 TiDB Dashboard 遥测功能。 + 默认值:false + 参阅[遥测](/telemetry.md)了解该功能详情。 + +## `replication-mode` + +Region 同步模式相关的配置项。更多详情,请参阅[启用自适应同步模式](/two-data-centers-in-one-city-deployment.md#启用自适应同步模式)。 + +## Controllor + +PD 中内置的 [Resource Control](/tidb-resource-control.md) 相关的配置项。 + +### `degraded-mode-wait-duration` + ++ 触发降级模式需要等待的时间。降级模式是指在 Local Token Bucket (LTB) 和 Global Token Bucket (GTB) 失联的情况下,LTB 将回退到默认的资源组配置,不再有 GTB 授权 token,从而保证在网络隔离或者异常情况下,服务不受影响。 ++ 默认值: 0s ++ 默认为不开启降级模式 + +### `request-unit` + +下面是 [Request Unit (RU)](/tidb-resource-control.md#什么是-request-unit-ru) 相关的配置项。 + +#### `read-base-cost` + ++ 每次读请求转换成 RU 的基准系数 ++ 默认值: 0.25 + +#### `write-base-cost` + ++ 每次写请求转换成 RU 的基准系数 ++ 默认值: 1 + +#### `read-cost-per-byte` + ++ 读流量转换成 RU 的基准系数 ++ 默认值: 1/(64 * 1024) ++ 1 RU = 64 KiB 读取字节 + +#### `write-cost-per-byte` + ++ 写流量转换成 RU 的基准系数 ++ 默认值: 1/1024 ++ 1 RU = 1 KiB 写入字节 + +#### `read-cpu-ms-cost` + ++ CPU 转换成 RU 的基准系数 ++ 默认值: 1/3 ++ 1 RU = 3 毫秒 CPU 时间 diff --git a/sql-statements/sql-statement-alter-resource-group.md b/sql-statements/sql-statement-alter-resource-group.md index 2749ae10d8d2..d36ee2f9b735 100644 --- a/sql-statements/sql-statement-alter-resource-group.md +++ b/sql-statements/sql-statement-alter-resource-group.md @@ -26,17 +26,22 @@ ResourceGroupOptionList: DirectResourceGroupOption: "RU_PER_SEC" EqOpt stringLit +| "PRIORITY" EqOpt ResourceGroupPriorityOption | "BURSTABLE" +ResourceGroupPriorityOption: + LOW +| MEDIUM +| HIGH ``` TiDB 支持以下 `DirectResourceGroupOption`, 其中 [Request Unit (RU)](/tidb-resource-control.md#什么是-request-unit-ru) 是 TiDB 对 CPU、IO 等系统资源统一抽象的单位。 | 参数 | 含义 | 举例 | |---------------|--------------|--------------------------------------| -| `RU_PER_SEC` | 每秒 RU 填充的速度 | `RU_PER_SEC = 500` 表示此资源组每秒回填 500 个 RU | - -如果设置了 `BURSTABLE` 属性,TiDB 允许对应的资源组超出配额后使用空余的系统资源。 +| `RU_PER_SEC` | 每秒 RU 填充的速度 | `RU_PER_SEC = 500` 表示此资源组每秒回填 500 个 RU。 | +| `PRIORITY` | 任务在 TiKV 上处理的绝对优先级 | `PRIORITY = HIGH` 表示优先级高。若未指定则默认为 `MEDIUM`。 | +| `BURSTABLE` | 允许对应的资源组超出配额后使用空余的系统资源。 | > **注意:** > @@ -47,28 +52,56 @@ TiDB 支持以下 `DirectResourceGroupOption`, 其中 [Request Unit (RU)](/tidb- 创建一个名为 `rg1` 的资源组,并修改它的属性。 ```sql -mysql> DROP RESOURCE GROUP IF EXISTS rg1; +DROP RESOURCE GROUP IF EXISTS rg1; +``` + +```sql Query OK, 0 rows affected (0.22 sec) -mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 - -> RU_PER_SEC = 100 - -> BURSTABLE; +``` + +```sql +CREATE RESOURCE GROUP IF NOT EXISTS rg1 + RU_PER_SEC = 100 + BURSTABLE; +``` + +```sql Query OK, 0 rows affected (0.08 sec) -mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; -+------+-------------+-----------+ -| NAME | RU_PER_SEC | BURSTABLE | -+------+-------------+-----------+ -| rg1 | 100 | YES | -+------+-------------+-----------+ +``` + +```sql +SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +``` + +```sql ++------+------------+----------+-----------+ +| NAME | RU_PER_SEC | PRIORITY | BURSTABLE | ++------+------------+----------+-----------+ +| rg1 | 100 | MEDIUM | YES | ++------+------------+----------+-----------+ 1 rows in set (1.30 sec) -mysql> ALTER RESOURCE GROUP rg1 - -> RU_PER_SEC = 200; +``` + +```sql +ALTER RESOURCE GROUP rg1 + RU_PER_SEC = 200 + PRIORITY = LOW; +``` + +```sql Query OK, 0 rows affected (0.08 sec) -mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; -+------+-------------+-----------+ -| NAME | RU_PER_SEC | BURSTABLE | -+------+-------------+-----------+ -| rg1 | 200 | NO | -+------+-------------+-----------+ +``` + +```sql +SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +``` + +```sql ++------+------------+----------+-----------+ +| NAME | RU_PER_SEC | PRIORITY | BURSTABLE | ++------+------------+----------+-----------+ +| rg1 | 200 | LOW | NO | ++------+------------+----------+-----------+ 1 rows in set (1.30 sec) ``` diff --git a/sql-statements/sql-statement-calibrate-resource.md b/sql-statements/sql-statement-calibrate-resource.md new file mode 100644 index 000000000000..d4308da1dfc6 --- /dev/null +++ b/sql-statements/sql-statement-calibrate-resource.md @@ -0,0 +1,30 @@ +--- +title: CALIBRATE RESOURCE +summary: TiDB 数据库中 CALIBRATE RESOURCE 的使用概况。 +--- + +# `CALIBRATE RESOURCE` + +`CALIBRATE RESOURCE` 语句用于预估并输出当前集群的 [`Request Unit (RU)`](/tidb-resource-control.md#什么是-request-unit-ru) 的容量。 + +## 语法图 + +```ebnf+diagram +CalibrateResourceStmt ::= 'CALIBRATE' 'RESOURCE' +``` + +## 示例 + +```sql +CALIBRATE RESOURCE; ++-------+ +| QUOTA | ++-------+ +| 68569 | ++-------+ +1 row in set (0.03 sec) +``` + +> **注意:** +> +> 集群 RU 的容量会随集群的拓扑结构和各个组件软硬件配置的变化而变化,每个集群实际能消耗的 RU 还与实际的负载相关。此预估值仅供参考,可能会与实际的最大值存在偏差。 diff --git a/sql-statements/sql-statement-create-resource-group.md b/sql-statements/sql-statement-create-resource-group.md index b8ecc749e4d0..e2d9682c5658 100644 --- a/sql-statements/sql-statement-create-resource-group.md +++ b/sql-statements/sql-statement-create-resource-group.md @@ -26,8 +26,13 @@ ResourceGroupOptionList: DirectResourceGroupOption: "RU_PER_SEC" EqOpt stringLit +| "PRIORITY" EqOpt ResourceGroupPriorityOption | "BURSTABLE" +ResourceGroupPriorityOption: + LOW +| MEDIUM +| HIGH ``` 资源组的 `ResourceGroupName` 是全局唯一的,不允许重复。 @@ -36,35 +41,58 @@ TiDB 支持以下 `DirectResourceGroupOption`, 其中 [Request Unit (RU)](/tidb- | 参数 | 含义 | 举例 | |---------------|--------------|--------------------------------------| -| `RU_PER_SEC` | 每秒 RU 填充的速度 | `RU_PER_SEC = 500` 表示此资源组每秒回填 500 个 RU | - -如果设置了 `BURSTABLE` 属性,TiDB 允许对应的资源组超出配额后使用空余的系统资源。 +| `RU_PER_SEC` | 每秒 RU 填充的速度 | `RU_PER_SEC = 500` 表示此资源组每秒回填 500 个 RU。 | +| `PRIORITY` | 任务在 TiKV 上处理的绝对优先级 | `PRIORITY = HIGH` 表示优先级高。若未指定,则默认为 `MEDIUM`。 | +| `BURSTABLE` | 允许对应的资源组超出配额后使用空余的系统资源。 | > **注意:** > -> `CREATE RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 参数设置为 `ON` 时才能执行。 +> - `CREATE RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 设置为 `ON` 时才能执行。 +> - TiDB 集群在初始化时会自动创建 `default` 资源组,所有未绑定资源组的请求都将自动绑定至此资源组。 ## 示例 创建 `rg1` 和 `rg2` 两个资源组。 ```sql -mysql> DROP RESOURCE GROUP IF EXISTS rg1; +DROP RESOURCE GROUP IF EXISTS rg1; +``` + +```sql Query OK, 0 rows affected (0.22 sec) -mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 - -> RU_PER_SEC = 100 - -> BURSTABLE; +``` + +```sql +CREATE RESOURCE GROUP IF NOT EXISTS rg1 + RU_PER_SEC = 100 + PRIORITY = HIGH + BURSTABLE; +``` + +```sql Query OK, 0 rows affected (0.08 sec) -mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg2 - -> RU_PER_SEC = 200; +``` + +```sql +CREATE RESOURCE GROUP IF NOT EXISTS rg2 + RU_PER_SEC = 200; +``` + +```sql Query OK, 0 rows affected (0.08 sec) -mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1' or NAME = 'rg2'; -+------+-------------+-----------+ -| NAME | RU_PER_SEC | BURSTABLE | -+------+-------------+-----------+ -| rg1 | 100 | YES | -| rg2 | 200 | NO | -+------+-------------+-----------+ +``` + +```sql +SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1' or NAME = 'rg2'; +``` + +```sql ++------+------------+----------+-----------+ +| NAME | RU_PER_SEC | PRIORITY | BURSTABLE | ++------+------------+----------+-----------+ +| rg1 | 100 | HIGH | YES | +| rg2 | 200 | MEDIUM | NO | ++------+------------+----------+-----------+ 2 rows in set (1.30 sec) ``` diff --git a/sql-statements/sql-statement-drop-resource-group.md b/sql-statements/sql-statement-drop-resource-group.md index 07f70cc69d16..b562f4ba86ca 100644 --- a/sql-statements/sql-statement-drop-resource-group.md +++ b/sql-statements/sql-statement-drop-resource-group.md @@ -22,29 +22,55 @@ ResourceGroupName: > **注意:** > -> `DROP RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 参数设置为 `ON` 时才能执行。 +> - `DROP RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 设置为 `ON` 时才能执行。 +> - `default` 资源组为系统保留的资源组,不支持删除。 ## 示例 删除名为 `rg1` 的资源组: ```sql -mysql> DROP RESOURCE GROUP IF EXISTS rg1; +DROP RESOURCE GROUP IF EXISTS rg1; +``` + +```sql Query OK, 0 rows affected (0.22 sec) -mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 500 BURSTABLE; +``` + +```sql +CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 500 BURSTABLE; +``` + +```sql Query OK, 0 rows affected (0.08 sec) -mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; -+------+------------+-----------+ -| NAME | RU_PER_SEC | BURSTABLE | -+------+------------+-----------+ -| rg1 | 500 | YES | -+------+------------+-----------+ +``` + +```sql +SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +``` + +```sql ++------+------------+----------+-----------+ +| NAME | RU_PER_SEC | PRIORITY | BURSTABLE | ++------+------------+----------+-----------+ +| rg1 | 500 | MEDIUM | YES | ++------+------------+----------+-----------+ 1 row in set (0.01 sec) +``` + +```sql +DROP RESOURCE GROUP IF EXISTS rg1; +``` -mysql> DROP RESOURCE GROUP IF EXISTS rg1; +```sql Query OK, 1 rows affected (0.09 sec) +``` + +```sql +SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +``` -mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +```sql Empty set (0.00 sec) ``` diff --git a/sql-statements/sql-statement-set-resource-group.md b/sql-statements/sql-statement-set-resource-group.md new file mode 100644 index 000000000000..cc61bd4f3e2a --- /dev/null +++ b/sql-statements/sql-statement-set-resource-group.md @@ -0,0 +1,88 @@ +--- +title: SET RESOURCE GROUP +summary: TiDB 数据库中 SET RESOURCE GROUP 的使用概况。 +--- + +# SET RESOURCE GROUP + +`SET RESOURCE GROUP` 用于设置当前会话使用的资源组。 + +## 语法图 + +**SetResourceGroupStmt:** + +```ebnf+diagram +SetResourceGroupStmt: + "SET" "RESOURCE" "GROUP" ResourceGroupName + +ResourceGroupName: + Identifier +``` + +## 示例 + +创建一个用户 `user1`,创建两个资源组 `rg1` 和 `rg2`,并将用户 `user1` 绑定资源组 `rg1`。 + +```sql +CREATE USER 'user1'; +CREATE RESOURCE GROUP 'rg1' RU_PER_SEC = 1000; +ALTER USER 'user1' RESOURCE GROUP `rg1`; +``` + +使用 `user1` 登录,查看当前用户绑定的资源组。 + +```sql +SELECT CURRENT_RESOURCE_GROUP(); +``` + +``` ++--------------------------+ +| CURRENT_RESOURCE_GROUP() | ++--------------------------+ +| rg1 | ++--------------------------+ +1 row in set (0.00 sec) +``` + +执行 `SET RESOURCE GROUP` 将当前会话的资源组设置为 `rg2`。 + +```sql +SET RESOURCE GROUP `rg2`; +SELECT CURRENT_RESOURCE_GROUP(); +``` + +``` ++--------------------------+ +| CURRENT_RESOURCE_GROUP() | ++--------------------------+ +| rg2 | ++--------------------------+ +1 row in set (0.00 sec) +``` + +执行 `SET RESOURCE GROUP` 设置当前会话使用默认资源组。 + +```sql +SET RESOURCE GROUP ``; +SELECT CURRENT_RESOURCE_GROUP(); +``` + +``` ++--------------------------+ +| CURRENT_RESOURCE_GROUP() | ++--------------------------+ +| | ++--------------------------+ +1 row in set (0.00 sec) +``` + +## MySQL 兼容性 + +MySQL 也支持 [SET RESOURCE GROUP](https://dev.mysql.com/doc/refman/8.0/en/set-resource-group.html),但是接受的参数和 TiDB 不同,两者并不兼容。 + +## 另请参阅 + +* [CREATE RESOURCE GROUP](/sql-statements/sql-statement-create-resource-group.md) +* [DROP RESOURCE GROUP](/sql-statements/sql-statement-drop-resource-group.md) +* [ALTER RESOURCE GROUP](/sql-statements/sql-statement-alter-resource-group.md) +* [使用资源管控 (Resource Control) 实现资源隔离](/tidb-resource-control.md) diff --git a/sql-statements/sql-statement-show-create-resource-group.md b/sql-statements/sql-statement-show-create-resource-group.md index 683f9f1553e0..814288a2ff7c 100644 --- a/sql-statements/sql-statement-show-create-resource-group.md +++ b/sql-statements/sql-statement-show-create-resource-group.md @@ -29,11 +29,11 @@ Query OK, 0 rows affected (0.10 sec) ```sql SHOW CREATE RESOURCE GROUP rg1; ***************************[ 1. row ]*************************** -+----------------+--------------------------------------------+ -| Resource_Group | Create Resource Group | -+----------------+--------------------------------------------+ -| rg1 | CREATE RESOURCE GROUP `rg1` RU_PER_SEC=100 | -+----------------+--------------------------------------------+ ++----------------+------------------------------------------------------------+ +| Resource_Group | Create Resource Group | ++----------------+------------------------------------------------------------+ +| rg1 | CREATE RESOURCE GROUP `rg1` RU_PER_SEC=100 PRIORITY=MEDIUM | ++----------------+------------------------------------------------------------+ 1 row in set (0.01 sec) ``` diff --git a/system-variables.md b/system-variables.md index a93e7832d641..89841f85fd8c 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1599,15 +1599,11 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 ### `tidb_enable_resource_control` 从 v6.6.0 版本开始引入 -> **警告:** -> -> [资源管控](/tidb-resource-control.md) 目前为实验性特性,此变量定义可能在之后发生变化或者删除。 - - 作用域:GLOBAL - 是否持久化到集群:是 -- 默认值:`OFF` +- 默认值:`ON` - 类型:布尔型 -- 该变量是[资源管控特性](/tidb-resource-control.md)的开关。该变量设置为 `ON` 后,集群支持应用按照资源组做资源隔离。 +- 该变量是[资源管控特性](/tidb-resource-control.md)的开关。该变量设置为 `ON` 时,集群支持应用按照资源组做资源隔离。 ### `tidb_enable_reuse_chunk` 从 v6.4.0 版本开始引入 diff --git a/tidb-resource-control.md b/tidb-resource-control.md index 3e5c8d59385c..aa8573878729 100644 --- a/tidb-resource-control.md +++ b/tidb-resource-control.md @@ -5,16 +5,12 @@ summary: 介绍如何通过资源管控能力来实现对应用资源消耗的 # 使用资源管控 (Resource Control) 实现资源隔离 -> **警告:** -> -> 资源管控是 TiDB 在 v6.6.0 中引入的实验特性,其语法或者行为表现在 GA 前可能会发生变化。 - -使用资源管控特性,集群管理员可以定义资源组 (Resource Group),通过资源组限定读写的配额。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的读写配额对用户的读写请求做流控,TiKV 层会根据读写配额映射的优先级来对请求做调度。通过流控和调度这两层控制,你可以实现应用的资源隔离,满足服务质量 (QoS) 要求。 +使用资源管控特性,集群管理员可以定义资源组 (Resource Group),通过资源组限定读写的配额。 -TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。两个能力可以单独或者同时开启,详情请参见[参数组合效果表](#相关参数)。 +TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。两个能力可以单独或者同时开启,详情请参见[参数组合效果表](#相关参数)。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的读写配额对用户的读写请求做流控,TiKV 层会根据读写配额映射的优先级来对请求做调度。通过流控和调度这两层控制,可以实现应用的资源隔离,满足服务质量 (QoS) 要求。 -- TiDB 流控:TiDB 流控使用[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket) 做流控;如果桶内令牌数不够,而且资源组没有指定 `BURSTABLE` 特性,属于该资源组的请求会等待令牌桶回填令牌并重试,重试可能会超时失败。 -- TiKV 调度:如果开启该特性,TiKV 使用基于资源组 `RU_PER_SEC` 的取值映射成各自资源组读写请求的优先级,基于各自的优先级在存储层使用优先级队列调度处理请求。 +- TiDB 流控:TiDB 流控使用[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket) 做流控。如果桶内令牌数不够,而且资源组没有指定 `BURSTABLE` 特性,属于该资源组的请求会等待令牌桶回填令牌并重试,重试可能会超时失败。 +- TiKV 调度:你可以为资源组设置绝对优先级 ([`PRIORITY`](/information-schema/information-schema-resource-groups.md#示例)),不同的资源按照 `PRIORITY` 的设置进行调度,`PRIORITY` 高的任务会被优先调度。如果没有设置绝对优先级 (`PRIORITY`),TiKV 会将资源组的 `RU_PER_SEC` 取值映射成各自资源组读写请求的优先级,并基于各自的优先级在存储层使用优先级队列调度处理请求。 ## 使用场景 @@ -25,6 +21,13 @@ TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的 此外,合理利用资源管控特性可以减少集群数量,降低运维难度及管理成本。 +## 使用限制 + +目前,资源管控特性具有以下限制: + +- 只支持对前台客户发起的读写请求做限流和调度,不支持对 DDL 以及 Auto Analyze 等后台任务的限流和调度。 +- 资源管控将带来额外的调度开销。因此,开启该特性后,性能可能会有轻微下降。 + ## 什么是 Request Unit (RU) Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位, 目前包括 CPU、IOPS 和 IO 带宽三个指标。这三个指标的消耗会按照一定的比例统一到 RU 单位上。 @@ -47,8 +50,8 @@ Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位, 资源管控特性引入了两个新的全局开关变量: -* TiDB: 通过配置全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 控制是否打开资源组流控。 -* TiKV: 通过配置参数 [`resource-control.enabled`](/tikv-configuration-file.md#resource-control) 控制是否使用基于资源组配额的请求调度。 +- TiDB: 通过配置全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 控制是否打开资源组流控。 +- TiKV: 通过配置参数 [`resource-control.enabled`](/tikv-configuration-file.md#resource-control) 控制是否使用基于资源组配额的请求调度。 这两个参数的组合效果见下表: @@ -61,32 +64,19 @@ Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位, ## 使用方法 +### 管理资源组 + 创建、修改、删除资源组,需要拥有 `SUPER` 或者 `RESOURCE_GROUP_ADMIN` 权限。 -你可以通过 [`CREATE RESOURCE GROUP`](/sql-statements/sql-statement-create-resource-group.md) 在集群中创建资源组,再通过 [`CREATE USER`](/sql-statements/sql-statement-create-user.md) 或 [`ALTER USER`](/sql-statements/sql-statement-alter-user.md) 语句将用户绑定到特定的资源组。 +你可以通过 [`CREATE RESOURCE GROUP`](/sql-statements/sql-statement-create-resource-group.md) 在集群中创建资源组。 对于已有的资源组,可以通过 [`ALTER RESOURCE GROUP`](/sql-statements/sql-statement-alter-resource-group.md) 修改资源组的读写配额,对资源组的配额修改会立即生效。 -可以通过 [`DROP RESOURCE GROUP`](/sql-statements/sql-statement-drop-resource-group.md) 删除资源组。 - -> **注意:** -> -> - `CREATE USER` 或者 `ALTER USER` 对用户资源组绑定后,不会对该用户的已有会话生效,而是只对该用户新建的会话生效。 -> - 如果用户没有绑定到某个资源组或者是绑定到 `default` 资源组,该用户的请求不会受 TiDB 的流控限制。`default` 资源组目前对用户不可见也不可以创建或者修改属性,不能通过 `SHOW CREATE RESOURCE GROUP` 或 `SELECT * FROM information_schema.resource_groups` 查看,但是可以通过 `mysql.user` 表查看。 - -### 第 1 步:开启资源管控特性 +可以使用 [`DROP RESOURCE GROUP`](/sql-statements/sql-statement-drop-resource-group.md) 删除资源组。 -1. 执行以下命令开启资源管控特性: +### 创建资源组 - ```sql - SET GLOBAL tidb_enable_resource_control = 'ON'; - ``` - -2. 将 TiKV 参数 [`resource-control.enabled`](/tikv-configuration-file.md#resource-control) 设为 `true`。 - -### 第 2 步:创建资源组,并绑定用户到资源组 - -下面举例说明如何创建资源组,并绑定用户到资源组。 +下面举例说明如何创建资源组。 1. 创建 `rg1` 资源组,RU 的回填速度是每秒 500 RU,并且允许这个资源组的应用超额占用资源。 @@ -100,20 +90,73 @@ Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位, CREATE RESOURCE GROUP IF NOT EXISTS rg2 RU_PER_SEC = 600; ``` -3. 将用户 `usr1` 和 `usr2` 分别绑定到资源组 `rg1` 和 `rg2`。 +3. 创建 `rg3` 资源组,设置绝对优先级为 `HIGH`。绝对优先级目前支持 `LOW|MEDIUM|HIGH`,资源组的默认绝对优先级为 `MEDIUM`。 ```sql - ALTER USER usr1 RESOURCE GROUP rg1; + CREATE RESOURCE GROUP IF NOT EXISTS rg3 RU_PER_SEC = 100 PRIORITY = HIGH; ``` - ```sql - ALTER USER usr2 RESOURCE GROUP rg2; - ``` +### 绑定资源组 + +TiDB 支持如下三个级别的资源组设置: + +- 用户级别。通过 [`CREATE USER`](/sql-statements/sql-statement-create-user.md) 或 [`ALTER USER`](/sql-statements/sql-statement-alter-user.md) 语句将用户绑定到特定的资源组。绑定后,对应的用户新创建的会话会自动绑定对应的资源组。 +- 会话级别。通过 [`SET RESOURCE GROUP`](/sql-statements/sql-statement-set-resource-group.md) 设置当前会话使用的资源组。 +- 语句级别。通过 [`RESOURCE_GROUP()`](/optimizer-hints.md#resource_groupresource_group_name) 设置当前语句使用的资源组。 + +#### 将用户绑定到资源组 + +下面的示例创建一个用户 `usr1` 并将其绑定到资源组 `rg1`。其中 `rg1` 为[创建资源组](#创建资源组)示例中创建的资源组。 + +```sql +CREATE USER 'usr1'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg1; +``` -完成上述创建资源组和绑定用户的操作后,用户新建立的会话对资源的占用会受到指定用量 (RU) 的限制。如果系统负载比较高,没有多余的容量,`usr2` 用户的资源消耗速度会严格控制不超过指定用量,由于 `usr1` 绑定的 `rg1` 配置了 `BURSTABLE`,所以 `usr1` 消耗速度允许超过指定用量。 +下面示例使用 `ALTER USER` 将用户 `usr2` 绑定到资源组 `rg2`。其中 `rg2` 为[创建资源组](#创建资源组)示例中创建的资源组。 + +```sql +ALTER USER usr2 RESOURCE GROUP rg2; +``` + +绑定用户后,用户新建立的会话对资源的占用会受到指定用量 (RU) 的限制。如果系统负载比较高,没有多余的容量,用户 `usr2` 的资源消耗速度会被严格控制不超过指定用量。由于 `usr1` 绑定的 `rg1` 配置了 `BURSTABLE`,所以 `usr1` 消耗速度允许超过指定用量。 如果资源组对应的请求太多导致资源组的资源不足,客户端的请求处理会发生等待。如果等待时间过长,请求会报错。 +> **注意:** +> +> - 使用 `CREATE USER` 或者 `ALTER USER` 将用户绑定到资源组后,只会对该用户新建的会话生效,不会对该用户已有的会话生效。 +> - TiDB 集群在初始化时会自动创建 `default` 资源组,对于没有绑定资源组的语句会自动绑定至此资源组。此资源组不支持删除,但允许修改其 RU 的配置。 + +#### 将当前会话绑定到资源组 + +通过把当前会话绑定到资源组,会话对资源的占用会受到指定用量 (RU) 的限制。 + +下面的示例将当前的会话绑定至资源组 `rg1`。 + +```sql +SET RESOURCE GROUP rg1; +``` + +#### 将语句绑定到资源组 + +通过在 SQL 语句中添加 [`RESOURCE_GROUP(resource_group_name)`](/optimizer-hints.md#resource_groupresource_group_name) Hint,可以将该语句绑定到指定的资源组。此 Hint 支持 `SELECT`、`INSERT`、`UPDATE`、`DELETE` 四种语句。 + +示例: + +```sql +SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t limit 10; +``` + +## 关闭资源管控特性 + +1. 执行以下命令关闭资源管控特性: + + ```sql + SET GLOBAL tidb_enable_resource_control = 'OFF'; + ``` + +2. 将 TiKV 参数 [`resource-control.enabled`](/tikv-configuration-file.md#resource-control) 设为 `false`,关闭按照资源组配额调度。 + ## 监控与图表 TiDB 会定时采集资源管控的运行时信息,并在 Grafana 的 **Resource Control Dashboard** 中提供了相关指标的可视化图表。指标详情参见 [Resource Control 监控指标详解](/grafana-resource-control-dashboard.md) 。 @@ -122,14 +165,7 @@ TiKV 中也记录了来自于不同资源组的请求 QPS,详见 [TiKV监控 ## 工具兼容性 -资源管控目前为实验特性,不影响数据导入导出以及其他同步工具的正常使用,BR、TiDB Lightning、TiCDC 等工具不支持对资源管控相关 DDL 的处理,这些工具的资源消耗也不受资源管控的限制。 - -## 使用限制 - -目前,资源管控特性具有以下限制: - -* 暂时只支持对前台客户发起的读写请求做限流和调度,不支持对 DDL 以及 Auto Analyze 等后台任务的限流和调度。 -* 资源管控将带来额外的调度开销。因此,开启该特性后,性能可能会有轻微下降。 +资源管控目前不影响数据导入导出以及其他同步工具的正常使用,BR、TiDB Lightning、TiCDC 等工具不支持对资源管控相关 DDL 的处理,这些工具的资源消耗也不受资源管控的限制。 ## 另请参阅 diff --git a/tikv-configuration-file.md b/tikv-configuration-file.md index c01ec7b71b6c..6af3e1f3709e 100644 --- a/tikv-configuration-file.md +++ b/tikv-configuration-file.md @@ -2232,4 +2232,4 @@ Raft Engine 相关的配置项。 + 是否支持对用户前台的读写请求按照对应的资源组配额做优先级调度。有关 TiDB 资源组和资源管控的信息,请参考 [TiDB 资源管控](/tidb-resource-control.md) + 在 TiDB 侧开启 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 全局变量的情况下,开启这个配置项才有意义。此配置参数开启后,TiKV 会使用优先级队列对排队的用户前台读写请求做调度,调度的优先级和请求所在资源组已经消费的资源量反相关,和对应资源组的配额正相关。 -+ 默认值:false(即关闭按照资源组配额调度) ++ 默认值:true(即开启按照资源组配额调度)