TiKV 新架构:Partitioned Raft KV 原理解析

news/2024/5/19 14:53:42 标签: 服务器, 数据库, mysql, tidb

作者:徐奇

TiKV 推出了名为“partitioned-raft-kv”的新实验性功能,该功能采用一种新的架构,不仅可以显著提高 TiDB 的可扩展性,还能提升 TiDB 的写吞吐量和性能稳定性。

在上一篇文章中,我们介绍了 Partitioned Raft KV 这一新实验特性带来的性能和可伸缩性大幅提升。本文我们将为大家介绍为什么它可以有如此大的优势。

架构

以下是 TiKV 的架构。

请添加图图 1 TiKV 架构 —— 逻辑数据分区片描述图 1 TiKV 架构 —— 逻辑数据分区

一个 TiKV 集群由许多数据分区(也称为 Region)组成。每个 Region 负责特定的数据片段,由其起始和结束键范围决定。它在不同的 TiKV 节点上拥有 3 个或更多的副本,并通过 raft 协议进行同步。在旧的 raft 引擎中,每个 TiKV 中只有一个 RocksDB 实例用于存储所有 Region 的数据。partitioned-raft-KV 特性引入了一个新的物理数据布局:每个 Region 都有自己的 RocksDB 实例。

请添加图 2:物理数据布局比较图片描述
图 2:物理数据布局比较

旧 Raft KV 引擎面临的挑战

“Region” 是 TiKV 中的逻辑规模单元。每个数据访问和管理操作,如负载均衡、扩展和缩小都由 Region 进行分区。然而,在当前架构中,它是一个纯逻辑概念,物理上没有清晰的区域边界。这意味着:

  1. 当需要将一个 Region 的数据从一个 TiKV 移动到另一个 TiKV(也称为负载均衡)时,TiKV 需要在巨大的 RocksDB 实例中进行扫描以获取该 Region 的数据。这造成了读扩大。
  2. 当几个 Region 具有大量的写流量时,如果它们的键范围分散,那么很可能会触发 RocksDB 中的大型压缩,其中包括其他空闲 Region 的数据。这引入了读和写扩大。例如,SST11 是一个 1MB 大小的 SST,只有 region1 的数据,但包含相当大的键范围。当它被选中合并到 L2 时,SST21、SST22 和 SST23 都参与了压缩,它们包含了 region2、3、4 的数据。TiKV 的规模越大,读写扩大越大。

请添加图图 3:不同 Region 之间的压缩数据片描述
图 3:不同 Region 之间的压缩数据

  1. 没有 Region 隔离,因此少数热门 Region 可能会拖慢所有 Region 的性能。

因此,在旧的 raft KV 引擎中,我们可能会遇到以下问题:

  1. 扩所容的速度很慢,因为需要多次数据扫描。
  2. 由于 RocksDB 的写组是单线程的,因此写吞吐量受到限制。
  3. 由于数据压缩会不时发生,当 RocksDB 的数据量很大时,用户流量的延迟不稳定。

Partitioned Raft KV 引擎的改进

  • 每个 Region 的数据都是一个专用的 RocksDB 实例,因此只需将 RocksDB 进行 x-copy 以进行 Region 间的负载均衡,避免了读放大的发生。
  • 热点 Region 的写入流量只会触发其自己的 RocksDB 的压缩,不涉及其他 Region 的数据。因此,它有效地减少了读和写放大。
  • 在将数据写入RocksDB时,写入线程之间并不会发生数据同步和锁争用,因为每个线程都在写一个不同的 RocksDB 实例。这样就消除了写入瓶颈。由于没有 WAL 日志,向 RocksDB 的写入是一个内存操作。
  • 一个 RocksDB 性能不好并不会影响其他 Region。因此,Region 的性能在存储层面上是隔离的。
  • 现在每个 Region 都支持更大的容量, 默认情况下为 15 GB。和过去 96MB 的 Region 大小限制相比,心跳和内存占用这一类的 Region 开销降幅高达 99%。

因此,使用 partitioned raft KV,TiDB 在扩展或缩小数据方面的速度大约快 5 倍,并且由于压缩的影响要小得多,其性能总体上更加稳定。

适用范围

一切看起来都很好。但是还有一个问题。现在我们有更多的 RocksDB 实例,因此它们的 memtable 的内存消耗要多得多,这意味着您可能需要额外的 5GB〜10GB 的内存开销才能在内存消耗和性能之间达到平衡。因此,当内存资源已经非常紧张时,通常不建议打开此功能。但是,当您在 TiKV 中有额外的内存并关心可扩展性和写入性能时,这个功能可能会对您有所帮助。

写在最后

一些客户可能会说当前版本的 TiDB 已经足够好了。所以新功能对他们来说似乎并不重要。但是,如果他们可以在一个集群中用于多个工作负载,而且每个工作负载都可以得到良好的隔离和 QoS 保证呢?这就是 7.0 版本中的“资源管控”功能。 “partitioned raft KV” 功能旨在最大化硬件性能,与“资源管控”一起使用,我们的客户将能够充分利用其硬件资源,并通过将多个工作负载合并到一个集群中来降低成本。


http://www.niftyadmin.cn/n/329683.html

相关文章

C语言基础知识:函数的声明和使用

目录 函数的声明 1.定义顺序 2.函数的声明 3.函数的声明格式 多源文件开发 1.为什么要有多个源文件 2.将sum函数写到其他源文件中 3.在main函数中调用sum函数 4.编译所有的源文件 5.链接所有的目标文件 #include 1.#include的作用 2.#include可以使用绝对路径 3.#…

Unity UI -- (1)概览

UI(User Interface,用户接口),是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中,UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…

java多线程_01

文章目录 1. 线程的概念1. 程序2. 进程3. 线程4. Java程序的运行原理5. 并发与并行概念1. 并发2. 并行3. 并发编程和并行编程 2. Java中的Thread线程类1. Thread类构造方法2. Thread类普通方法3. Thread类静态方法4. Thread类特殊方法 3.线程的创建方式1. 继承Thread类2. 实现R…

github 各种 merge 教程

github 协作教程 在协同开发的过程中,git 的 merge 功能是我们必不可少的一部分。然而,在我们将一个分支合并到主分支时,可能会存在一些小的问题,比如多次提交导致的历史记录杂乱无章等。这时,我们就需要用到 git 的 …

用IDEA写的第一个JavaWeb项目(保姆级)

任何事情只有0次和无数次,项目新建了第一个就有第二个 从第一次的略显青涩到后面的轻车熟路,区别就是第一次 ——Lungcen 在IDEA中新建一个web项目,有好几种方法。本人用的方法是通过maven构建工具来构建java项目的框架。对于web服务器的选择…

17年10倍:均线金叉策略横向大测评,550条策略谁最牛?

一直有读者问老Q能不能在原理和经典用法的回测之上,做一些真正还可以用的策略的分享。 老Q是很犹豫的,毕竟有些策略,一旦用的人多了,很快就会失效。但是考虑到公众号这边刚开始运营,还是给大家送一次大福利吧!文末附福利获取方式! 一、数据获取和特征计算 因为很多人…

岗位少,竞争激烈,这是今年软件测试就业的真实写照,也是所有岗位的真实写照。

前两天跟一个HR朋友聊天,她表示刚在boss上发布了一个普通测试岗位,不到一小时竟然收到了几百份简历。而且简历质量极高,这是往年不敢想象的。岗位少,竞争激烈,这是今年软件测试就业的真实写照,也是所有岗位…

LeetCode 1049 最后一块石头的重量 II

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff…