TiFlash 常见问题
本文介绍了一些 TiFlash 常见问题、原因及解决办法。
TiFlash 未能正常启动
该问题可能由多个因素构成,可以通过以下步骤依次排查:
检查系统环境是否是 CentOS8。
CentOS8 中缺少
libnsl.so系统库,可以通过手动安装的方式解决:dnf install libnsl检查系统的
ulimit参数设置。ulimit -n 1000000使用 PD Control 工具检查在该节点(相同 IP 和 Port)是否有之前未成功下线的 TiFlash 实例,并将它们强制下线。(下线步骤参考手动缩容 TiFlash 节点)
如果遇到上述方法无法解决的问题,可以打包 TiFlash 的 log 文件夹,并在 AskTUG 社区中提问。
TiFlash 副本始终处于不可用状态
该问题一般由于配置错误或者环境问题导致 TiFlash 处于异常状态,可以先通过以下步骤定位问题组件:
使用 pd-ctl 检查 PD 的 Placement Rules 功能是否开启:
echo 'config show replication' | /path/to/pd-ctl -u http://${pd-ip}:${pd-port}- 如果返回 
true,进入下一步。 - 如果返回 
false,你需要先开启 Placement Rules 特性 后再进入下一步。 
- 如果返回 
 通过 TiFlash-Summary 监控面板下的 UpTime 检查操作系统中 TiFlash 进程是否正常。
通过 pd-ctl 查看 TiFlash proxy 状态是否正常:
tiup ctl:nightly pd -u http://${pd-ip}:${pd-port} storestore.labels 中含有
{"key": "engine", "value": "tiflash"}信息的为 TiFlash proxy。检查 TiFlash 配置的副本数是否小于等于集群 TiKV 节点数。若配置的副本数超过 TiKV 节点数,则 PD 不会向 TiFlash 同步数据:
tiup ctl:nightly pd -u http://${pd-ip}:${pd-port} config placement-rules show | grep -C 10 default再确认 "default: count" 参数值。
检查 TiFlash 节点对应 store 所在机器剩余的磁盘空间是否充足。默认情况下当磁盘剩余空间小于该 store 的 capacity 的 20%(通过
low-space-ratio参数控制)时,PD 不会向 TiFlash 调度数据。
部分查询返回 Region Unavailable 的错误
如果在 TiFlash 上的负载压力过大,会导致 TiFlash 数据同步落后,部分查询可能会返回 Region Unavailable 的错误。
在这种情况下,可以增加 TiFlash 节点分担负载压力。
数据文件损坏
可依照如下步骤进行处理:
- 参照下线 TiFlash 节点下线对应的 TiFlash 节点。
 - 清除该 TiFlash 节点的相关数据。
 - 重新在集群中部署 TiFlash 节点。
 
缩容 TiFlash 节点慢
可依照如下步骤进行处理:
检查是否有某些数据表的 TiFlash 副本数大于缩容后的 TiFlash 节点数:
SELECT * FROM information_schema.tiflash_replica WHERE REPLICA_COUNT > 'tobe_left_nodes';tobe_left_nodes表示缩容后的 TiFlash 节点数。如果查询结果不为空,则需要修改对应表的 TiFlash 副本数。这是因为,当 TiFlash 副本数大于缩容后的 TiFlash 节点数时,PD 不会将 Region peer 从待缩容的 TiFlash 节点上移走,导致 TiFlash 节点无法缩容。
针对需要移除集群中所有 TiFlash 节点的场景,如果
INFORMATION_SCHEMA.TIFLASH_REPLICA表显示集群已经不存在 TiFlash 副本了,但 TiFlash 节点缩容仍然无法成功,请检查最近是否执行过DROP TABLE <db-name>.<table-name>或DROP DATABASE <db-name>操作。对于带有 TiFlash 副本的表或数据库,直接执行
DROP TABLE <db-name>.<table-name>或DROP DATABASE <db-name>后,TiDB 不会立即清除 PD 上相应的表的 TiFlash 同步规则,而是会等到相应的表满足垃圾回收 (GC) 条件后才清除这些同步规则。在垃圾回收完成后,TiFlash 节点就可以缩容成功。如需在满足垃圾回收条件之前清除 TiFlash 的数据同步规则,可以参考以下步骤手动清除。
查询当前 PD 实例中所有与 TiFlash 相关的数据同步规则。
curl http://<pd_ip>:<pd_port>/pd/api/v1/config/rules/group/tiflash[ { "group_id": "tiflash", "id": "table-45-r", "override": true, "start_key": "7480000000000000FF2D5F720000000000FA", "end_key": "7480000000000000FF2E00000000000000F8", "role": "learner", "count": 1, "label_constraints": [ { "key": "engine", "op": "in", "values": [ "tiflash" ] } ] } ]删除所有与 TiFlash 相关的数据同步规则。以
id为table-45-r的规则为例,通过以下命令可以删除该规则。curl -v -X DELETE http://<pd_ip>:<pd_port>/pd/api/v1/config/rule/tiflash/table-45-r
TiFlash 分析慢
如果语句中含有 MPP 模式不支持的算子或函数等,TiDB 不会选择 MPP 模式,可能导致分析慢。此时,可以执行 EXPLAIN 语句检查 SQL 中是否含有 TiFlash 不支持的函数或算子。
create table t(a datetime);
alter table t set tiflash replica 1;
insert into t values('2022-01-13');
set @@session.tidb_enforce_mpp=1;
explain select count(*) from t where subtime(a, '12:00:00') > '2022-01-01' group by a;
show warnings;
示例中,warning 消息显示,因为 TiDB 5.4 及更早的版本尚不支持 subtime 函数的下推,因此 TiDB 没有选择 MPP 模式。
+---------+------+-----------------------------------------------------------------------------+
> | Level   | Code | Message                                                                     |
+---------+------+-----------------------------------------------------------------------------+
| Warning | 1105 | Scalar function 'subtime'(signature: SubDatetimeAndString, return type: datetime) is not supported to push down to tiflash now.       |
+---------+------+-----------------------------------------------------------------------------+
TiFlash 数据不同步
在部署完 TiFlash 节点且进行了数据的同步操作(ALTER 操作)之后,如果实际没有数据同步到 TiFlash 节点,你可以通过以下步骤确认或解决问题:
检查同步操作是否执行。
执行
ALTER table <tbl_name> set tiflash replica <num>操作,查看是否有正常返回:- 如果有正常返回,进入下一步。
 - 如果无正常返回,请执行 
