Skip to content

Commit

Permalink
This is an automated cherry-pick of pingcap#9907
Browse files Browse the repository at this point in the history
Signed-off-by: ti-chi-bot <[email protected]>
  • Loading branch information
TomShawn authored and ti-chi-bot committed Jun 21, 2022
1 parent dcd35fb commit f6817a6
Show file tree
Hide file tree
Showing 14 changed files with 165 additions and 40 deletions.
2 changes: 1 addition & 1 deletion alert-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ summary: TiDB 集群中各组件的报警规则详解。

* 规则描述:

Region 的副本数小于 `max-replicas` 配置的值。这通常是由于 TiKV 宕机等问题导致一段时间内一些 Region 缺副本。
Region 的副本数小于 `max-replicas` 配置的值。

* 处理方法:

Expand Down
2 changes: 1 addition & 1 deletion best-practices/java-app-best-practices.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ Java 的连接池实现很多 ([HikariCP](https://github.com/brettwooldridge/Hik

### 探活配置

连接池维护到 TiDB 的长连接,TiDB 默认不会主动关闭客户端连接(除非报错),但一般客户端到 TiDB 之间还会有 LVS 或 HAProxy 之类的网络代理,它们通常会在连接空闲一定时间后主动清理连接。除了注意代理的 idle 配置外,连接池还需要进行保活或探测连接。
连接池维护到 TiDB 的长连接,TiDB 默认不会主动关闭客户端连接(除非报错),但一般客户端到 TiDB 之间还会有 LVS 或 HAProxy 之类的网络代理,它们通常会在连接空闲一定时间(由代理的 idle 配置决定)后主动清理连接。除了注意代理的 idle 配置外,连接池还需要进行保活或探测连接。

如果常在 Java 应用中看到以下错误:

Expand Down
4 changes: 2 additions & 2 deletions dumpling-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -281,9 +281,9 @@ Dumpling 可以通过 `--snapshot` 指定导出某个 [tidb_snapshot](/read-hist

即可导出 TSO 为 `417773951312461825``2020-07-02 17:12:45` 时的 TiDB 历史数据快照。

### 控制导出 TiDB 大表时的内存使用
### 控制导出 TiDB 大表(超过 1 TB)时的内存使用

Dumpling 导出 TiDB 较大单表时,可能会因为导出数据过大导致 TiDB 内存溢出 (OOM),从而使连接中断导出失败。可以通过以下参数减少 TiDB 的内存使用。
Dumpling 导出 TiDB 较大单表(超过 1 TB)时,可能会因为导出数据过大导致 TiDB 内存溢出 (OOM),从而使连接中断导出失败。可以通过以下参数减少 TiDB 的内存使用。

+ 设置 `-r` 参数,可以划分导出数据区块减少 TiDB 扫描数据的内存开销,同时也可开启表内并发提高导出效率。当上游为 TiDB 且版本为 v3.0 或更新版本时,该参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值将不再生效。
+ 调小 `--tidb-mem-quota-query` 参数到 `8589934592` (8GB) 或更小。可控制 TiDB 单条查询语句的内存使用。
Expand Down
4 changes: 4 additions & 0 deletions faq/manage-cluster-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,11 @@ TiDB 设计的目标就是针对 MySQL 单台容量限制而被迫做的分库

### TiDB 主要备份方式?

<<<<<<< HEAD
目前,数据量大时推荐使用 [BR](/br/backup-and-restore-tool.md) 进行备份。其他场景推荐使用 [Dumpling](/dumpling-overview.md) 进行备份。
=======
目前,数据量大时(大于 1 TB)推荐使用 [BR](/br/backup-and-restore-overview.md) 进行备份。其他场景推荐使用 [Dumpling](/dumpling-overview.md) 进行备份。
>>>>>>> fbfe1ab0f (ambiguous words: clarify words (#9907))
尽管 TiDB 也支持使用 MySQL 官方工具 `mysqldump` 进行数据备份和恢复,但其性能低于 [Dumpling](/dumpling-overview.md),并且 `mysqldump` 备份和恢复大量数据的耗费更长。

Expand Down
2 changes: 1 addition & 1 deletion shard-row-id-bits.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。

对于非整数主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。大量执行 `INSERT` 插入语句时会把数据集中写入单个 Region,造成写入热点。

通过设置 `SHARD_ROW_ID_BITS`,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。但是设置的过大会造成 RPC 请求数放大,增加 CPU 和网络开销。
通过设置 `SHARD_ROW_ID_BITS`,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。

- `SHARD_ROW_ID_BITS = 4` 表示 16 个分片
- `SHARD_ROW_ID_BITS = 6` 表示 64 个分片
Expand Down
73 changes: 73 additions & 0 deletions sql-plan-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,79 @@ show warnings;
>
> 由于 TiDB 存在一些内嵌 SQL 保证一些功能的正确性,所以自动捕获绑定时会默认屏蔽内嵌 SQL。
<<<<<<< HEAD
=======
### 过滤捕获绑定

使用本功能,你可以设置黑名单,将满足黑名单规则的查询排除在捕获范围之外。黑名单支持的过滤维度包括表名、频率和用户名。

#### 使用方式

将过滤规则插入到系统表 `mysql.capture_plan_baselines_blacklist` 中,该过滤规则即刻起会在整个集群范围内生效。

{{< copyable "sql" >}}

```sql
-- 按照表名进行过滤
INSERT INTO mysql.capture_plan_baselines_blacklist(filter_type, filter_value) VALUES('table', 'test.t');

-- 通过通配符来实现按照数据库名和表名进行过滤
INSERT INTO mysql.capture_plan_baselines_blacklist(filter_type, filter_value) VALUES('table', 'test.table_*');
INSERT INTO mysql.capture_plan_baselines_blacklist(filter_type, filter_value) VALUES('table', 'db_*.table_*');

-- 按照执行频率进行过滤
INSERT INTO mysql.capture_plan_baselines_blacklist(filter_type, filter_value) VALUES('frequency', '2');

-- 按照用户名进行过滤
INSERT INTO mysql.capture_plan_baselines_blacklist(filter_type, filter_value) VALUES('user', 'user1');
```

| **维度名称** | **说明** | 注意事项 |
| :----------- | :----------------------------------------------------------- | ------------------------------------------------------------ |
| table | 按照表名进行过滤,每个过滤规则均采用 `db.table` 形式,支持通配符。详细规则可以参考[直接使用表名](/table-filter.md#直接使用表名)[使用通配符](/table-filter.md#使用通配符)| 字母大小写不敏感,如果包含非法内容,日志会输出 `[sql-bind] failed to load mysql.capture_plan_baselines_blacklist` 警告。 |
| frequency | 按照频率进行过滤,默认捕获执行超过一次的语句。可以设置较大值来捕获执行频繁的语句。 | 插入的值小于 1 会被认为是非法值,同时,日志会输出 `[sql-bind] frequency threshold is less than 1, ignore it` 警告。如果插入了多条频率过滤规则,频率最大的值会被用作过滤条件。 |
| user | 按照用户名进行过滤,黑名单用户名执行的语句不会被捕获。 | 如果多个用户执行同一条语句,只有当他们的用户名都在黑名单的时候,该语句才不会被捕获。 |

> **注意:**
>
> - 修改黑名单需要数据库的 super privilege 权限。
>
> - 如果黑名单包含了非法的过滤内容时,TiDB 会在日志中输出 `[sql-bind] unknown capture filter type, ignore it` 进行提示。
### 升级时的计划回退防护

当需要升级 TiDB 集群时,你可以利用自动捕获绑定对潜在的计划回退风险进行一定程度的防护,具体流程为:

1. 升级前打开自动捕获。

> **注意:**
>
> 经测试,长期打开自动捕获对集群负载的性能影响很小。尽量长期打开自动捕获,以确保重要的查询(出现过两次及以上)都能被捕获到。
2. 进行 TiDB 集群的升级。在升级完成后,这些通过捕获的绑定会发挥作用,确保在升级后,查询的计划不会改变。
3. 升级完成后,根据情况手动删除绑定。

- 通过[`SHOW GLOBAL BINDINGS`](#查看绑定)语句检查绑定来源:

根据输出中的 `Source` 字段对绑定的来源进行区分,确认是通过捕获 (`capture`) 生成还是通过手动创建 (`manual`) 生成。

- 确定 `capture` 的绑定是否需要保留:

```
-- 查看绑定生效时的计划
SET @@SESSION.TIDB_USE_PLAN_BASELINES = true;
EXPLAIN FORMAT='VERBOSE' SELECT * FROM t1 WHERE ...;
-- 查看绑定不生效时的计划
SET @@SESSION.TIDB_USE_PLAN_BASELINES = false;
EXPLAIN FORMAT='VERBOSE' SELECT * FROM t1 WHERE ...;
```
- 如果屏蔽绑定前后,查询得到的计划一致,则可以安全删除此绑定。
- 如果计划不一样,则可能需要对此计划变化的原因进行排查,如检查统计信息等操作。在这种情况下需要保留此绑定,确保计划不发生变化。
>>>>>>> fbfe1ab0f (ambiguous words: clarify words (#9907))
## 自动演进绑定 (Baseline Evolution)
自动演进绑定,在 TiDB 4.0 版本引入,是执行计划管理的重要功能之一。
Expand Down
4 changes: 2 additions & 2 deletions statement-summary-tables.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,11 @@ set global tidb_stmt_summary_history_size = 24;

> **注意:**
>
> `tidb_stmt_summary_history_size``tidb_stmt_summary_max_stmt_count``tidb_stmt_summary_max_sql_length` 这些配置都影响内存占用,建议根据实际情况调整不宜设置得过大。
> `tidb_stmt_summary_history_size``tidb_stmt_summary_max_stmt_count``tidb_stmt_summary_max_sql_length` 这些配置都影响内存占用,建议根据实际情况调整(取决于 SQL 大小、SQL 数量、机器配置)不宜设置得过大。内存大小可通过 `tidb_stmt_summary_history_size` \* `tidb_stmt_summary_max_stmt_count` \* `tidb_stmt_summary_max_sql_length` \* `3` 来进行估算
### 为 statement summary 设定合适的大小

在系统运行一段时间后,可以查看 `statements_summary` 表检查是否发生了 evict,例如:
在系统运行一段时间后(视系统负载而定),可以查看 `statements_summary` 表检查是否发生了 evict,例如:

```sql
select @@global.tidb_stmt_summary_max_stmt_count;
Expand Down
4 changes: 2 additions & 2 deletions storage-engine/titan-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ title: Titan 介绍

[Titan](https://github.com/pingcap/rocksdb/tree/titan-5.15) 是基于 [RocksDB](https://github.com/facebook/rocksdb) 的高性能单机 key-value 存储引擎插件。

当 value 较大的时候,Titan 在写、更新和点读等场景下性能都优于 RocksDB。但与此同时,Titan 会占用更多硬盘空间和部分舍弃范围查询。随着 SSD 价格的降低,Titan 的优势会更加突出,让用户更容易做出选择。
当 value 较大(1 KB 以上或 512 B 以上)的时候,Titan 在写、更新和点读等场景下性能都优于 RocksDB。但与此同时,Titan 会占用更多硬盘空间和部分舍弃范围查询。随着 SSD 价格的降低,Titan 的优势会更加突出,让用户更容易做出选择。

## 核心特性

Expand All @@ -26,7 +26,7 @@ Titan 适合在以下场景中使用:

- Value 较大。即 value 平均大小比较大,或者数据中大 value 的数据总大小占比比较大。目前 Titan 默认 1KB 以上大小的 value 是大 value,根据实际情况 512B 以上大小的 value 也可以看作是大 value。注:由于 TiKV Raft 层的限制,写入 TiKV 的 value 大小还是无法超过 8MB 的限制,可通过 [`raft-entry-max-size`](/tikv-configuration-file.md#raft-entry-max-size) 配置项调整该限制。
- 没有范围查询或者对范围查询性能不敏感。Titan 存储数据的顺序性较差,所以相比 RocksDB 范围查询的性能较差,尤其是大范围查询。在测试中 Titan 范围查询性能相比 RocksDB 下降 40% 到数倍不等。
- 磁盘剩余空间足够。Titan 降低写放大是通过牺牲空间放大达到的。另外由于 Titan 逐个压缩 value,压缩率比 RocksDB(逐个压缩 block)要差。这两个因素一起造成 Titan 占用磁盘空间比 RocksDB 要多,这是正常现象。根据实际情况和不同的配置,Titan 磁盘空间占用可能会比 RocksDB 多一倍。
- 磁盘剩余空间足够,推荐为相同数据量下 RocksDB 磁盘占用的两倍。Titan 降低写放大是通过牺牲空间放大达到的。另外由于 Titan 逐个压缩 value,压缩率比 RocksDB(逐个压缩 block)要差。这两个因素一起造成 Titan 占用磁盘空间比 RocksDB 要多,这是正常现象。根据实际情况和不同的配置,Titan 磁盘空间占用可能会比 RocksDB 多一倍。

性能提升请参考 [Titan 的设计与实现](https://pingcap.com/blog-cn/titan-design-and-implementation/#%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95)

Expand Down
4 changes: 2 additions & 2 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数
- 这个变量用来设置 DDL 操作 `re-organize` 阶段的 batch size。比如 `ADD INDEX` 操作,需要回填索引数据,通过并发 `tidb_ddl_reorg_worker_cnt` 个 worker 一起回填数据,每个 worker 以 batch 为单位进行回填。
- 如果 `ADD INDEX` 操作时有较多 `UPDATE` 操作或者 `REPLACE` 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32
- 在没有事务冲突的情况下,batch size 可设为较大值,最大值是 10240,这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。
- 在没有事务冲突的情况下,batch size 可设为较大值(需要参考 worker 数量,见[线上负载与 `ADD INDEX` 相互影响测试](/benchmark/online-workloads-and-add-index-operations.md)),最大值是 10240,这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。
### `tidb_ddl_reorg_priority`
Expand Down Expand Up @@ -538,7 +538,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数
- 范围:`[1, 256]`
- 这个变量用来设置 scan 操作的并发度。
- AP 类应用适合较大的值,TP 类应用适合较小的值。对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
- 若表的分区较多可以适当调小该参数,避免 TiKV 内存溢出 (OOM)。
- 若表的分区较多可以适当调小该参数(取决于扫描数据量的大小以及扫描频率),避免 TiKV 内存溢出 (OOM)。
### `tidb_dml_batch_size`
Expand Down
23 changes: 0 additions & 23 deletions ticdc/troubleshoot-ticdc.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,29 +111,6 @@ cdc cli changefeed query --pd=http://10.0.10.25:2379 --changefeed-id 28c43ffc-23

升级 TiDB 集群和 TiCDC 集群到最新版本。该 OOM 问题在 **v4.0.14 及之后的 v4.0 版本,v5.0.2 及之后的 v5.0 版本,更新的版本**上已得到缓解。

在这些版本上,可以开启 Unified Sorter 排序功能,该功能会在系统内存不足时使用磁盘进行排序。启用的方式是创建同步任务时在 `cdc cli` 内传入 `--sort-engine=unified`,使用示例如下:

{{< copyable "shell-regular" >}}

```shell
cdc cli changefeed update -c <changefeed-id> --sort-engine="unified" --pd=http://10.0.10.25:2379
```

如果无法升级到上述版本,需要在**之前的版本**上开启 Unified Sorter,可以在创建同步任务时在 `cdc cli` 内传入 `--sort-engine=unified``--sort-dir=/path/to/sort_dir`,使用示例如下:

{{< copyable "shell-regular" >}}

```shell
cdc cli changefeed update -c <changefeed-id> --sort-engine="unified" --sort-dir="/data/cdc/sort" --pd=http://10.0.10.25:2379
```

> **注意:**
>
> + TiCDC 从 4.0.9 版本起支持 Unified Sorter 排序引擎。
> + TiCDC(4.0 发布版本)还不支持动态修改排序引擎。在修改排序引擎设置前,请务必确保 changefeed 已经停止 (stopped)。
> + `sort-dir` 在不同版本之间有不同的行为,请参考 [`sort-dir``data-dir` 配置项的兼容性说明](/ticdc/ticdc-overview.md#sort-dir-及-data-dir-配置项的兼容性说明),谨慎配置。
> + 目前 Unified Sorter 排序引擎为实验特性,在数据表较多 (>= 100) 时可能出现性能问题,影响同步速度,故不建议在生产环境中使用。开启 Unified Sorter 前请保证各 TiCDC 节点机器上有足够硬盘空间。如果积攒的数据总量有可能超过 1 TB,则不建议使用 TiCDC 进行同步。
## TiCDC 的 `gc-ttl` 是什么?

从 TiDB v4.0.0-rc.1 版本起,PD 支持外部服务设置服务级别 GC safepoint。任何一个服务可以注册更新自己服务的 GC safepoint。PD 会保证任何晚于该 GC safepoint 的 KV 数据不会在 TiKV 中被 GC 清理掉。
Expand Down
13 changes: 12 additions & 1 deletion tidb-configuration-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ TiDB 配置文件比命令行参数支持更多的选项。你可以在 [config/

+ 为每个 table 建立单独的 Region。
+ 默认值:true
+ 如果需要创建大量的表,建议将此参数设置为 false。
+ 如果需要创建大量的表(例如 10 万张以上),建议将此参数设置为 false。

### `token-limit`

Expand Down Expand Up @@ -698,6 +698,17 @@ TiDB 服务状态相关配置。
+ 控制 [`INFORMATION_SCHEMA.DEADLOCKS`](/information-schema/information-schema-deadlocks.md) 表中是否收集可重试的死锁错误信息。详见 `DEADLOCKS` 表文档的[可重试的死锁错误](/information-schema/information-schema-deadlocks.md#可重试的死锁错误)小节。
+ 默认值:false

<<<<<<< HEAD
=======
### pessimistic-auto-commit

+ 用来控制开启全局悲观事务模式下 (`tidb_txn_mode='pessimistic'`) 时,自动提交的事务使用的事务模式。默认情况下,即使开启全局悲观事务模式,自动提交事务依然使用乐观事务模式来执行。当开启该配置项后(设置为 `true`),在全局悲观事务模式下,自动提交事务将也使用悲观事务模式执行。行为与其他显式提交的悲观事务相同。
+ 对于存在冲突的场景,开启本开关可以将自动提交事务纳入全局等锁管理中,从而避免死锁,改善冲突造成死锁带来的时延尖刺。
+ 对于不存在冲突的场景,如果有大量自动提交事务(例如自动提交事务数量占业务数量的比例超过一半甚至更多,需要根据实际情况分析)且单个事务操作数据量较大的情况下,开启该配置项会造成性能回退。例如,自动提交的 `INSERT INTO SELECT` 语句。

+ 默认值:false

>>>>>>> fbfe1ab0f (ambiguous words: clarify words (#9907))
## experimental

experimental 部分为 TiDB 实验功能相关的配置。该部分从 v3.1.0 开始引入。
Expand Down
4 changes: 0 additions & 4 deletions tiflash/troubleshoot-tiflash.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,6 @@ show warnings;
- 是,PD 调度正常。
- 否,PD 调度异常,请联系 PingCAP 技术支持人员协助排查。
> **注意:**
>
> 当需要同步的表有很多小 Region 且 Region merge 参数已开启或取值较大时,可能会出现同步进度一段时间不变化或者变小的现象。
## TiFlash 数据同步卡住
如果 TiFlash 数据一开始可以正常同步,过一段时间后全部或者部分数据无法继续同步,你可以通过以下步骤确认或解决问题:
Expand Down
Loading

0 comments on commit f6817a6

Please sign in to comment.