School - TiDB Region Spilt
Contents
[NOTE] Updated August 24, 2018. This article may have outdated content or subject matter.
0x00 元
收到监控 & 业务告警,内容为目前 QPS duration > 1s
首先排查监控缩小范围
交叉信息判定为 region 超过 144mb 以后未分裂,造成 get snapshot 持续失败,同时 region 过大造成写入和读取数据动作资源消耗过大
SQL 读取数据时 tikv 向命中每 region 发送单次 tikvRPC 请求;由于 region 过大,可能包含该 SQL 命中的所有数据,造成 tikvRPC 数据包过大
写入数据时,region 数量大于过半时才能提交成功,region 过大造成无法 compaction 、被 PD schedule region 时成本加大、region 内查询数据成本过大等
region spilt
正常流程
- 初始化 region ,region id 2
- region id 2 写入数据达到 144MB
- region id 2 接收 split 操作
- region 从尾部追加写入
- 切割时从头部粗略计算 96mb
- 保持尾部 id 不变、尾部可持续写入
- region id 2 分列成 id 2 & id 10 两个 region / 其中 id 2 为 48mb,id 10 为 96mb(实际非精准计算)
异常场景
- 数据写入过快时,磁盘或者 split cpu work 跟不上时可能会出现 split 持续失败
- region spilt 单线程工作,前期版本 reigon spilt 根据 IO 大小扫描 96mb 后执行 split
- 会实际消耗 96mb 扫描 region 的 IOPS / 消耗创建新 region + 创建 snapshot 等 IOPS
0x01 二次确认
TiKV 日志
|
|
Region meta
|
|
0x02 修复
查看 split 线程状态使用用
strace -p "tid of split worker"
- strace 会阻断程序运行,谨慎使用
使用 PD-ctl 工具手工发起 split region 请求
1 2
>> operator add split-region 1 --policy=approximate // 将 Region 1 对半拆分成两个 Region,基于粗略估计值 >> operator add split-region 1 --policy=scan // 将 Region 1 对半拆分成两个 Region,基于精确扫描值