From a4ff65c08e174b51f7c564be90d0781c4d7ed19d Mon Sep 17 00:00:00 2001 From: BornChanger <97348524+BornChanger@users.noreply.github.com> Date: Fri, 17 Feb 2023 12:12:02 +0800 Subject: [PATCH] sql-infra: document for resource control feature (#12655) --- TOC.md | 7 + grafana-resource-control-dashboard.md | 36 +++++ grafana-tikv-dashboard.md | 3 + .../information-schema-processlist.md | 83 ++++++----- .../information-schema-resource-groups.md | 55 +++++++ mysql-compatibility.md | 8 + privilege-management.md | 12 ++ .../sql-statement-alter-resource-group.md | 83 +++++++++++ sql-statements/sql-statement-alter-user.md | 14 +- .../sql-statement-create-resource-group.md | 79 ++++++++++ sql-statements/sql-statement-create-user.md | 20 ++- .../sql-statement-drop-resource-group.md | 59 ++++++++ ...ql-statement-show-create-resource-group.md | 49 ++++++ .../sql-statement-show-privileges.md | 94 +++++++----- system-variables.md | 12 ++ tidb-resource-control.md | 139 ++++++++++++++++++ tikv-configuration-file.md | 10 ++ 17 files changed, 685 insertions(+), 78 deletions(-) create mode 100644 grafana-resource-control-dashboard.md create mode 100644 information-schema/information-schema-resource-groups.md create mode 100644 sql-statements/sql-statement-alter-resource-group.md create mode 100644 sql-statements/sql-statement-create-resource-group.md create mode 100644 sql-statements/sql-statement-drop-resource-group.md create mode 100644 sql-statements/sql-statement-show-create-resource-group.md create mode 100644 tidb-resource-control.md diff --git a/TOC.md b/TOC.md index 64bf56e93f0a..54bd3259f775 100644 --- a/TOC.md +++ b/TOC.md @@ -156,6 +156,7 @@ - [使用 Dumpling 和 TiDB Lightning 备份与恢复](/backup-and-restore-using-dumpling-lightning.md) - [备份与恢复 RawKV](/br/rawkv-backup-and-restore.md) - [增量备份与恢复](/br/br-incremental-guide.md) + - [使用资源管控 (Resource Control) 实现资源隔离](/tidb-resource-control.md) - [修改时区](/configure-time-zone.md) - [日常巡检](/daily-check.md) - [TiFlash 常用运维操作](/tiflash/maintain-tiflash.md) @@ -630,6 +631,7 @@ - [TiKV 面板](/grafana-tikv-dashboard.md) - [TiFlash 监控指标](/tiflash/monitor-tiflash.md) - [TiCDC 监控指标](/ticdc/monitor-ticdc.md) + - [Resource Control 监控指标](/grafana-resource-control-dashboard.md) - 安全加固 - [为 TiDB 客户端服务端间通信开启加密传输](/enable-tls-between-clients-and-servers.md) - [为 TiDB 组件间通信开启加密传输](/enable-tls-between-components.md) @@ -669,6 +671,7 @@ - [`ALTER INDEX`](/sql-statements/sql-statement-alter-index.md) - [`ALTER INSTANCE`](/sql-statements/sql-statement-alter-instance.md) - [`ALTER PLACEMENT POLICY`](/sql-statements/sql-statement-alter-placement-policy.md) + - [`ALTER RESOURCE GROUP`](/sql-statements/sql-statement-alter-resource-group.md) - [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md) - [`ALTER TABLE COMPACT`](/sql-statements/sql-statement-alter-table-compact.md) - [`ALTER USER`](/sql-statements/sql-statement-alter-user.md) @@ -684,6 +687,7 @@ - [`CREATE DATABASE`](/sql-statements/sql-statement-create-database.md) - [`CREATE INDEX`](/sql-statements/sql-statement-create-index.md) - [`CREATE PLACEMENT POLICY`](/sql-statements/sql-statement-create-placement-policy.md) + - [`CREATE RESOURCE GROUP`](/sql-statements/sql-statement-create-resource-group.md) - [`CREATE ROLE`](/sql-statements/sql-statement-create-role.md) - [`CREATE SEQUENCE`](/sql-statements/sql-statement-create-sequence.md) - [`CREATE TABLE LIKE`](/sql-statements/sql-statement-create-table-like.md) @@ -700,6 +704,7 @@ - [`DROP DATABASE`](/sql-statements/sql-statement-drop-database.md) - [`DROP INDEX`](/sql-statements/sql-statement-drop-index.md) - [`DROP PLACEMENT POLICY`](/sql-statements/sql-statement-drop-placement-policy.md) + - [`DROP RESOURCE GROUP`](/sql-statements/sql-statement-drop-resource-group.md) - [`DROP ROLE`](/sql-statements/sql-statement-drop-role.md) - [`DROP SEQUENCE`](/sql-statements/sql-statement-drop-sequence.md) - [`DROP STATS`](/sql-statements/sql-statement-drop-stats.md) @@ -750,6 +755,7 @@ - [`SHOW [FULL] COLUMNS FROM`](/sql-statements/sql-statement-show-columns-from.md) - [`SHOW CONFIG`](/sql-statements/sql-statement-show-config.md) - [`SHOW CREATE PLACEMENT POLICY`](/sql-statements/sql-statement-show-create-placement-policy.md) + - [`SHOW CREATE RESOURCE GROUP`](/sql-statements/sql-statement-show-create-resource-group.md) - [`SHOW CREATE SEQUENCE`](/sql-statements/sql-statement-show-create-sequence.md) - [`SHOW CREATE TABLE`](/sql-statements/sql-statement-show-create-table.md) - [`SHOW CREATE DATABASE`](/sql-statements/sql-statement-show-create-database.md) @@ -877,6 +883,7 @@ - [`PLACEMENT_POLICIES`](/information-schema/information-schema-placement-policies.md) - [`PROCESSLIST`](/information-schema/information-schema-processlist.md) - [`REFERENTIAL_CONSTRAINTS`](/information-schema/information-schema-referential-constraints.md) + - [`RESOURCE_GROUPS`](/information-schema/information-schema-resource-groups.md) - [`SCHEMATA`](/information-schema/information-schema-schemata.md) - [`SEQUENCES`](/information-schema/information-schema-sequences.md) - [`SESSION_VARIABLES`](/information-schema/information-schema-session-variables.md) diff --git a/grafana-resource-control-dashboard.md b/grafana-resource-control-dashboard.md new file mode 100644 index 000000000000..eb1e6e15fda1 --- /dev/null +++ b/grafana-resource-control-dashboard.md @@ -0,0 +1,36 @@ +--- +title: 资源管控 (Resource Control) 监控指标详解 +summary: 了解资源管控 (Resource Control) 的 Grafana Dashboard 中所展示的关键指标。 +--- + +# 资源管控 (Resource Control) 监控指标详解 + +使用 TiUP 部署 TiDB 集群时,可以一键部署监控系统 (Prometheus & Grafana)。监控架构请参见 [TiDB 监控框架概述](/tidb-monitoring-framework.md)。 + +目前 Grafana Dashboard 整体分为 PD、TiDB、TiKV、Node_exporter、Overview、Performance_overview 等。 + +如果你的集群配置了 [Resource Control](/tidb-resource-control.md) ,通过观察 Resource Control 面板上的 Metrics,你可以了解当前集群整体的资源消耗状态。 + +以下为 **Resource Control** 关键监控指标的说明。 + +## Request Unit 相关指标 + +- RU:以 Resource Group 为单位进行实时统计的 [Request Unit (RU)](/tidb-resource-control.md#什么是-request-unit-ru) 消耗信息。`total` 为当前所有 Resource Group 消耗的 Request Unit 之和。每个 Resource Group 的 Request Unit 消耗等于其读消耗 (Read Request Unit) 和写消耗 (Write Request Unit) 之和。 +- RU Per Query:平均每个 SQL 语句消耗的 Request Unit 数量。计算方法是将前述 Request Unit 监控指标除以当前每秒执行的 SQL 语句数量。 +- RRU:以 Resource Group 为单位进行实时统计的读请求 Read Request Unit 消耗信息。`total` 为当前所有 Resource Group 消耗的 Read Request Unit 之和。 +- RRU Per Query:平均每个 SQL 语句消耗的 Read Request Unit 数量。计算方法是将前述 Read Request Unit 监控指标除以当前每秒执行的 SQL 语句数量。 +- WRU:以 Resource Group 为单位进行实时统计的写请求 Write Request Unit 消耗信息。`total` 为当前所有 Resource Group 消耗的 Write Request Unit 之和。 +- WRU Per Query:平均每个 SQL 语句消耗的 Write Request Unit 数量。计算方法是将前述 Write Request Unit 监控指标除以当前每秒执行的 SQL 语句数量。 + +## 资源相关指标 + +- KV Request Count:以 Resource Group 为单位进行实时统计的 KV 请求数量,区分了读和写两种类型。`total` 为当前所有 Resource Group 涉及的 KV 请求数量之和。 +- KV Request Count Per Query:平均每个 SQL 语句涉及的读写 KV 请求数量。计算方法是将前述 KV Request Count 监控指标除以当前每秒执行的 SQL 语句数量。 +- Bytes Read:以 Resource Group 为单位进行实时统计的读取数据量。`total` 为当前所有 Resource Group 读取数据量之和。 +- Bytes Read Per Query:平均每个 SQL 语句的读取数据量。将前述 Bytes Read 监控指标除以当前每秒执行的 SQL 语句数量。 +- Bytes Written:以 Resource Group 为单位进行实时统计的写入数据量。`total` 为当前所有 Resource Group 写入数据量之和。 +- Bytes Written Per Query:平均每个 SQL 语句的写入数据量。计算方法是将前述 Bytes Written 监控指标除以当前每秒执行的 SQL 语句数量。 +- KV CPU Time:以 Resource Group 为单位进行实时统计的 KV 层 CPU 时间消耗。`total` 为当前所有 Resource Group 消耗 KV 层 CPU 时间之和。 +- KV CPU Time Per Query:平均每个 SQL 语句的 KV 层 CPU 时间消耗之和。计算方法是将前述 KV CPU Time 监控指标除以当前每秒执行的 SQL 语句数量。 +- SQL CPU Time:以 Resource Group 为单位进行实时统计的 SQL 层 CPU 时间消耗。`total` 为当前所有 Resource Group 消耗 SQL 层 CPU 时间之和。 +- SQL CPU Time Per Query:平均每个 SQL 语句的 SQL 层 CPU 时间消耗之和。计算方法是将前述 SQL CPU Time 监控除以当前每秒执行的 SQL 语句数量。 diff --git a/grafana-tikv-dashboard.md b/grafana-tikv-dashboard.md index 4107dac94e9a..ed82bb26c1a1 100644 --- a/grafana-tikv-dashboard.md +++ b/grafana-tikv-dashboard.md @@ -68,6 +68,9 @@ aliases: ['/docs-cn/dev/grafana-tikv-dashboard/','/docs-cn/dev/reference/key-mon - Average gRPC message duration:gRPC 请求平均的执行时间 - gRPC batch size:TiDB 与 TiKV 之间 grpc 请求的 batch 大小 - raft message batch size:TiKV 与 TiKV 之间 raft 消息的 batch 大小 +- gRPC request sources QPS: 不同 gRPC 请求来源的速度 +- gRPC request sources duration: 不同 gRPC 请求来源的执行总时间 +- gRPC resource group QPS: 不同 resource group 的 gRPC 请求速度 ### Thread CPU diff --git a/information-schema/information-schema-processlist.md b/information-schema/information-schema-processlist.md index b65b091c9dbe..2a425ee98437 100644 --- a/information-schema/information-schema-processlist.md +++ b/information-schema/information-schema-processlist.md @@ -13,7 +13,8 @@ aliases: ['/docs-cn/dev/information-schema/information-schema-processlist/'] * `DIGEST` 列:显示 SQL 语句的 digest。 * `MEM` 列:显示正在处理的请求已使用的内存,单位是 byte。 * `DISK` 列:显示磁盘空间使用情况,单位是 byte。 -* `TxnStart`列:显示事务的开始时间 +* `TxnStart`列:显示事务的开始时间。 +* `RESOURCE_GROUP`列:显示对应的资源组名称。 {{< copyable "sql" >}} @@ -23,23 +24,24 @@ DESC processlist; ``` ```sql -+----------+---------------------+------+------+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+----------+---------------------+------+------+---------+-------+ -| ID | bigint(21) unsigned | NO | | 0 | | -| USER | varchar(16) | NO | | | | -| HOST | varchar(64) | NO | | | | -| DB | varchar(64) | YES | | NULL | | -| COMMAND | varchar(16) | NO | | | | -| TIME | int(7) | NO | | 0 | | -| STATE | varchar(7) | YES | | NULL | | -| INFO | longtext | YES | | NULL | | -| DIGEST | varchar(64) | YES | | | | -| MEM | bigint(21) unsigned | YES | | NULL | | -| DISK | bigint(21) unsigned | YES | | NULL | | -| TxnStart | varchar(64) | NO | | | | -+----------+---------------------+------+------+---------+-------+ -12 rows in set (0.00 sec) ++---------------------+---------------------+------+------+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++---------------------+---------------------+------+------+---------+-------+ +| ID | bigint(21) unsigned | NO | | 0 | | +| USER | varchar(16) | NO | | | | +| HOST | varchar(64) | NO | | | | +| DB | varchar(64) | YES | | NULL | | +| COMMAND | varchar(16) | NO | | | | +| TIME | int(7) | NO | | 0 | | +| STATE | varchar(7) | YES | | NULL | | +| INFO | longtext | YES | | NULL | | +| DIGEST | varchar(64) | YES | | | | +| MEM | bigint(21) unsigned | YES | | NULL | | +| DISK | bigint(21) unsigned | YES | | NULL | | +| TxnStart | varchar(64) | NO | | | | +| RESOURCE_GROUP | varchar(32) | NO | | | | ++---------------------+---------------------+------+------+---------+-------+ +13 rows in set (0.00 sec) ``` {{< copyable "sql" >}} @@ -50,16 +52,19 @@ SELECT * FROM processlist\G ```sql *************************** 1. row *************************** - ID: 16 - USER: root - HOST: 127.0.0.1 - DB: information_schema - COMMAND: Query - TIME: 0 - STATE: autocommit - INFO: SELECT * FROM processlist - MEM: 0 -TxnStart: + ID: 2300033189772525975 + USER: root + HOST: 127.0.0.1:51289 + DB: NULL + COMMAND: Query + TIME: 0 + STATE: autocommit + INFO: SELECT * FROM processlist + DIGEST: dbfaa16980ec628011029f0aaf0d160f4b040885240dfc567bf760d96d374f7e + MEM: 0 + DISK: 0 + TxnStart: + RESOURCE_GROUP: rg1 1 row in set (0.00 sec) ``` @@ -76,7 +81,8 @@ TxnStart: * `DIGEST` 列:SQL 语句的 digest。 * `MEM` 列:正在处理的请求已使用的内存,单位是 byte。 * `DISK` 列:磁盘空间使用情况,单位是 byte。 -* `TxnStart`列:显示事务的开始时间 +* `TxnStart`列:显示事务的开始时间。 +* `RESOURCE_GROUP`列:显示对应的资源组名称。 ## CLUSTER_PROCESSLIST @@ -89,13 +95,14 @@ SELECT * FROM cluster_processlist; ``` ```sql -+-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+ -| INSTANCE | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | MEM | TxnStart | -+-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+ -| 10.0.1.22:10080 | 150 | u1 | 10.0.1.1 | test | Query | 0 | autocommit | select count(*) from usertable | 372 | 05-28 03:54:21.230(416976223923077223) | -| 10.0.1.22:10080 | 138 | root | 10.0.1.1 | test | Query | 0 | autocommit | SELECT * FROM information_schema.cluster_processlist | 0 | 05-28 03:54:21.230(416976223923077220) | -| 10.0.1.22:10080 | 151 | u1 | 10.0.1.1 | test | Query | 0 | autocommit | select count(*) from usertable | 372 | 05-28 03:54:21.230(416976223923077224) | -| 10.0.1.21:10080 | 15 | u2 | 10.0.1.1 | test | Query | 0 | autocommit | select max(field0) from usertable | 496 | 05-28 03:54:21.230(416976223923077222) | -| 10.0.1.21:10080 | 14 | u2 | 10.0.1.1 | test | Query | 0 | autocommit | select max(field0) from usertable | 496 | 05-28 03:54:21.230(416976223923077225) | -+-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+ ++-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+----------------+ +| INSTANCE | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | MEM | TxnStart | RESOURCE_GROUP | ++-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+----------------+ + +| 10.0.1.22:10080 | 150 | u1 | 10.0.1.1 | test | Query | 0 | autocommit | select count(*) from usertable | 372 | 05-28 03:54:21.230(416976223923077223) | default | +| 10.0.1.22:10080 | 138 | root | 10.0.1.1 | test | Query | 0 | autocommit | SELECT * FROM information_schema.cluster_processlist | 0 | 05-28 03:54:21.230(416976223923077220) | rg1 | +| 10.0.1.22:10080 | 151 | u1 | 10.0.1.1 | test | Query | 0 | autocommit | select count(*) from usertable | 372 | 05-28 03:54:21.230(416976223923077224) | rg2 | +| 10.0.1.21:10080 | 15 | u2 | 10.0.1.1 | test | Query | 0 | autocommit | select max(field0) from usertable | 496 | 05-28 03:54:21.230(416976223923077222) | default | +| 10.0.1.21:10080 | 14 | u2 | 10.0.1.1 | test | Query | 0 | autocommit | select max(field0) from usertable | 496 | 05-28 03:54:21.230(416976223923077225) | default | ++-----------------+-----+------+----------+------+---------+------+------------+------------------------------------------------------+-----+----------------------------------------+----------------+ ``` diff --git a/information-schema/information-schema-resource-groups.md b/information-schema/information-schema-resource-groups.md new file mode 100644 index 000000000000..bbc9bb94cb16 --- /dev/null +++ b/information-schema/information-schema-resource-groups.md @@ -0,0 +1,55 @@ +--- +title: RESOURCE_GROUPS +summary: 了解 information_schema 表 `RESOURCE_GROUPS`。 +--- + +# RESOURCE_GROUPS + +> **警告:** +> +> 资源管控是 TiDB 在 v6.6.0 中引入的实验特性,其语法或者行为表现在 GA 前可能会发生变化。 + +`RESOURCE_GROUPS` 表展示所有资源组 (resource group) 的信息,见[使用资源管控 (Resource Control) 实现资源隔离](/tidb-resource-control.md)。 + +```sql +USE information_schema; +DESC resource_groups; +``` + +```sql ++------------+-------------+------+------+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++------------+-------------+------+------+---------+-------+ +| NAME | varchar(32) | NO | | NULL | | +| RU_PER_SEC | bigint(21) | YES | | NULL | | +| BURSTABLE | varchar(3) | YES | | NULL | | ++------------+-------------+------+------+---------+-------+ +3 rows in set (0.00 sec) +``` + +## 示例 + +```sql +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 | ++----------------+---------------------------------------------+ +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 | ++------+------------+-----------+ +1 row in set (0.00 sec) +``` + +`RESOURCE_GROUPS` 表中列的含义如下: + +* `NAME`:资源组名称。 +* `RU_PER_SEC`:资源组的回填速度,单位为每秒回填的 [Request Unit (RU)](/tidb-resource-control.md#什么是-request-unit-ru) 数量。 +* `BURSTABLE`:是否允许此资源组超额使用剩余的系统资源。 diff --git a/mysql-compatibility.md b/mysql-compatibility.md index 3a325c1e5541..7513dba24c08 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -216,3 +216,11 @@ TiDB 不支持 MySQL 中标记为弃用的功能,包括: * 指定浮点类型的精度。MySQL 8.0 [弃用](https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html)了此功能,建议改用 `DECIMAL` 类型。 * `ZEROFILL` 属性。MySQL 8.0 [弃用](https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html)了此功能,建议在业务应用中填充数字值。 + +### `CREATE RESOURCE GROUP`,`DROP RESOURCE GROUP` 和 `ALTER RESOURCE GROUP` + +TiDB 资源组创建与修改语句的语法与 MySQL 官方不同,详情参见: + +- [`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) diff --git a/privilege-management.md b/privilege-management.md index d4bee285002d..9fee752149fd 100644 --- a/privilege-management.md +++ b/privilege-management.md @@ -435,6 +435,18 @@ SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE grantee = "'root'@'%'"; 使用 `KILL` 终止其他用户的会话需要拥有 `SUPER` 或者 `CONNECTION_ADMIN` 权限。 +### CREATE RESOURCE GROUP + +需要拥有 `SUPER` 或者 `RESOURCE_GROUP_ADMIN` 权限。 + +### ALTER RESOURCE GROUP + +需要拥有 `SUPER` 或者 `RESOURCE_GROUP_ADMIN` 权限。 + +### DROP RESOURCE GROUP + +需要拥有 `SUPER` 或者 `RESOURCE_GROUP_ADMIN` 权限。 + ## 权限系统的实现 ### 授权表 diff --git a/sql-statements/sql-statement-alter-resource-group.md b/sql-statements/sql-statement-alter-resource-group.md new file mode 100644 index 000000000000..2749ae10d8d2 --- /dev/null +++ b/sql-statements/sql-statement-alter-resource-group.md @@ -0,0 +1,83 @@ +--- +title: ALTER RESOURCE GROUP +summary: TiDB 数据库中 ALTER RESOURCE GROUP 的使用概况。 +--- + +# ALTER RESOURCE GROUP + +`ALTER RESOURCE GROUP` 语句用于在当前所选数据库中修改资源组。 + +## 语法图 + +```ebnf+diagram +AlterResourceGroupStmt: + "ALTER" "RESOURCE" "GROUP" IfExists ResourceGroupName ResourceGroupOptionList + +IfExists ::= + ('IF' 'EXISTS')? + +ResourceGroupName: + Identifier + +ResourceGroupOptionList: + DirectResourceGroupOption +| ResourceGroupOptionList DirectResourceGroupOption +| ResourceGroupOptionList ',' DirectResourceGroupOption + +DirectResourceGroupOption: + "RU_PER_SEC" EqOpt stringLit +| "BURSTABLE" + +``` + +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 允许对应的资源组超出配额后使用空余的系统资源。 + +> **注意:** +> +> `ALTER RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 参数设置为 `ON` 时才能执行。 + +## 示例 + +创建一个名为 `rg1` 的资源组,并修改它的属性。 + +```sql +mysql> DROP RESOURCE GROUP IF EXISTS rg1; +Query OK, 0 rows affected (0.22 sec) +mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 + -> RU_PER_SEC = 100 + -> BURSTABLE; +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 | ++------+-------------+-----------+ +1 rows in set (1.30 sec) +mysql> ALTER RESOURCE GROUP rg1 + -> RU_PER_SEC = 200; +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 | ++------+-------------+-----------+ +1 rows in set (1.30 sec) +``` + +## MySQL 兼容性 + +MySQL 也支持 [ALTER RESOURCE GROUP](https://dev.mysql.com/doc/refman/8.0/en/alter-resource-group.html),但是接受的参数和 TiDB 不同,两者并不兼容。 + +## 另请参阅 + +* [DROP RESOURCE GROUP](/sql-statements/sql-statement-drop-resource-group.md) +* [CREATE RESOURCE GROUP](/sql-statements/sql-statement-create-resource-group.md) +* [RU](/tidb-resource-control.md#什么是-request-unit-ru) diff --git a/sql-statements/sql-statement-alter-user.md b/sql-statements/sql-statement-alter-user.md index a252d109a072..080874cdd45a 100644 --- a/sql-statements/sql-statement-alter-user.md +++ b/sql-statements/sql-statement-alter-user.md @@ -12,7 +12,7 @@ aliases: ['/docs-cn/dev/sql-statements/sql-statement-alter-user/','/docs-cn/dev/ ```ebnf+diagram AlterUserStmt ::= - 'ALTER' 'USER' IfExists (UserSpecList RequireClauseOpt ConnectionOptions PasswordOption LockOption AttributeOption | 'USER' '(' ')' 'IDENTIFIED' 'BY' AuthString) + 'ALTER' 'USER' IfExists (UserSpecList RequireClauseOpt ConnectionOptions PasswordOption LockOption AttributeOption | 'USER' '(' ')' 'IDENTIFIED' 'BY' AuthString) ResourceGroupNameOption UserSpecList ::= UserSpec ( ',' UserSpec )* @@ -31,6 +31,8 @@ PasswordOption ::= ( 'PASSWORD' 'EXPIRE' ( 'DEFAULT' | 'NEVER' | 'INTERVAL' N 'D LockOption ::= ( 'ACCOUNT' 'LOCK' | 'ACCOUNT' 'UNLOCK' )? AttributeOption ::= ( 'COMMENT' CommentString | 'ATTRIBUTE' AttributeString )? + +ResourceGroupNameOption::= ( 'RESOURCE' 'GROUP' Identifier)? ``` ## 示例 @@ -163,6 +165,16 @@ ALTER USER 'newuser' PASSWORD REUSE INTERVAL 90 DAY; Query OK, 0 rows affected (0.02 sec) ``` +通过 `ALTER USER ... RESOURCE GROUP` 修改用户 `newuser` 的资源组到 `rg1`: + +```sql +ALTER USER 'newuser' RESOURCE GROUP rg1; +``` + +``` +Query OK, 0 rows affected (0.02 sec) +``` + ## 另请参阅 * [Security Compatibility with MySQL](/security-compatibility-with-mysql.md) diff --git a/sql-statements/sql-statement-create-resource-group.md b/sql-statements/sql-statement-create-resource-group.md new file mode 100644 index 000000000000..b8ecc749e4d0 --- /dev/null +++ b/sql-statements/sql-statement-create-resource-group.md @@ -0,0 +1,79 @@ +--- +title: CREATE RESOURCE GROUP +summary: TiDB 数据库中 CREATE RESOURCE GROUP 的使用概况。 +--- + +# CREATE RESOURCE GROUP + +`CREATE RESOURCE GROUP` 语句用于在当前所选数据库中创建资源组。 + +## 语法图 + +```ebnf+diagram +CreateResourceGroupStmt: + "CREATE" "RESOURCE" "GROUP" IfNotExists ResourceGroupName ResourceGroupOptionList + +IfNotExists ::= + ('IF' 'NOT' 'EXISTS')? + +ResourceGroupName: + Identifier + +ResourceGroupOptionList: + DirectResourceGroupOption +| ResourceGroupOptionList DirectResourceGroupOption +| ResourceGroupOptionList ',' DirectResourceGroupOption + +DirectResourceGroupOption: + "RU_PER_SEC" EqOpt stringLit +| "BURSTABLE" + +``` + +资源组的 `ResourceGroupName` 是全局唯一的,不允许重复。 + +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 允许对应的资源组超出配额后使用空余的系统资源。 + +> **注意:** +> +> `CREATE RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 参数设置为 `ON` 时才能执行。 + +## 示例 + +创建 `rg1` 和 `rg2` 两个资源组。 + +```sql +mysql> DROP RESOURCE GROUP IF EXISTS rg1; +Query OK, 0 rows affected (0.22 sec) +mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 + -> RU_PER_SEC = 100 + -> BURSTABLE; +Query OK, 0 rows affected (0.08 sec) +mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg2 + -> RU_PER_SEC = 200; +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 | ++------+-------------+-----------+ +2 rows in set (1.30 sec) +``` + +## MySQL 兼容性 + +MySQL 也支持 [CREATE RESOURCE GROUP](https://dev.mysql.com/doc/refman/8.0/en/create-resource-group.html),但是接受的参数和 TiDB 不同,两者并不兼容。 + +## 另请参阅 + +* [DROP RESOURCE GROUP](/sql-statements/sql-statement-drop-resource-group.md) +* [ALTER RESOURCE GROUP](/sql-statements/sql-statement-alter-resource-group.md) +* [RU](/tidb-resource-control.md#什么是-request-unit-ru) diff --git a/sql-statements/sql-statement-create-user.md b/sql-statements/sql-statement-create-user.md index e46c3ff79ab6..ac3dfd49f15d 100644 --- a/sql-statements/sql-statement-create-user.md +++ b/sql-statements/sql-statement-create-user.md @@ -12,7 +12,7 @@ aliases: ['/docs-cn/dev/sql-statements/sql-statement-create-user/','/docs-cn/dev ```ebnf+diagram CreateUserStmt ::= - 'CREATE' 'USER' IfNotExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOption LockOption AttributeOption + 'CREATE' 'USER' IfNotExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOption LockOption AttributeOption ResourceGroupNameOption IfNotExists ::= ('IF' 'NOT' 'EXISTS')? @@ -35,6 +35,8 @@ PasswordOption ::= ( 'PASSWORD' 'EXPIRE' ( 'DEFAULT' | 'NEVER' | 'INTERVAL' N 'D LockOption ::= ( 'ACCOUNT' 'LOCK' | 'ACCOUNT' 'UNLOCK' )? AttributeOption ::= ( 'COMMENT' CommentString | 'ATTRIBUTE' AttributeString )? + +ResourceGroupNameOption::= ( 'RESOURCE' 'GROUP' Identifier)? ``` ## 示例 @@ -151,6 +153,22 @@ CREATE USER 'newuser9'@'%' PASSWORD EXPIRE; Query OK, 1 row affected (0.02 sec) ``` +创建一个使用资源组 `rg1` 的用户: + +```sql +CREATE USER 'newuser7'@'%' RESOURCE GROUP rg1; +SELECT USER, HOST, USER_ATTRIBUTES FROM MYSQL.USER WHERE USER='newuser7'; +``` + +```sql ++-----------+------+---------------------------------------------------+ +| USER | HOST | USER_ATTRIBUTES | ++-----------+------+---------------------------------------------------+ +| newuser7 | % | {"resource_group": "rg1"} | ++-----------+------+---------------------------------------------------+ +1 rows in set (0.00 sec) +``` + ## MySQL 兼容性 * TiDB 不支持 `WITH MAX_QUERIES_PER_HOUR`、`WITH MAX_UPDATES_PER_HOUR`、`WITH MAX_USER_CONNECTIONS` 等 `CREATE` 选项。 diff --git a/sql-statements/sql-statement-drop-resource-group.md b/sql-statements/sql-statement-drop-resource-group.md new file mode 100644 index 000000000000..07f70cc69d16 --- /dev/null +++ b/sql-statements/sql-statement-drop-resource-group.md @@ -0,0 +1,59 @@ +--- +title: DROP RESOURCE GROUP +summary: TiDB 数据库中 DROP RESOURCE GROUP 的使用概况。 +--- + +# DROP RESOURCE GROUP + +`DROP RESOURCE GROUP` 语句用于在当前所选数据库中删除资源组。 + +## 语法图 + +```ebnf+diagram +DropResourceGroupStmt: + "DROP" "RESOURCE" "GROUP" IfExists ResourceGroupName + +IfExists ::= + ('IF' 'EXISTS')? + +ResourceGroupName: + Identifier +``` + +> **注意:** +> +> `DROP RESOURCE GROUP` 语句只能在全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 参数设置为 `ON` 时才能执行。 + +## 示例 + +删除名为 `rg1` 的资源组: + +```sql +mysql> DROP RESOURCE GROUP IF EXISTS rg1; +Query OK, 0 rows affected (0.22 sec) +mysql> CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 500 BURSTABLE; +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 | ++------+------------+-----------+ +1 row in set (0.01 sec) + +mysql> DROP RESOURCE GROUP IF EXISTS rg1; +Query OK, 1 rows affected (0.09 sec) + +mysql> SELECT * FROM information_schema.resource_groups WHERE NAME ='rg1'; +Empty set (0.00 sec) +``` + +## MySQL 兼容性 + +MySQL 也支持 [DROP RESOURCE GROUP](https://dev.mysql.com/doc/refman/8.0/en/drop-resource-group.html),但 TiDB 不支持 `FORCE` 参数。 + +## 另请参阅 + +* [ALTER RESOURCE GROUP](/sql-statements/sql-statement-alter-resource-group.md) +* [CREATE RESOURCE GROUP](/sql-statements/sql-statement-create-resource-group.md) +* [RU](/tidb-resource-control.md#什么是-request-unit-ru) \ No newline at end of file diff --git a/sql-statements/sql-statement-show-create-resource-group.md b/sql-statements/sql-statement-show-create-resource-group.md new file mode 100644 index 000000000000..683f9f1553e0 --- /dev/null +++ b/sql-statements/sql-statement-show-create-resource-group.md @@ -0,0 +1,49 @@ +--- +title: SHOW CREATE RESOURCE GROUP +summary: TiDB 数据库中 SHOW CREATE RESOURCE GROUP 的使用概况。 +--- + +# SHOW CREATE RESOURCE GROUP + +`SHOW CREATE RESOURCE GROUP` 语句可用于查看资源组当前的定义。 + +## 语法图 + +```ebnf+diagram +ShowCreateResourceGroupStmt ::= + "SHOW" "CREATE" "RESOURCE" "GROUP" ResourceGroupName + +ResourceGroupName ::= + Identifier +``` + +## 示例 + +查看资源组 `rg1` 当前的定义: + +```sql +CREATE RESOURCE GROUP rg1 RU_PER_SEC=100; +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 | ++----------------+--------------------------------------------+ +1 row in set (0.01 sec) +``` + +## MySQL 兼容性 + +该语句是 TiDB 对 MySQL 语法的扩展。 + +## 另请参阅 + +* [TiDB RESOURCE CONTROL](/tidb-resource-control.md) +* [CREATE RESOURCE GROUP](/sql-statements/sql-statement-alter-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) diff --git a/sql-statements/sql-statement-show-privileges.md b/sql-statements/sql-statement-show-privileges.md index c73a0fcb7810..cecf5ad27057 100644 --- a/sql-statements/sql-statement-show-privileges.md +++ b/sql-statements/sql-statement-show-privileges.md @@ -22,44 +22,62 @@ aliases: ['/docs-cn/dev/sql-statements/sql-statement-show-privileges/','/docs-cn show privileges; ``` -``` -+-------------------------+---------------------------------------+-------------------------------------------------------+ -| Privilege | Context | Comment | -+-------------------------+---------------------------------------+-------------------------------------------------------+ -| Alter | Tables | To alter the table | -| Alter | Tables | To alter the table | -| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures | -| Create | Databases,Tables,Indexes | To create new databases and tables | -| Create routine | Databases | To use CREATE FUNCTION/PROCEDURE | -| Create temporary tables | Databases | To use CREATE TEMPORARY TABLE | -| Create view | Tables | To create new views | -| Create user | Server Admin | To create new users | -| Delete | Tables | To delete existing rows | -| Drop | Databases,Tables | To drop databases, tables, and views | -| Event | Server Admin | To create, alter, drop and execute events | -| Execute | Functions,Procedures | To execute stored routines | -| File | File access on server | To read and write files on the server | -| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess | -| Index | Tables | To create or drop indexes | -| Insert | Tables | To insert data into tables | -| Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) | -| Process | Server Admin | To view the plain text of currently executing queries | -| Proxy | Server Admin | To make proxy user possible | -| References | Databases,Tables | To have references on tables | -| Reload | Server Admin | To reload or refresh tables, logs and privileges | -| Replication client | Server Admin | To ask where the slave or master servers are | -| Replication slave | Server Admin | To read binary log events from the master | -| Select | Tables | To retrieve rows from table | -| Show databases | Server Admin | To see all databases with SHOW DATABASES | -| Show view | Tables | To see views with SHOW CREATE VIEW | -| Shutdown | Server Admin | To shut down the server | -| Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. | -| Trigger | Tables | To use triggers | -| Create tablespace | Server Admin | To create/alter/drop tablespaces | -| Update | Tables | To update existing rows | -| Usage | Server Admin | No privileges - allow connect only | -+-------------------------+---------------------------------------+-------------------------------------------------------+ -32 rows in set (0.00 sec) +```sql +mysql> show privileges; ++---------------------------------+---------------------------------------+-------------------------------------------------------+ +| Privilege | Context | Comment | ++---------------------------------+---------------------------------------+-------------------------------------------------------+ +| Alter | Tables | To alter the table | +| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures | +| Config | Server Admin | To use SHOW CONFIG and SET CONFIG statements | +| Create | Databases,Tables,Indexes | To create new databases and tables | +| Create routine | Databases | To use CREATE FUNCTION/PROCEDURE | +| Create role | Server Admin | To create new roles | +| Create temporary tables | Databases | To use CREATE TEMPORARY TABLE | +| Create view | Tables | To create new views | +| Create user | Server Admin | To create new users | +| Delete | Tables | To delete existing rows | +| Drop | Databases,Tables | To drop databases, tables, and views | +| Drop role | Server Admin | To drop roles | +| Event | Server Admin | To create, alter, drop and execute events | +| Execute | Functions,Procedures | To execute stored routines | +| File | File access on server | To read and write files on the server | +| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess | +| Index | Tables | To create or drop indexes | +| Insert | Tables | To insert data into tables | +| Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) | +| Process | Server Admin | To view the plain text of currently executing queries | +| Proxy | Server Admin | To make proxy user possible | +| References | Databases,Tables | To have references on tables | +| Reload | Server Admin | To reload or refresh tables, logs and privileges | +| Replication client | Server Admin | To ask where the slave or master servers are | +| Replication slave | Server Admin | To read binary log events from the master | +| Select | Tables | To retrieve rows from table | +| Show databases | Server Admin | To see all databases with SHOW DATABASES | +| Show view | Tables | To see views with SHOW CREATE VIEW | +| Shutdown | Server Admin | To shut down the server | +| Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. | +| Trigger | Tables | To use triggers | +| Create tablespace | Server Admin | To create/alter/drop tablespaces | +| Update | Tables | To update existing rows | +| Usage | Server Admin | No privileges - allow connect only | +| BACKUP_ADMIN | Server Admin | | +| RESTORE_ADMIN | Server Admin | | +| SYSTEM_USER | Server Admin | | +| SYSTEM_VARIABLES_ADMIN | Server Admin | | +| ROLE_ADMIN | Server Admin | | +| CONNECTION_ADMIN | Server Admin | | +| PLACEMENT_ADMIN | Server Admin | | +| DASHBOARD_CLIENT | Server Admin | | +| RESTRICTED_TABLES_ADMIN | Server Admin | | +| RESTRICTED_STATUS_ADMIN | Server Admin | | +| RESTRICTED_VARIABLES_ADMIN | Server Admin | | +| RESTRICTED_USER_ADMIN | Server Admin | | +| RESTRICTED_CONNECTION_ADMIN | Server Admin | | +| RESTRICTED_REPLICA_WRITER_ADMIN | Server Admin | | +| RESOURCE_GROUP_ADMIN | Server Admin | | ++---------------------------------+---------------------------------------+-------------------------------------------------------+ +49 rows in set (0.00 sec) ``` ## MySQL 兼容性 diff --git a/system-variables.md b/system-variables.md index cd060fffd2cb..dc5415c47490 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1582,6 +1582,18 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 当读数据的算子只剩 1 个线程且当单条 SQL 语句的内存使用继续超过 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 时,该 SQL 语句会触发其它的内存控制行为,例如[落盘](/system-variables.md#tidb_enable_tmp_storage_on_oom)。 - 该变量在单条查询仅涉及读数据的情况下,对内存控制效果较好。若还存在额外的计算操作(如连接、聚合等),打开该变量可能会导致内存不受 `tidb_mem_quota_query` 控制,加剧 OOM 风险。 +### `tidb_enable_resource_control` 从 v6.6.0 版本开始引入 + +> **警告:** +> +> [资源管控](/tidb-resource-control.md) 目前为实验性特性,此变量定义可能在之后发生变化或者删除。 + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 默认值:`OFF` +- 类型:布尔型 +- 该变量是[资源管控特性](/tidb-resource-control.md)的开关。该变量设置为 `ON` 后,集群支持应用按照资源组做资源隔离。 + ### `tidb_enable_reuse_chunk` 从 v6.4.0 版本开始引入 - 作用域:SESSION | GLOBAL diff --git a/tidb-resource-control.md b/tidb-resource-control.md new file mode 100644 index 000000000000..fc617530e62c --- /dev/null +++ b/tidb-resource-control.md @@ -0,0 +1,139 @@ +--- +title: 使用资源管控 (Resource Control) 实现资源隔离 +summary: 介绍如何通过资源管控能力来实现对应用资源消耗的控制和有效调度。 +--- + +# 使用资源管控 (Resource Control) 实现资源隔离 + +> **警告:** +> +> 资源管控是 TiDB 在 v6.6.0 中引入的实验特性,其语法或者行为表现在 GA 前可能会发生变化。 + +使用资源管控特性,集群管理员可以定义资源组 (Resource Group),通过资源组限定读写的配额。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的读写配额对用户的读写请求做流控,TiKV 层会根据读写配额映射的优先级来对请求做调度。通过流控和调度这两层控制,你可以实现应用的资源隔离,满足服务质量 (QoS) 要求。 + +TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。两个能力可以单独或者同时开启,详情请参见[参数组合效果表](#相关参数)。 + +- TiDB 流控:TiDB 流控使用[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket) 做流控;如果桶内令牌数不够,而且资源组没有指定 `BURSTABLE` 特性,属于该资源组的请求会等待令牌桶回填令牌并重试,重试可能会超时失败。 +- TiKV 调度:如果开启该特性,TiKV 使用基于资源组 `RU_PER_SEC` 的取值映射成各自资源组读写请求的优先级,基于各自的优先级在存储层使用优先级队列调度处理请求。 + +## 使用场景 + +资源管控特性的引入对 TiDB 具有里程碑的意义。它能够将一个分布式数据库集群划分成多个逻辑单元,即使个别单元对资源过度使用,也不会挤占其他单元所需的资源。利用该特性: + +- 你可以将多个来自不同系统的中小型应用合入一个 TiDB 集群中,个别应用的负载升高,不会影响其他业务的正常运行。而在系统负载较低的时候,繁忙的应用即使超过设定的读写配额,也仍然可以被分配到所需的系统资源,达到资源的最大化利用。 +- 你可以选择将所有测试环境合入一个集群,或者将消耗较大的批量任务编入一个单独的资源组,在保证重要应用获得必要资源的同时,提升硬件利用率,降低运行成本。 + +此外,合理利用资源管控特性可以减少集群数量,降低运维难度及管理成本。 + +## 什么是 Request Unit (RU) + +Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位, 目前包括 CPU、IOPS 和 IO 带宽三个指标。这三个指标的消耗会按照一定的比例统一到 RU 单位上。 + +下表是用户请求对 TiKV 存储层 CPU 和 IO 资源的消耗以及对应的 RU 权重: + +| 资源 | RU 权重 | +|:-----------|:-------------| +| CPU | 1/3 RU / 毫秒 | +| 读 IO | 1/64 RU / KB | +| 写 IO | 1 RU / KB | +| 一次读请求的基本开销 | 0.25 RU | +| 一次写请求的基本开销 | 1.5 RU | + +基于上表,假设某个资源组消耗的 TiKV 时间是 `c` 毫秒,`r1` 次请求读取了 `r2` KB 数据,`w1` 次写请求写入了 `w2` KB 数据,集群中非 witness TiKV 节点数是 `n`,则该资源组消耗的总 RU 的公式如下: + +`c`\* 1/3 + (`r1` \* 0.25 + `r2` \* 1/64) + (1.5 \* `w1` + `w2` \* 1 \* `n`) + +## 相关参数 + +资源管控特性引入了两个新的全局开关变量: + +* TiDB: 通过配置全局变量 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 控制是否打开资源组流控。 +* TiKV: 通过配置参数 [`resource-control.enabled`](/tikv-configuration-file.md#resource-control) 控制是否使用基于资源组配额的请求调度。 + +这两个参数的组合效果见下表: + +| `resource-control.enabled` | `tidb_enable_resource_control`= ON | `tidb_enable_resource_control`= OFF | +|:----------------------------|:-----------------------------------|:------------------------------------| +| `resource-control.enabled`= true | 流控和调度(推荐组合) | 无效配置 | +| `resource-control.enabled`= false | 仅流控(不推荐) | 特性被关闭 | + +关于资源管控实现机制及相关参数的详细介绍,请参考 [RFC: Global Resource Control in TiDB](https://docs.google.com/document/d/1sV5EVv8Cdpc6aBCDihc2akpE0iuantPf/edit?n=RFC_Global_Resource_Control_in_TiDB.docx#heading=h.sjp9cmjfszlu)。 + +## 使用方法 + +创建、修改、删除资源组,需要拥有 `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) 语句将用户绑定到特定的资源组。 + +对于已有的资源组,可以通过 [`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 步:开启资源管控特性 + +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,并且允许这个资源组的应用超额占用资源。 + + ```sql + CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 500 BURSTABLE; + ``` + +2. 创建 `rg2` 资源组,RU 的回填速度是每秒 600 RU。在系统资源充足的时候,不允许这个资源组的应用超额占用资源。 + + ```sql + CREATE RESOURCE GROUP IF NOT EXISTS rg2 RU_PER_SEC = 600; + ``` + +3. 将用户 `usr1` 和 `usr2` 分别绑定到资源组 `rg1` 和 `rg2`。 + + ```sql + ALTER USER usr1 RESOURCE GROUP rg1; + ``` + + ```sql + ALTER USER usr2 RESOURCE GROUP rg2; + ``` + +完成上述创建资源组和绑定用户的操作后,用户新建立的会话对资源的占用会受到指定用量 (RU) 的限制。如果系统负载比较高,没有多余的容量,`usr2` 用户的资源消耗速度会严格控制不超过指定用量,由于 `usr1` 绑定的 `rg1` 配置了 `BURSTABLE`,所以 `usr1` 消耗速度允许超过指定用量。 + +如果资源组对应的请求太多导致资源组的资源不足,客户端的请求处理会发生等待。如果等待时间过长,请求会报错。 + +## 监控与图表 + +TiDB 会定时采集资源管控的运行时信息,并在 Grafana 的 **Resource Control Dashboard** 中提供了相关指标的可视化图表。指标详情参见 [Resource Control 监控指标详解](/grafana-resource-control-dashboard.md) 。 + +TiKV 中也记录了来自于不同资源组的请求 QPS,详见 [TiKV监控指标详解](/grafana-tikv-dashboard.md#grpc) + +## 工具兼容性 + +资源管控目前为实验特性,不影响数据导入导出以及其他同步工具的正常使用,BR、TiDB Lightning、TiCDC 等工具不支持对资源管控相关 DDL 的处理,这些工具的资源消耗也不受资源管控的限制。 + +## 使用限制 + +目前,资源管控特性具有以下限制: + +* 暂时只支持对前台客户发起的读写请求做限流和调度,不支持对 DDL 以及 Auto Analyze 等后台任务的限流和调度。 +* 资源管控将带来额外的调度开销。因此,开启该特性后,性能可能会有轻微下降。 + +## 另请参阅 + +* [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) +* [RESOURCE GROUP RFC](https://docs.google.com/document/d/1sV5EVv8Cdpc6aBCDihc2akpE0iuantPf/) diff --git a/tikv-configuration-file.md b/tikv-configuration-file.md index 2f5865ce9057..d459b0ab9c31 100644 --- a/tikv-configuration-file.md +++ b/tikv-configuration-file.md @@ -1875,3 +1875,13 @@ Raft Engine 相关的配置项。 + 单次时间戳请求的最大数量。 + 在默认的一个 TSO 物理时钟更新周期内 (50ms),PD 最多提供 262144 个 TSO,超过这个数量后 PD 会暂缓 TSO 请求的处理。这个配置用于避免 PD 的 TSO 消耗殆尽、影响其他业务的使用。如果增大这个参数,建议同时减小 PD 的 [`tso-update-physical-interval`](/pd-configuration-file.md#tso-update-physical-interval) 参数,以获得足够的 TSO。 + 默认值:8192 + +## resource-control + +资源控制 (Resource Control) 在 TiKV 存储层相关的配置项。 + +### `enabled` 从 v6.6.0 版本开始引入 + ++ 是否支持对用户前台的读写请求按照对应的资源组配额做优先级调度。有关 TiDB 资源组和资源管控的信息,请参考 [TiDB 资源管控](/tidb-resource-control.md) ++ 在 TiDB 侧开启 [`tidb_enable_resource_control`](/system-variables.md#tidb_enable_resource_control-从-v660-版本开始引入) 全局变量的情况下,开启这个配置项才有意义。此配置参数开启后,TiKV 会使用优先级队列对排队的用户前台读写请求做调度,调度的优先级和请求所在资源组已经消费的资源量反相关,和对应资源组的配额正相关。 ++ 默认值:false(即关闭按照资源组配额调度)