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

Add desc of new TiFlash storage settings and guidelines for upgrading in v4.0.9 (#4965) #5150

Merged
merged 5 commits into from
Dec 22, 2020
Merged
Show file tree
Hide file tree
Changes from all 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
16 changes: 13 additions & 3 deletions config-templates/complex-tiflash.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ server_configs:
replication.enable-placement-rules: true
tiflash:
# Maximum memory usage for processing a single query. Zero means unlimited.
profiles.default.max_memory_usage: 10000000000
profiles.default.max_memory_usage: 0
# Maximum memory usage for processing all concurrently running queries on the server. Zero means unlimited.
profiles.default.max_memory_usage_for_all_queries: 0

Expand Down Expand Up @@ -94,8 +94,6 @@ tikv_servers:

tiflash_servers:
- host: 10.0.1.11
data_dir: /tidb-data/tiflash-9000
deploy_dir: /tidb-deploy/tiflash-9000
# ssh_port: 22
# tcp_port: 9000
# http_port: 8123
Expand All @@ -104,10 +102,22 @@ tiflash_servers:
# flash_proxy_status_port: 20292
# metrics_port: 8234
# deploy_dir: /tidb-deploy/tiflash-9000
## The `data_dir` will be overwritten if you define `storage.main.dir` configurations in the `config` section.
# data_dir: /tidb-data/tiflash-9000
# numa_node: "0,1"
# # The following configs are used to overwrite the `server_configs.tiflash` values.
# config:
# logger.level: "info"
# ## Multi-disk deployment introduced in v4.0.9
# ## Check https://docs.pingcap.com/tidb/stable/tiflash-configuration#multi-disk-deployment for more details.
# ## Example1:
# # storage.main.dir: [ "/nvme_ssd0_512/tiflash", "/nvme_ssd1_512/tiflash" ]
# # storage.main.capacity = [ 536870912000, 536870912000 ]
# ## Example2:
# # storage.main.dir: [ "/sata_ssd0_512/tiflash", "/sata_ssd1_512/tiflash", "/sata_ssd2_512/tiflash" ]
# # storage.latest.dir: [ "/nvme_ssd0_150/tiflash" ]
# # storage.main.capacity = [ 536870912000, 536870912000 ]
# # storage.latest.capacity = [ 161061273600 ]
# learner_config:
# log-level: "info"
# - host: 10.0.1.12
Expand Down
113 changes: 85 additions & 28 deletions tiflash/tiflash-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,28 +30,58 @@ aliases: ['/docs-cn/stable/tiflash/tiflash-configuration/','/docs-cn/v4.0/tiflas
### 配置文件 tiflash.toml

```toml
tmp_path = tiflash 临时文件存放路径
path = tiflash 数据存储路径 # 如果有多个目录,以英文逗号分隔
path_realtime_mode = false # 默认为 false。如果设为 true,且 path 配置了多个目录,表示在第一个目录存放最新数据,较旧的数据存放于其他目录。
listen_host = tiflash # TCP/HTTP 等辅助服务的监听 host,建议配置成 0.0.0.0
tcp_port = tiflash tcp 服务端口
http_port = tiflash http 服务端口
mark_cache_size = 5368709120 # 数据块元信息的内存 cache 大小限制,通常不需要修改
minmax_index_cache_size = 5368709120 # 数据块 min-max 索引的内存 cache 大小限制,通常不需要修改
```
## TiFlash TCP/HTTP 等辅助服务的监听 host。建议配置成 0.0.0.0,即监听本机所有 IP 地址。
listen_host = "0.0.0.0"
## TiFlash TCP 服务的端口
tcp_port = 9000
## TiFlash HTTP 服务的端口
http_port = 8123
## 数据块元信息的内存 cache 大小限制,通常不需要修改
mark_cache_size = 5368709120
## 数据块 min-max 索引的内存 cache 大小限制,通常不需要修改
minmax_index_cache_size = 5368709120

## TiFlash 数据的存储路径。如果有多个目录,以英文逗号分隔。
## 从 v4.0.9 版本开始,不推荐使用 path 及 path_realtime_mode 参数。推荐使用 [storage] 下的配置项代替,这样在多盘部署的场景下能更好地利用节点性能。
# path = "/tidb-data/tiflash-9000"
## 或
# path = "/ssd0/tidb-data/tiflash,/ssd1/tidb-data/tiflash,/ssd2/tidb-data/tiflash"
## 默认为 false。如果设为 true,且 path 配置了多个目录,表示在第一个目录存放最新数据,在其他目录存放较旧的数据。
# path_realtime_mode = false

## TiFlash 临时文件的存放路径。默认使用 [`path` 或者 `storage.latest.dir` 的第一个目录] + "/tmp"
# tmp_path = "/tidb-data/tiflash-9000/tmp"

## 存储路径相关配置,从 v4.0.9 开始生效
[storage]
[storage.main]
## 用于存储主要的数据,该目录列表中的数据占总数据的 90% 以上。
dir = [ "/tidb-data/tiflash-9000" ]
## 或
# dir = [ "/ssd0/tidb-data/tiflash", "/ssd1/tidb-data/tiflash" ]

## storage.main.dir 存储目录列表中每个目录的最大可用容量。
## * 在未定义配置项,或者列表中全填 0 时,会使用目录所在的硬盘容量
## * 以 byte 为单位。目前不支持如 "10GB" 的设置
## * capacity 列表的长度应当与 dir 列表长度保持一致
## 例如:
# capacity = [ 10737418240, 10737418240 ]

[storage.latest]
## 用于存储最新的数据,大约占总数据量的 10% 以内,需要较高的 IOPS。
## 默认情况该项可留空。在未配置或者为空列表的情况下,会使用 storage.main.dir 的值。
# dir = [ ]
## storage.latest.dir 存储目录列表中,每个目录的最大可用容量。
# capacity = [ 10737418240, 10737418240 ]

```toml
[flash]
tidb_status_addr = tidb status 端口地址 # 多个地址以逗号分割
service_addr = tiflash raft 服务 和 coprocessor 服务监听地址
```
service_addr = TiFlash raft 服务 和 coprocessor 服务监听地址

多个 TiFlash 节点会选一个 master 来负责往 PD 增删 placement rule,需要 3 个参数控制。

```toml
# 多个 TiFlash 节点会选一个 master 来负责往 PD 增删 placement rule,通过 flash.flash_cluster 中的参数控制。
[flash.flash_cluster]
refresh_interval = master 定时刷新有效期
update_rule_interval = master 定时向 tidb 获取 tiflash 副本状态并与 pd 交互
update_rule_interval = master 定时向 tidb 获取 TiFlash 副本状态并与 pd 交互
master_ttl = master 选出后的有效期
cluster_manager_path = pd buddy 所在目录的绝对路径
log = pd buddy log 路径
Expand All @@ -67,20 +97,26 @@ minmax_index_cache_size = 5368709120 # 数据块 min-max 索引的内存 cache

[logger]
level = log 级别(支持 trace、debug、information、warning、error)
log = tiflash log 路径
errorlog = tiflash error log 路径
log = TiFlash log 路径
errorlog = TiFlash error log 路径
size = 单个日志文件的大小
count = 最多保留日志文件个数

[raft]
kvstore_path = kvstore 数据存储路径 # 默认为 "{path 的第一个目录}/kvstore"
pd_addr = pd 服务地址 # 多个地址以逗号隔开

[status]
metrics_port = Prometheus 拉取 metrics 信息的端口

[profiles]

[profiles.default]
dt_enable_logical_split = true # 存储引擎的 segment 分裂是否使用逻辑分裂。使用逻辑分裂可以减小写放大,提高写入速度,但是会造成一定的空间浪费。默认为 true
max_memory_usage = 0 # 单次 coprocessor 查询过程中,对中间数据的内存限制,单位为 byte,默认为 0,表示不限制
max_memory_usage_for_all_queries = 0 # 所有查询过程中,对中间数据的内存限制,单位为 byte,默认为 0,表示不限制
## 存储引擎的 segment 分裂是否使用逻辑分裂。使用逻辑分裂可以减小写放大,提高写入速度,但是会造成一定程度的硬盘空间回收不及时。默认为 true
dt_enable_logical_split = true
## 单次 coprocessor 查询过程中,对中间数据的内存限制,单位为 byte,默认为 0,表示不限制
max_memory_usage = 0
## 所有查询过程中,对中间数据的内存限制,单位为 byte,默认为 0,表示不限制
max_memory_usage_for_all_queries = 0

## 安全相关配置,从 v4.0.5 开始生效
[security]
Expand All @@ -96,18 +132,39 @@ minmax_index_cache_size = 5368709120 # 数据块 min-max 索引的内存 cache

```toml
[server]
engine-addr = 外部访问 tiflash coprocessor 服务的地址
engine-addr = 外部访问 TiFlash coprocessor 服务的地址
[raftstore]
snap-handle-pool-size = 控制处理 snapshot 的线程数,默认为 2。设为 0 则关闭多线程优化
store-batch-retry-recv-timeout = 控制 raft store 持久化 WAL 的最小间隔。通过适当增大延迟以减少 IOPS 占用,默认为 4ms,设为 0ms 则关闭该优化。
## 控制处理 snapshot 的线程数,默认为 2。设为 0 则关闭多线程优化
snap-handle-pool-size = 2
## 控制 raft store 持久化 WAL 的最小间隔。通过适当增大延迟以减少 IOPS 占用,默认为 4ms,设为 0ms 则关闭该优化。
store-batch-retry-recv-timeout = "4ms"
```

除以上几项外,其余功能参数和 TiKV 的配置相同。需要注意的是:`tiflash.toml [flash.proxy]` 中的配置项会覆盖 `tiflash-learner.toml` 中的重合参数;`key` 为 `engine` 的 `label` 是保留项,不可手动配置。

### 多盘部署

TiFlash 支持多盘部署,主要通过[配置文件 `tiflash.toml`](#配置文件-tiflashtoml) 中的 `path` 和 `path_realtime_mode` 这两个参数控制。
TiFlash 支持单节点多盘部署。如果你的部署节点上有多块硬盘,可以通过以下的方式配置参数,提高节点的硬盘 I/O 利用率。TiUP 中参数配置格式参照[详细 TiFlash 配置模版](https://github.com/pingcap/docs-cn/blob/release-4.0/config-templates/complex-tiflash.yaml)。

#### TiDB 集群版本低于 v4.0.9

TiDB v4.0.9 之前的版本中,TiFlash 只支持将存储引擎中的主要数据分布在多盘上。通过 `path`(TiUP 中为 `data_dir`)和 `path_realtime_mode` 这两个参数配置多盘部署。

多个数据存储目录在 `path` 中以英文逗号分隔,比如 `/nvme_ssd_a/data/tiflash,/sata_ssd_b/data/tiflash,/sata_ssd_c/data/tiflash`。如果你的节点上有多块硬盘,推荐把性能最好的硬盘目录放在最前面,以更好地利用节点性能。

如果节点上有多块相同规格的硬盘,可以把 `path_realtime_mode` 参数留空(或者把该值明确地设为 `false`)。这表示数据会在所有的存储目录之间进行均衡。但由于最新的数据仍然只会被写入到第一个目录,因此该目录所在的硬盘会较其他硬盘繁忙。

如果节点上有多块规格不一致的硬盘,推荐把 `path_relatime_mode` 参数设置为 `true`,并且把性能最好的硬盘目录放在 `path` 参数内的最前面。这表示第一个目录只会存放最新数据,较旧的数据会在其他目录之间进行均衡。注意此情况下,第一个目录规划的容量大小需要占总容量的约 10%。

#### TiDB 集群版本为 v4.0.9 及以上

TiDB v4.0.9 及之后的版本中,TiFlash 支持将存储引擎的主要数据和新数据都分布在多盘上。多盘部署时,推荐使用 `[storage]` 中的参数,以更好地利用节点的 I/O 性能。但 TiFlash 仍然支持 [TiDB 集群版本低于 v4.0.9](#tidb-集群版本低于-v409) 中的参数。

如果节点上有多块相同规格的硬盘,推荐把硬盘目录填到 `storage.main.dir` 列表中,`storage.latest.dir` 列表留空。TiFlash 会在所有存储目录之间分摊 I/O 压力以及进行数据均衡。

多个数据存储目录在 `path` 中以英文逗号分隔,比如 `/ssd_a/data/tiflash,/hdd_b/data/tiflash,/hdd_c/data/tiflash`。如果你的环境有多块磁盘,推荐一个数据存储目录对应一块磁盘,并且把性能最好的磁盘放在最前面,以发挥所有磁盘的全部性能
如果节点上有多块规格不同的硬盘,推荐把 I/O 性能较好的硬盘目录配置在 `storage.latest.dir` 中,把 I/O 性能较一般的硬盘目录配置在 `storage.main.dir` 中。例如节点上有一块 NVMe-SSD 硬盘加上两块 SATA-SSD 硬盘,你可以把 `storage.latest.dir` 设为 `["/nvme_ssd_a/data/tiflash"]` 以及把 `storage.main.dir` 设为 `["/sata_ssd_b/data/tiflash", "/sata_ssd_c/data/tiflash"]`。TiFlash 会根据两个目录列表分别进行 I/O 压力分摊及数据均衡。需要注意此情况下,`storage.latest.dir` 中规划的容量大小需要占总规划容量的约 10%

`path_realtime_mode` 参数默认值为 false,表示数据会在所有的存储目录之间进行均衡。如果设为 true,且 `path` 配置了多个目录,表示第一个目录只会存放最新数据,较旧的数据会在其他目录之间进行均衡。
> **警告:**
>
> * `[storage]` 参数从 TiUP v1.2.5 版本开始支持。如果你的 TiDB 版本为 v4.0.9 及以上,请确保你的 TiUP 版本不低于 v1.2.5,否则 `[storage]` 中定义的数据目录不会被 TiUP 纳入管理。
> * 在 TiFlash 节点改为使用 `[storage]` 配置后,如果将集群版本降级到低于 v4.0.9,可能导致 TiFlash 部分数据丢失。