从上面我们可以看到,这么多 Region 的消息是一个接一个地处理。那么在 Region 很多的情况下,Raftstore 会需要花费一些时间处理大量 Region 的心跳,势必会引入一些延迟,导致一些读写请求得不到特别及时的处理。如果在读写压力大的情况下,很容易使得 Raftstore 线程 CPU 达到瓶颈,而延迟会被进一步放大,进而影响性能表现。
常见现象
一般来说,在有负载的情况下,如果 TiKV 的 Raftstore CPU 使用率达到了 85%+(指的是单线程的情况,多线程等比例放大),我们就认为 Raftstore 已经达到了比较繁忙的状态成为了瓶颈(由于 Raftstore 线程中有 IO 操作,所以 CPU 使用率不可能达到 100%),同时 propose wait duration 可能会达到百毫秒级别。
既然我们已经知道了性能问题的根源,那么就可以从两方面入手:减少单个 TiKV 实例的 Region 数;减少单个 Region 的消息数。根据不同版本,具体可以参考以下优化方法:
v2.1 版本
在 v2.1 版本中 Raftstore 只能是单线程,因此一般在 Region 数超过 10 万时就会逐渐成为瓶颈。
1. 增加 TiKV 实例
如果 IO 资源和 CPU 资源都还有比较多的盈余的话,可以在单个机器上部署多个 TiKV 实例,以减少单个 TiKV 实例上的 Region 个数,或者扩容集群的 TiKV 机器数。
2. 开启 Region Merge
另外一种可以减少 Region 个数的办法是开启 Region Merge。与 Region Split 相反,Region Merge 是通过调度把相邻的小 Region 合并的过程。在集群有删除数据或者进行过 Drop Table/Truncate Table 后,可以将那些小 Region 甚至空 Region 进行合并以减少资源的消耗。
简单来说,通过 pd-ctl 设置相关参数即可开启 Region Merge
>> pd-ctl config set max-merge-region-size 20
>> pd-ctl config set max-merge-region-keys 200000
>> pd-ctl config set merge-schedule-limit 8
在实际情况下,读写请求并不会均匀的打在每个 Region 上,而是主要集中在少数的 Region 上,那么对于暂时空闲的 Region 我们是不是可以尽量减少它们的消息数量。这也就是 Hibernate Region 的主要思想,在无必要的时候不进行 raft-base-tick,也就是不去驱动那些空闲 Region 的 Raft 状态机,那么就不会触发这些 Region 的 Raft 心跳信息的产生,极大得减小了 Raftstore 的工作负担。
截止发稿时 Hibernate Region 还是一个实验 feature,在 master 上已经默认开启。如有需要,可酌情开启,相关配置说明请参考 配置 Hibernate Region。
其他可能出现的问题
PD Leader 切换慢
PD 需要将 Region Meta 信息持久化在 etcd 以保证 PD Leader 节点切换后能快速继续提供 Region 路由服务。随着 Region 数量的增长,Etcd 的性能问题会使得 PD 在切换 Leader 时从 etcd 获取这些信息时比较慢,在百万 Region 量级时可能达到十几秒甚至几十秒。
因此在 v3.0 版本中 PD 将 Region Meta 信息存在本地的 LevelDB 中,通过另外的机制同步 PD 节点间的信息。
在 TiKV 中是由 pd-worker 这个模块来将 Region Meta 信息定期上报给 PD,在 TiKV 重启或者 Region Leader 切换时需要通过统计信息重新计算 Region 的 approximate size/keys。那么在 Region 数量比较多的情况下,pd-worker 单线程可能成为瓶颈,造成任务的堆积不能及时处理,因此 PD 不能及时获取某些 Region Meta 信息以致路由信息更新不及时。该问题不会影响实际的读写,但可能导致 PD 调度的不准确以及 TiDB 更新 region cache 时需要多几次 round-trip。
本文介绍了百万级 Region 的集群规模下的常见问题以及相应的处理方法。总体来讲,在 v3.0 版本中我们做了比较多的优化,海量 Region 导致的性能问题上已经有了明显的改善。希望本文在问题根源的解释上能帮助读者更好的理解相关参数调整背后的逻辑,并能举一反三地应用在类似问题的解决上。最后,“量变引起质变”,大家的参与才能让我们的产品更进一步,期待你们的反馈和建议(zhangbokang@pingcap.com)。