作者:徐奇
TiKV 推出了名为“partitioned-raft-kv”的新实验性功能,该功能采用一种新的架构,不仅可以显著提高 TiDB 的可扩展性,还能提升 TiDB 的写吞吐量和性能稳定性。
在上一篇文章中,我们介绍了 Partitioned Raft KV 这一新实验特性带来的性能和可伸缩性大幅提升。本文我们将为大家介绍为什么它可以有如此大的优势。
以下是 TiKV 的架构。
图 1 TiKV 架构 —— 逻辑数据分区
一个 TiKV 集群由许多数据分区(也称为 Region)组成。每个 Region 负责特定的数据片段,由其起始和结束键范围决定。它在不同的 TiKV 节点上拥有 3 个或更多的副本,并通过 raft 协议进行同步。在旧的 raft 引擎中,每个 TiKV 中只有一个 RocksDB 实例用于存储所有 Region 的数据。partitioned-raft-KV 特性引入了一个新的物理数据布局:每个 Region 都有自己的 RocksDB 实例。
图 2:物理数据布局比较
“Region” 是 TiKV 中的逻辑规模单元。每个数据访问和管理操作,如负载均衡、扩展和缩小都由 Region 进行分区。然而,在当前架构中,它是一个纯逻辑概念,物理上没有清晰的区域边界。这意味着:
图 3:不同 Region 之间的压缩数据
因此,在旧的 raft KV 引擎中,我们可能会遇到以下问题:
因此,使用 partitioned raft KV,TiDB 在扩展或缩小数据方面的速度大约快 5 倍,并且由于压缩的影响要小得多,其性能总体上更加稳定。
一切看起来都很好。但是还有一个问题。现在我们有更多的 RocksDB 实例,因此它们的 memtable 的内存消耗要多得多,这意味着您可能需要额外的 5GB〜10GB 的内存开销才能在内存消耗和性能之间达到平衡。因此,当内存资源已经非常紧张时,通常不建议打开此功能。但是,当您在 TiKV 中有额外的内存并关心可扩展性和写入性能时,这个功能可能会对您有所帮助。
一些客户可能会说当前版本的 TiDB 已经足够好了。所以新功能对他们来说似乎并不重要。但是,如果他们可以在一个集群中用于多个工作负载,而且每个工作负载都可以得到良好的隔离和 QoS 保证呢?这就是 7.0 版本中的“资源管控”功能。 “partitioned raft KV” 功能旨在最大化硬件性能,与“资源管控”一起使用,我们的客户将能够充分利用其硬件资源,并通过将多个工作负载合并到一个集群中来降低成本。