返回顶部
首页 > 资讯 > 数据库 >TiDB 技术内幕 - 说存储
  • 888
分享到

TiDB 技术内幕 - 说存储

2024-04-02 19:04:59 888人浏览 独家记忆
摘要

引言 数据库、操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石。其中数据库更靠近应用层,是很多业务的支撑。这一领域经过了几十年的发展,不断的有新的进展。 很多人

引言

数据库操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石。其中数据库更靠近应用层,是很多业务的支撑。这一领域经过了几十年的发展,不断的有新的进展。

很多人用过数据库,但是很少有人实现过一个数据库,特别是实现一个分布式数据库。了解数据库的实现原理和细节,一方面可以提高个人技术,对构建其他系统有帮助,另一方面也有利于用好数据库。

研究一门技术最好的方法是研究其中一个开源项目,数据库也不例外。单机数据库领域有很多很好的开源项目,其中 Mysqlpostgresql 是其中知名度最高的两个,不少同学都看过这两个项目的代码。但是分布式数据库方面,好的开源项目并不多。 TiDB 目前获得了广泛的关注,特别是一些技术爱好者,希望能够参与这个项目。由于分布式数据库自身的复杂性,很多人并不能很好的理解整个项目,所以我希望能写一些文章,自顶向上,由浅入深,讲述 TiDB 的一些技术原理,包括用户可见的技术以及大量隐藏在 sql 界面后用户不可见的技术点。

保存数据

TiDB 技术内幕 - 说存储

数据库最根本的功能是能把数据存下来,所以我们从这里开始。

保存数据的方法很多,最简单的方法是直接在内存中建一个数据结构,保存用户发来的数据。比如用一个数组,每当收到一条数据就向数组中追加一条记录。这个方案十分简单,能满足最基本,并且性能肯定会很好,但是除此之外却是漏洞百出,其中最大的问题是数据完全在内存中,一旦停机或者是服务重启,数据就会永久丢失。

为了解决数据丢失问题,我们可以把数据放在非易失存储介质(比如硬盘)中。改进的方案是在磁盘上创建一个文件,收到一条数据,就在文件中 Append 一行。OK,我们现在有了一个能持久化存储数据的方案。但是还不够好,假设这块磁盘出现了坏道呢?我们可以做 RaiD (Redundant Array of Independent Disks),提供单机冗余存储。如果整台机器都挂了呢?比如出现了火灾,RAID 也保不住这些数据。我们还可以将存储改用网络存储,或者是通过硬件或者软件进行存储复制。到这里似乎我们已经解决了数据安全问题,可以松一口气了。But,做复制过程中是否能保证副本之间的一致性?也就是在保证数据不丢的前提下,还要保证数据不错。保证数据不丢不错只是一项最基本的要求,还有更多令人头疼的问题等待解决:

  • 能否支持跨数据中心的容灾?
  • 写入速度是否够快?
  • 数据保存下来后,是否方便读取?
  • 保存的数据如何修改?如何支持并发的修改?
  • 如何原子地修改多条记录?

这些问题每一项都非常难,但是要做一个优秀的数据存储系统,必须要解决上述的每一个难题。 为了解决数据存储问题,我们开发了 TiKV 这个项目。接下来我向大家介绍一下 TiKV 的一些设计思想和基本概念。

Key-Value

作为保存数据的系统,首先要决定的是数据的存储模型,也就是数据以什么样的形式保存下来。TiKV 的选择是 Key-Value 模型,并且提供有序遍历方法。简单来讲,可以将 TiKV 看做一个巨大的 Map,其中 Key 和 Value 都是原始的 Byte 数组,在这个 Map 中,Key 按照 Byte 数组总的原始二进制比特位比较顺序排列。 大家这里需要对 TiKV 记住两点:

  1. 这是一个巨大的 Map,也就是存储的是 Key-Value pair
  2. 这个 Map 中的 Key-Value pair 按照 Key 的二进制顺序有序,也就是我们可以 Seek 到某一个 Key 的位置,然后不断的调用 Next 方法以递增的顺序获取比这个 Key 大的 Key-Value

讲了这么多,有人可能会问了,这里讲的存储模型和 SQL 中表是什么关系?在这里有一件重要的事情要说四遍:

这里的存储模型和 SQL 中的 Table 无关! 这里的存储模型和 SQL 中的 Table 无关! 这里的存储模型和 SQL 中的 Table 无关! 这里的存储模型和 SQL 中的 Table 无关!

现在让我们忘记 SQL 中的任何概念,专注于讨论如何实现 TiKV 这样一个高性能高可靠性的巨大的(分布式的) Map。

RocksDB

任何持久化的存储引擎,数据终归要保存在磁盘上,TiKV 也不例外。但是 TiKV 没有选择直接向磁盘上写数据,而是把数据保存在 RocksDB 中,具体的数据落地由 RocksDB 负责。这个选择的原因是开发一个单机存储引擎工作量很大,特别是要做一个高性能的单机引擎,需要做各种细致的优化,而 RocksDB 是一个非常优秀的开源的单机存储引擎,可以满足我们对单机引擎的各种要求,而且还有 Facebook 的团队在做持续的优化,这样我们只投入很少的精力,就能享受到一个十分强大且在不断进步的单机引擎。当然,我们也为 RocksDB 贡献了一些代码,希望这个项目能越做越好。这里可以简单的认为 RocksDB 是一个单机的 Key-Value Map。

Raft

好了,万里长征第一步已经迈出去了,我们已经为数据找到一个高效可靠的本地存储方案。俗话说,万事开头难,然后中间难,最后结尾难。接下来我们面临一件更难的事情:如何保证单机失效的情况下,数据不丢失,不出错?简单来说,我们需要想办法把数据复制到多台机器上,这样一台机器挂了,我们还有其他的机器上的副本;复杂来说,我们还需要这个复制方案是可靠、高效并且能处理副本失效的情况。听上去比较难,但是好在我们有 Raft 协议。Raft 是一个一致性算法,它和 Paxos 等价,但是更加易于理解。这里是 Raft 的论文,感兴趣的可以看一下。本文只会对 Raft 做一个简要的介绍,细节问题可以参考论文。另外提一点,Raft 论文只是一个基本方案,严格按照论文实现,性能会很差,我们对 Raft 协议的实现做了大量的优化,具体的优化细节可参考我司首席架构师 tangliu 同学的这篇文章。

Raft 是一个一致性协议,提供几个重要的功能:

  1. Leader 选举
  2. 成员变更
  3. 日志复制

TiKV 利用 Raft 来做数据复制,每个数据变更都会落地为一条 Raft 日志,通过 Raft 的日志复制功能,将数据安全可靠地同步到 Group 的多数节点中。

TiDB 技术内幕 - 说存储

到这里我们总结一下,通过单机的 RocksDB,我们可以将数据快速地存储在磁盘上;通过 Raft,我们可以将数据复制到多台机器上,以防单机失效。数据的写入是通过 Raft 这一层的接口写入,而不是直接写 RocksDB。通过实现 Raft,我们拥有了一个分布式的 KV,现在再也不用担心某台机器挂掉了。

Region

讲到这里,我们可以提到一个 非常重要的概念Region。这个概念是理解后续一系列机制的基础,请仔细阅读这一节。

前面提到,我们将 TiKV 看做一个巨大的有序的 KV Map,那么为了实现存储的水平扩展,我们需要将数据分散在多台机器上。这里提到的数据分散在多台机器上和 Raft 的数据复制不是一个概念,在这一节我们先忘记 Raft,假设所有的数据都只有一个副本,这样更容易理解。

对于一个 KV 系统,将数据分散在多台机器上有两种比较典型的方案:一种是按照 Key 做 Hash,根据 Hash 值选择对应的存储节点;另一种是分 Range,某一段连续的 Key 都保存在一个存储节点上。TiKV 选择了第二种方式,将整个 Key-Value 空间分成很多段,每一段是一系列连续的 Key,我们将每一段叫做一个 Region,并且我们会尽量保持每个 Region 中保存的数据不超过一定的大小(这个大小可以配置,目前默认是 64mb)。每一个 Region 都可以用 StarTKEy 到 EndKey 这样一个左闭右开区间来描述。

TiDB 技术内幕 - 说存储

注意,这里的 Region 还是和 SQL 中的表没什么关系! 请各位继续忘记 SQL,只谈 KV。 将数据划分成 Region 后,我们将会做 两件重要的事情

  • 以 Region 为单位,将数据分散在集群中所有的节点上,并且尽量保证每个节点上服务的 Region 数量差不多
  • 以 Region 为单位做 Raft 的复制和成员管理

这两点非常重要,我们一点一点来说。

先看第一点,数据按照 Key 切分成很多 Region,每个 Region 的数据只会保存在一个节点上面。我们的系统会有一个组件来负责将 Region 尽可能均匀的散布在集群中所有的节点上,这样一方面实现了存储容量的水平扩展(增加新的结点后,会自动将其他节点上的 Region 调度过来),另一方面也实现了负载均衡(不会出现某个节点有很多数据,其他节点上没什么数据的情况)。同时为了保证上层客户端能够访问所需要的数据,我们的系统中也会有一个组件记录 Region 在节点上面的分布情况,也就是通过任意一个 Key 就能查询到这个 Key 在哪个 Region 中,以及这个 Region 目前在哪个节点上。至于是哪个组件负责这两项工作,会在后续介绍。

对于第二点,TiKV 是以 Region 为单位做数据的复制,也就是一个 Region 的数据会保存多个副本,我们将每一个副本叫做一个 Replica。Repica 之间是通过 Raft 来保持数据的一致(终于提到了 Raft),一个 Region 的多个 Replica 会保存在不同的节点上,构成一个 Raft Group。其中一个 Replica 会作为这个 Group 的 Leader,其他的 Replica 作为 Follower。所有的读和写都是通过 Leader 进行,再由 Leader 复制给 Follower。 大家理解了 Region 之后,应该可以理解下面这张图:

TiDB 技术内幕 - 说存储

我们以 Region 为单位做数据的分散和复制,就有了一个分布式的具备一定容灾能力的 KeyValue 系统,不用再担心数据存不下,或者是磁盘故障丢失数据的问题。这已经很 Cool,但是还不够完美,我们需要更多的功能。

mvcC

很多数据库都会实现多版本控制(MVCC),TiKV 也不例外。设想这样的场景,两个 Client 同时去修改一个 Key 的 Value,如果没有 MVCC,就需要对数据上,在分布式场景下,可能会带来性能以及死锁问题。 TiKV 的 MVCC 实现是通过在 Key 后面添加 Version 来实现,简单来说,没有 MVCC 之前,可以把 TiKV 看做这样的:

	Key1 -> Value
	Key2 -> Value
	……
	KeyN -> Value
您可能感兴趣的文档:

--结束END--

本文标题: TiDB 技术内幕 - 说存储

本文链接: https://lsjlt.com/news/45967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • TiDB 技术内幕 - 说存储
    引言 数据库、操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石。其中数据库更靠近应用层,是很多业务的支撑。这一领域经过了几十年的发展,不断的有新的进展。 很多人...
    99+
    2024-04-02
  • TiDB 技术内幕 - 说计算
    关系模型到 Key-Value 模型的映射 在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 ...
    99+
    2024-04-02
  • TiDB 技术内幕 - 谈调度
    为什么要进行调度 先回忆一下第一篇文章提到的一些信息,TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有...
    99+
    2024-04-02
  • 《MySQL技术内幕-InnoDB存储引擎》整理5-锁
    一、什么是锁 锁机制用于管理对共享文件的并发访问,并提供数据的完整性和一致性。对于MyISAM引擎,其锁是表锁结构,在并发情况下读没有问题,但是并发插入时性能较差。而对于Microsoft SQL Server,在乐观并发下支持行级锁,但是...
    99+
    2018-08-26
    《MySQL技术内幕-InnoDB存储引擎》整理5-锁 数据库入门 数据库基础教程 数据库 mysql
  • 大数据存储技术基础
    一、绪论 1.存储的本质 信息跨越空间的传递——通讯  信息跨越时间的传递——存储 通讯:利用具有跨越空间特性的物理现象 ---声音、光、电 存储:利用具有时间稳态的物理现象 ---物理稳态、磁稳态、半导体稳态 什么是存储? 存储...
    99+
    2018-01-24
    大数据存储技术基础
  • 存储技巧分享:如何使用 PHP 缓存打包技术优化存储?
    在 Web 开发中,缓存是一项非常重要的技术,可以有效地提高网站的性能和响应速度。PHP 缓存打包技术是一种常用的优化存储的方法,可以将多个文件打包成一个文件,从而减少文件数量,降低文件系统的负担,提高网站的响应速度。本文将介绍如何使用 ...
    99+
    2023-06-19
    缓存 打包 存储
  • 什么是HTML5本地存储技术
    什么是HTML5本地存储技术,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。本地缓存是HTML5出现的新技术,这个技术的出现使得移动web的开发...
    99+
    2024-04-02
  • 分布式存储技术是什么
    分布式存储是用于实现应用数据文件的 IO共享,提供大量的数据存储和处理服务,通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落,使用户需要用到数据的时候,能够快速...
    99+
    2024-04-02
  • 【硬件】存储的RAID技术详解
    存储的RAID技术详解1.RAID技术:存储中的控制器将硬盘按照某种规则进行整合,从而加快了存储中硬盘的读写效率。2.RAID技术特点(1)提供存储中硬盘的冗余(2)提高存储中硬盘的读写效率3.常见的RAIDRAID0RAID1RAID5R...
    99+
    2023-06-04
  • 存储技术的必备利器——Go 同步存储教程
    随着信息时代的到来,数据的存储和管理变得越来越重要。在这个领域,Go 语言以其高效、并发、安全等特性,成为了一款备受欢迎的语言。在这篇文章中,我们将介绍如何使用 Go 语言实现同步存储,以及如何使用一些常用的存储技术,让你的数据更加安全可...
    99+
    2023-10-19
    同步 存储 教程
  • Mysql技术内幕之InnoDB锁的深入讲解
    前言 自7月份换工作以来,期间一直在学习MySQL的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的。于是想着从书籍中找答案。毕竟一直 看视频也不是办法,不能形成自己的知识。于是想着看书汲取知识,看...
    99+
    2022-05-10
    mysql innodb锁 mysql查innodb
  • HTML5本地存储技术怎么使用
    本篇内容主要讲解“HTML5本地存储技术怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5本地存储技术怎么使用”吧! 本地缓存是HTML5出现的...
    99+
    2024-04-02
  • PHP 有哪些内存优化技术
    介绍 PHP 是一种流行的 Web 开发编程语言,但由于其动态特性和垃圾收集过程,它可能容易出现高内存使用率。 但是,我们可以使用多种技术来优化内存使用并提高 PHP 应用程序的性能。 在本文中...
    99+
    2024-02-27
  • 存储技术:最新的创新和发展
    云存储:无限可扩展性和灵活性 云存储已成为企业存储数据的首选方式之一。它提供了无限可扩展性、按需使用和基于订阅的定价模型,使企业能够根据需要灵活调整其存储需求。领先的云提供商如亚马逊网络服务 (AWS)、Microsoft Azure ...
    99+
    2024-02-18
    云存储 边缘计算 闪存 虚拟化 数据湖
  • FreeBSD支持哪些虚拟化存储技术
    FreeBSD支持以下虚拟化存储技术: ZFS(Zettabyte File System):ZFS是一种先进的文件系统和卷管理器...
    99+
    2024-04-02
  • C++技术中的内存管理:容器类中的内存管理技巧
    容器类中的内存管理技巧对于编写高效且可靠的 c++++ 代码至关重要,它使用栈分配、堆分配和内存池来管理数据。栈分配:临时变量和局部变量存储在函数的栈帧中,快速有效,但生命周期受函数调用...
    99+
    2024-05-07
    内存管理 容器类 c++
  • C++技术中的内存管理:内存泄漏检测和调试技巧
    检测内存泄漏使用 valgrind 等工具检测内存泄漏。利用 ms visual studio memory profiler 识别泄漏。借助 c++++ runtime library...
    99+
    2024-05-08
    内存管理 调试技巧 c++ 标准库
  • BaikalDB技术实现内幕(一)-- 分布式事务实现
    本系列文章主要介绍HTAP数据库BaikalDB的技术实现细节。 作者介绍:罗小兵,百度商业平台研发部高级研发工程师,主要负责BaikalDB事务能力,全局二级索引等方向的研发工作。 欢迎关注 Star github.com/baidu/...
    99+
    2016-05-06
    BaikalDB技术实现内幕(一)-- 分布式事务实现
  • Python缓存技术是否适用于大数据存储?
    Python缓存技术是一种提高程序性能的技术,它的主要作用是将数据存储在内存中,以便更快地访问。Python缓存技术可以应用于各种情况,包括小型应用程序和大型数据存储。但是,Python缓存技术是否适用于大数据存储呢?本文将探讨这个问题,...
    99+
    2023-10-21
    缓存 大数据 存储
  • 存储技术的更新换代,对 Python Django 开发技术有何影响?
    随着科技的不断发展,存储技术也在不断的更新换代。这些更新换代对于各种编程语言和开发框架都会产生影响,其中 Python Django 作为一种流行的 Web 开发框架,也不例外。 一、存储技术的更新换代 随着人们对数据量的不断增加,传统的存...
    99+
    2023-06-19
    django 开发技术 存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作