SELECT * FROM information_schema.tiflash_replica检查是否已经创建 TiFlash replica。如果没有,请重新执行ALTER table ${tbl_name} set tiflash replica ${num},查看是否有其他执行语句(如add index),或者检查 DDL 操作是否正常。 
检查 TiFlash Region 同步是否正常。
查看
progress是否有变化:- 如果有变化,说明 TiFlash 同步正常,进入下一步。
 - 如果没有变化,说明 TiFlash 同步异常,在 
tidb.log中,搜索Tiflash replica is not available相关日志。检查对应表的progress是否更新。如果无更新,请检查tiflash log来获取更多信息。例如,在tiflash log中搜索lag_region_info来判断同步落后的 Region。 
使用 pd-ctl 检查 PD 的 Placement Rules 功能是否开启:
echo 'config show replication' | /path/to/pd-ctl -u http://<pd-ip>:<pd-port>- 如果返回 
true,进入下一步。 - 如果返回 
false,你需要先开启 Placement Rules 特性,然后进入下一步。 
- 如果返回 
 检查集群副本数
max-replicas配置是否合理。- 如果 
max-replicas取值未超过 TiKV 节点数,进入下一步。 - 如果 
max-replicas超过 TiKV 节点数,PD 不会向 TiFlash 同步数据。此时,请将max-replicas修改为小于等于 TiKV 节点数的整数。 
curl -X POST -d '{ "group_id": "pd", "id": "default", "start_key": "", "end_key": "", "role": "voter", "count": 3, "location_labels": [ "host" ] }' <http://172.16.x.xxx:2379/pd/api/v1/config/rule>- 如果 
 检查 TiDB 是否为表创建 Placement rule。
搜索 TiDB DDL Owner 的日志,检查 TiDB 是否通知 PD 添加 Placement rule。对于非分区表搜索
ConfigureTiFlashPDForTable;对于分区表,搜索ConfigureTiFlashPDForPartitions。- 有关键字,进入下一步。
 - 没有关键字,收集相关组件的日志进行排查。
 
检查 PD 是否为表设置 Placement rule。
可以通过
curl http://<pd-ip>:<pd-port>/pd/api/v1/config/rules/group/tiflash查询比较当前 PD 上的所有 TiFlash 的 Placement rule。如果观察到有 id 为table-<table_id>-r的 Rule,则表示 PD rule 设置成功。检查 PD 是否正常发起调度。
查看
pd.log日志是否出现table-<table_id>-r关键字,且之后是否出现add operator之类的调度行为。- 是,PD 调度正常。
 - 否,PD 调度异常。
 
TiFlash 数据同步卡住
如果 TiFlash 数据一开始可以正常同步,过一段时间后全部或者部分数据无法继续同步,你可以通过以下步骤确认或解决问题:
检查磁盘空间。
检查磁盘使用空间比例是否高于
low-space-ratio的值(默认值 0.8,即当节点的空间占用比例超过 80% 时,为避免磁盘空间被耗尽,PD 会尽可能避免往该节点迁移数据)。- 如果磁盘使用率大于等于 
low-space-ratio,说明磁盘空间不足。此时,请删除不必要的文件,如${data}/flash/目录下的space_placeholder_file文件(必要时可在删除文件后将reserve-space设置为 0MB)。 - 如果磁盘使用率小于 
low-space-ratio,说明磁盘空间正常,进入下一步。 
- 如果磁盘使用率大于等于 
 检查是否有
down peer(down peer没有清理干净可能会导致同步卡住)。- 执行 
pd-ctl region check-down-peer命令检查是否有down peer。 - 如果存在 
down peer,执行pd-ctl operator add remove-peer <region-id> <tiflash-store-id>命令将其清除。 
- 执行 
 
数据同步慢
同步慢可能由多种原因引起,你可以按以下步骤进行排查。
调大调度参数
store limit,加快同步速度。调整 TiFlash 侧负载。
TiFlash 负载过大会引起同步慢,可通过 Grafana 中的 TiFlash-Summary 面板查看各个指标的负载情况:
Applying snapshots Count:TiFlash-summary>raft>Applying snapshots CountSnapshot Predecode Duration:TiFlash-summary>raft>Snapshot Predecode DurationSnapshot Flush Duration:TiFlash-summary>raft>Snapshot Flush DurationWrite Stall Duration:TiFlash-summary>Storage Write Stall>Write Stall Durationgenerate snapshot CPU:TiFlash-Proxy-Details>Thread CPU>Region task worker pre-handle/generate snapshot CPU
根据业务优先级,调整负载情况。