数据库系列之TiDB存储引擎TiKV实现机制

TiDB存储引擎TiKV揭秘 TiKV 是一个分布式事务型的键值数据库,提供了满足 ACID 约束的分布式事务接口,并且通过 Raft 协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层,为用户写入 TiDB 的数据提供了持久化以及读写服务,同时还存储了 TiDB 的统计信息数据。与传统的整节点备份不同,TiKV 参考了 Spanner 设计了 multi-raft-group 的副本机制。 阅读详情

TiDB存储引擎TiKV是基于RocksDB存储引擎,通过Raft分布式算法保证数据一致性。本文详细介绍了TiKV存储引擎的实现机制和原理,加深对TiDB底层存储架构的理解。


1、TiDB存储引擎TiKV

TiDB存储引擎TiKV是分布式的key-value存储引擎,它是一种高度分层的架构,通过Raft协议保证数据一致性,不依赖于分布式文件系统。

在这里插入图片描述

1.1 存储引擎RocksDB

RocksDB是由Facebook基于LevelDB开发的一款提供key-value存储与读写功能的LSM-tree架构引擎。RocksDB适用于多CPU场景、高效利用fast storage比如SSD、弹性扩展架构、支持IO-bound/in-memory/write-once等功能。

RocksDB不是一个分布式的DB,而是一个高效、高性能、单点的数据库引擎。RocksDB持久化存储key-value键值对数据,keys 和values可以是任意的字节流,且按照keys以log-structured merge tree的形式有序存储。

在这里插入图片描述
来源:https://www.cnblogs.com/cobbliu/articles/9553271.html

上图就是Rocksdb的基础架构,主要完成以下功能:

  1. Rocksdb中引入了ColumnFamily(列族, CF)的概念,所谓列族也就是一系列kv组成的数据集。所有的读写操作都需要先指定列族。
  2. 写操作先写WAL,再写memtable,memtable达到一定阈值后切换为Immutable Memtable,只能读不能写。
  3. 后台Flush线程负责按照时间顺序将Immu Memtable刷盘,生成level0层的有序文件(SST)。
  4. SST 又分为多层(默认至多 6 层),每一层的数据达到一定阈值后会挑选一部分 SST 合并到下一层,每一层的数据是上一层的 10 倍(因此 90% 的数据存储在最后一层)。
  5. Manifest负责记录系统某个时刻SST文件的视图,Current文件记录当前最新的Manifest文件名。
  6. 每个ColumnFamily有自己的Memtable, SST文件,所有ColumnFamily共享WAL、Current、Manifest文件。

在这里插入图片描述

RocksDB作为TiKV的核心存储引擎,用于存储Raft日志以及用户数据。每个TiKV实例中有两个RocksDB实例,一个用于存储Raft日志(通常被称为raftdb),另一个用于存储用户数据以及MVCC信息(通常被称为kvdb)。kvdb中有四个ColumnFamily:raft、lock、default和write:

  • raft列:用于存储各个Region的元信息,仅占极少量空间
  • lock列:用于存储悲观事务的悲观锁以及分布式事务的一阶段Prewrite锁。当用户的事务提交之后, lock cf中对应的数据会很快删除掉,因此大部分情况下lock cf中的数据也很少(少于1GB)。如果lock cf中的数据大量增加,说明有大量事务等待提交,系统出现了bug或者故障。
  • write列:用于存储用户真实的写入数据以及MVCC信息(该数据所属事务的开始时间以及提交时间)。当用户写入了一行数据时,如果该行数据长度小于255字节,那么会被存储write列中,否则的话该行数据会被存入到default列中。由于TiDB的非unique 索引存储的value为空,unique索引存储的value为主键索引,因此二级索引只会占用writecf的空间。
  • default列:用于存储超过255字节长度的数据
1.2 LSM-tree

LSM-Tree全称是Log Structured Merge Tree,是一种分层、有序、面向磁盘的数据结构,其核心思想是充分了利用了磁盘批量的顺序写要远比随机写性能高出很多。这种结构的写入,全部都是以Append的模式追加,不存在删除和修改,但是是以牺牲部分读取性能为代价尤其是随机读,通常适合于写多读少的场景。

1.2.1 LSM-tree和SST-table

在LSM-Tree里面,核心的数据结构就是SSTable,全称是Sorted String Table。SSTable是一种拥有持久化,有序且不可变的的键值存储结构,它的key和value都是任意的字节数组,并且了提供了按指定key查找和指定范围的key区间迭代遍历的功能。SSTable内部包含了一系列可配置大小的Block块,典型的大小是64KB,关于这些Block块的index存储在SSTable的尾部,用于帮助快速查找特定的Block。当一个SSTable被打开的时候,index会被加载到内存,然后根据key在内存index里面进行一个二分查找,查到该key对应的磁盘的offset之后,然后去磁盘把响应的块数据读取出来。当然如果内存足够大的话,可以直接把SSTable直接通过MMap的技术映射到内存中,从而提供更快的查找。

在这里插入图片描述
在LSM-Tree里,SSTable有一份在内存里面,其他的多级在磁盘上,如下图所示:

在这里插入图片描述
来源:https://blog.youkuaiyun.com/u010454030/article/details/90414063

  • LSM-tree中写数据流程
  1. 当收到一个写请求时,会先把该条数据记录在WAL Log里面,用作故障恢复。
  2. 当写完WAL Log后,会把该条数据写入内存的SSTable里面(删除是标记,更新是新记录一条的数据),也称Memtable。注意为了维持有序性在内存里面可以采用红黑树或者跳跃表相关的数据结构。
  3. 当Memtable超过一定的大小后,会在内存里面冻结,变成不可变的Memtable,同时为了不阻塞写操作需要新生成一个Memtable继续提供服务。
  4. 把内存里面不可变的Memtable给dump到到硬盘上的SSTable层中,此步骤也称为Minor Compaction,这里需要注意在L0层的SSTable是没有进行合并的,所以这里的key range在多个SSTable中可能会出现重叠,在层数大于0层之后的SSTable,不存在重叠key。
  5. 当每层的磁盘上的SSTable的体积超过一定的大小或者个数,也会周期的进行合并。此步骤也称为Major Compaction,这个阶段会真正的清除掉被标记删除掉的数据以及多版本数据的合并,避免浪费空间,注意由于SSTable都是有序的,我们可以直接采用merge sort进行高效合并。
  • LSM-tree中读数据流程
  1. 当收到一个读请求的时候,会直接先在内存里面查询,如果查询到就返回。
  2. 如果没有查询到就会依次下沉,知道把所有的Level层查询一遍得到最终结果。
1.2.2 LSM-tree和B+ tree

LSM-tree和B+ tree的特性如下所示:
在这里插入图片描述
来源:In Search of an Understandable Consensus Algorithm

还有一点是基于LSM-Tree分层存储能够做到写的高吞吐,带来的副作用是整个系统必须频繁的进行compaction,写入量越大,Compaction的过程越频繁。而compaction是一个compare & merge的过程,非常消耗CPU和存储IO,在高吞吐的写入情形下,大量的compaction操作占用大量系统资源,必然带来整个系统性能断崖式下跌,对应用系统产生巨大影响,当然我们可以禁用自动Major Compaction,在每天系统低峰期定期触发合并,来避免这个问题。

1.3 Raft算法

Raft是一个共识算法,所谓共识就是多个节点多某个事情达成一致。Raft算法提供几个重要的功能:leader选举、成员变更以及日志复制。

1.3.1 Leader选举

在raft协议中,一个节点任一时刻处于以下三个状态之一:leader、follower和candidate。

在这里插入图片描述

  1. 所有节点启动时都是follower状态;
  2. 在一段时间内如果没有收到来自leader的心跳,从follower切换到candidate,发起选举;
  3. 如果收到majority的造成票(含自己的一票)则切换到leader状态;
  4. 如果发现其他节点比自己更新,则主动切换到follower。

总之,系统中最多只有一个leader,如果在一段时间里发现没有leader,则大家通过选举-投票选出leader。leader会不停的给follower发心跳消息,表明自己的存活状态。如果leader故障,那么follower会转换成candidate,重新选出leader。

  • 选举详细过程

如果follower在election timeout内没有收到来自leader的心跳,则会主动发起选举。步骤如下:

  1. 增加节点本地的 current term ,切换到candidate状态
  2. 投自己一票
  3. 并行给其他节点发送 RequestVote RPCs
  4. 等待其他节点的回复

在这个过程中,根据来自其他节点的消息,可能出现三种结果:

  1. 收到多数的投票(含自己的一票),则赢得选举,成为leader
  2. 被告知别人已当选,那么自行切换到follower
  3. 一段时间内没有收到majority投票,则保持candidate状态,重新发出选举

第一种情况,赢得了选举之后,新的leader会立刻给所有节点发消息,广而告之,避免其余节点触发新的选举。在这里,先回到投票者的视角,投票者如何决定是否给一个选举请求投票呢,有以下约束:

  • 在任一任期内,单个节点最多只能投一票
  • 候选人知道的信息不能比自己的少(这一部分,后面介绍log replication和safety的时候会详细介绍)
  • first-come-first-served 先来先得

第二种情况,比如有三个节点A B C。A B同时发起选举,而A的选举消息先到达C,C给A投了一票,当B的消息到达C时,已经不能满足上面提到的第一个约束,即C不会给B投票,而A和B显然都不会给对方投票。A胜出之后,会给B,C发心跳消息,节点B发现节点A的term不低于自己的term,知道有已经有Leader了,于是转换成follower。

第三种情况,没有任何节点获得majority投票。假如有四个节点,Node C、Node D同时成为了candidate,进入了term 4,但Node A投了NodeD一票,NodeB投了Node C一票,这就出现了平票 split vote的情况。这个时候大家都在等啊等,直到超时后重新发起选举。如果出现平票的情况,那么就延长了系统不可用的时间(没有leader是不能处理客户端写请求的),因此raft引入了randomized election timeouts来尽量避免平票情况。同时,leader-based 共识算法中,节点的数目都是奇数个,尽量保证majority的出现。

1.3.2 日志复制

选举leader以后,系统可以对外进行工作。客户端的请求发送到leader,leader来调度这些并发请求的顺序,并保证leader和follower状态的一致性。在Raft算法中,将这些请求以及执行顺序告知followers,leader和followers以相同的顺序来执行这些请求,保证状态一致。

共识算法一般是通过复制状态机来实现的,复制状态机简单来说就是:相同的初识状态 + 相同的输入=相同的结束状态。 如何保证所有节点按照相同的顺序执行相同的输入,replicated log可以实现,log具有持久化、有序的特点,是大多数分布式系统的基石。因此,在raft算法中,leader将客户端请求封装到一个个log entry,然后将这些log entries复制到所有follower节点,然后大家按相同顺序应用log entry中的command,来保证状态一致性。

在这里插入图片描述
当系统(leader)收到一个来自客户端的写请求,到返回给客户端,整个过程从leader的视角来看会经历以下步骤:

  • leader以append方式写log entry
  • leader 并行发送AppendEntries RPC
  • leader等待majority回应
  • leader将log entry应用到state machine
  • leader回复消息到client
  • leader通知follower应用log

可以看到日志的提交过程有点类似两阶段提交(2PC),不过与2PC的区别在于,leader只需要大多数(majority)节点的回复即可,这样只要超过一半节点处于工作状态则系统就是可用的。每个节点的日志并不完全一致,raft算法为了保证高可用,并不是强一致性,而是最终一致性,leader会不断尝试给follower发log entries,直到所有节点的log entries都相同。

1.3.3 TiKV中的Raft

在这里插入图片描述
来源:https://en.pingcap.com/blog/how-tikv-reads-and-writes

TiKV使用Raft算法来保证数据的一致性,默认情况下使用3副本组成一个raft group,过Raft的日志复制功能,将数据安全可靠地同步到raft group的每一个节点中。

  • 当client端需要写数据的时候,它会发送请求给Raft Leader,Leader会将操作解码为log entry并以append方式写入自己的Raft log中
  • Leader会根据Raft算法将log entry复制到Follower,Follower也会将这些entry追加到log entry中,并且通知Leader已经完成
  • 当Leader发现log entry追加到多数majority节点中,它会认为这个log entry已经committed。之后Leader会解码entry中的操作,执行它们并应用到状态机中,这个过程称之为apply

另外,TiKV支持lease Read功能:对于读请求,可以直接发送给Leader,如果leader判断基于时间的lease没有过期,则可以直接提供读请求的客户端,不需要经过Raft算法过程;如果过期了,则leader需要强制通过Raft算法来更新lease内容提供该客户端。

1.4 TiKV中的分区Region

TiKV可以看做是一个巨大的有序的KV Map,那么为了实现存储的水平扩展,数据将被分散在多台机器上。 对于一个KV系统,将数据分散在多台机器上有两种比较典型的方案:

  • Hash:按照Key做Hash,根据Hash值选择对应的存储节点
  • Range:按照Key分Range,某一段连续的Key都保存在一个存储节点上

因为使用RocksDB存储引擎,出于性能考量TiKV使用range做分区,将整个Key-Value空间分成很多段,每一段是一系列连续的Key,这些段叫做一个Region,目前在TiKV中Region默认的大小是96MB。每一个Region都可以用[StartKey,EndKey)这样一个左闭右开区间来描述。将数据划分成Region后,TiKV将完成两件事情:

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

1)以Region为单位分散数据

数据按照Key切分成很多Region,每个Region的数据只会保存在一个节点上面。TiDB系统通过PD来负责将Region尽可能均匀的散布在集群中所有的节点上,这样一方面实现了存储容量的水平扩展(增加新的节点后,会自动将其他节点上的Region调度过来),另一方面也实现了负载均衡(不会出现某个节点有很多数据,其他节点上没什么数据的情况)。同时为了保证上层客户端能够访问所需要的数据,系统中也会使用PD记录Region在节点上面的分布情况,也就是通过任意一个Key就能查询到这个Key在哪个Region中,以及这个Region目前在哪个节点上(即Key的位置路由信息)。

2)以Region为单位做Raft的复制和成员管理

TiKV是以Region为单位做数据的复制,也就是一个Region的数据会保存多个副本,TiKV将每一个副本叫做一个Replica。Replica之间是通过Raft来保持数据的一致,一个Region的多个Replica会保存在不同的节点上,构成一个Raft Group。其中一个Replica会作为这个 Group的Leader,其他的Replica作为Follower。默认情况下,所有的读和写都是通过Leader进行,读操作在Leader上即可完成,而写操作再由 Leader 复制给 Follower。
在这里插入图片描述
以Region为单位做数据的分散和复制,TiKV就成为了一个分布式的具备一定容灾能力的KeyValue系统,不用再担心数据存不下,或者是磁盘故障丢失数据的问题。

1.5 事务模型Percolator

Percolator是基于Bigtable,利用了Bigtable的单行事务特性,实现了跨行跨表的事务特性(ACID)。Percolator实现的事务具有如下特点:

  1. 利用了Bigtable的单行事务。因为Bigtable基于GFS提供了可靠的存储和原子写特性,Bigtable被选作用于实现锁服务。
  2. Percolator利用了Bigtable的timestamp来提供快照隔离(snapshot isolation),快照隔离为每一个事务提供了一个一致的快照视图。如果两个事务同时修改同一个行,那么事务冲突,其中一个事务必须回滚然后重试。
1.5.1 Percolator两阶段提交的实现

Precolator通过访问Bigtable获取数据,但是Bigtable中数据不是直接由Bigtable的节点来控制的,而是存储在GFS上面的,因此Precolator需要显式的维护锁。在所有启用了Percolator事务的表中,每一个列族都会预先增加两个列,分别是:

  • lock:存储事务过程中的锁信息;
  • write:存储当前行可见(最近一次提交)的版本号

Percolator事务分为两个阶段:预写(Pre-write)和提交(Commit),本质上相当于一个加强的2PC。

在这里插入图片描述

  • 预写阶段
  1. 客户端启动事务,从TSO获取时间戳,记为start_ts,并向Percolator Worker发起Pre-write请求。
  2. 在该事务包含的所有写操作中选取一个作为主(primary)操作,其余的作为次(secondary)操作。主操作将作为整个事务的互斥点,标记事务的状态。
  3. 先预写主操作,成功后再预写次操作。在预写过程中,对每一个写操作都要执行检查:
  • 检查写入的行对应的write列版本号是否晚于start_ts,如果是,说明有版本冲突,直接取消整个事务;
  • 检查写入的行对应的lock列是否有锁,如果有,说明其他事务正在写,直接取消整个事务。
  1. 检查通过后,以start_ts作为版本号将数据写入data列,但不更新write列,亦即此时写入的数据仍然不可见。
  2. 对操作行加锁,即更新lock列的锁信息:主操作行的lock直接标为primary,次操作行的lock则标为主操作行的行键和列名。
    注意:处理每一行时,上述步骤3、4、5每次都会在同一个Bigtable单行事务中进行,保证原子性。
  • 提交阶段
  1. 客户端从TSO获取时间戳,记为commit_ts,并向Percolator Worker发起Commit请求。
  2. 检查主操作行对应的lock列所在的primary标记是否存在,如果不存在(可能已经被清理,见后文所述)则失败,取消事务;如果存在则继续。
  3. 以commit_ts作为版本号,将start_ts更新到write列中。也就是说在本阶段完成后,预写阶段写入的数据将会可见。
  4. 对该行解锁,即删除lock列的锁信息。
  5. 若步骤1~4均成功,说明主操作行成功,代表整个事务实际上已经提交。接下来只需异步地提交每个次操作即可,即重复步骤3、4的更新write列和清除lock列操作。

注意:上述步骤2、3、4会在同一个Bigtable单行事务中进行,保证原子性。另外,如果次操作的提交失败,则仍然要回滚事务。

1.5.2 TiKV中事务写操作

在这里插入图片描述
事务提交前,在客户端 buffer 所有的 update/delete 操作。

  • Prewrite阶段
  1. 首先在所有行的写操作中选出一个作为primary,其他的为secondaries。
  2. Prewrite Primary: 对 primaryRow 写入 L 列(上锁),L 列中记录本次事务的开始时间戳。写入 L 列前会检查:
  • 是否已经有别的客户端已经上锁 (Locking)。
  • 是否在本次事务开始时间之后,检查 W 列,是否有更新 [startTs, +Inf) 的写操作已经提交 (Conflict)。
  • 在这两种种情况下会返回事务冲突。否则,就成功上锁。将行的内容写入row中,时间戳设置为startTs。
  1. 将primaryRow的锁上好了以后,进行secondaries的prewrite流程。类似primaryRow的上锁流程,只不过锁的内容为事务开始时间及primaryRow的Lock的信息。检查的事项同 primaryRow 的一致。
  2. 当锁成功写入后,写入row,时间戳设置为startTs

注:以上Prewrite流程任何一步发生错误,都会进行回滚:删除Lock,删除版本为startTs的数据。

  • Commit阶段

当Prewrite完成以后,进入Commit阶段,当前时间戳为commitTs,且commitTs> startTs :

  1. commit primary:写入W列新数据,时间戳为commitTs,内容为startTs,表明数据的最新版本是startTs对应的数据。
  2. 删除L列

如果primary row提交失败的话,全事务回滚,回滚逻辑同prewrite。如果commit primary成功,则可以异步的commit secondaries, 流程和commit primary一致, 失败了也无所谓。

1.5.3 TiKV中事务的读操作

在这里插入图片描述

  1. 检查该行是否有L列,时间戳为[0, startTs],如果有,表示目前有其他事务正占用此行,如果这个锁已经超时则尝试清除,否则等待超时或者其他事务主动解锁。注意此时不能直接返回老版本的数据,否则会发生幻读的问题。
  2. 读取至startTs时该行最新的数据,方法是:读取W列,时间戳为[0, startTs], 获取这一列的值,转化成时间戳t, 然后读取此列于t版本的数据内容。

由于锁是分两级的,primary和seconary,只要primary的行锁去掉,就表示该事务已经成功提交,这样的好处是secondary的commit是可以异步进行的,只是在异步提交进行的过程中 ,如果此时有读请求,可能会需要做一下锁的清理工作。


参考资料:

  1. https://docs.pingcap.com/zh/tidb/stable/tidb-storage
  2. https://www.cnblogs.com/cobbliu/articles/9553271.html
  3. https://www.jianshu.com/p/3302be5542c7
  4. https://blog.youkuaiyun.com/u010454030/article/details/90414063
  5. https://www.cnblogs.com/xybaby/p/10124083.html
  6. https://www.jianshu.com/p/c39e64d6c5da
  7. https://pingcap.com/blog-cn/percolator-and-txn/
  8. https://www.jianshu.com/p/05194f4b29dd
  9. https://en.pingcap.com/blog/how-tikv-reads-and-writes

转载请注明原文地址:https://blog.youkuaiyun.com/solihawk/article/details/118926380
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

【合集】TiDB 源码阅读系列文章+【合集】TiKV 源码阅读系列文章 【合集】TiDB 源码阅读系列文章 以下文章内容以官网博客为准:https://pingcap.com/blog-cn/ (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 (七)基于规则的优化 (八)基于代价的优化 (九)Hash Join (十)Chunk 和执行框架简介 (十一)Index Lookup Join (十二)统计信息(上) (十三)索引... 阅读详情

相关推荐

MySQL TiDB (事务 锁机制 存储引擎 索引优化) 概括

【代码】MySQL TiDB (事务 锁机制 存储引擎 索引优化) 概括。

weixin_51052174的博客 1307

TiDB学习3:TiKV

事务1提交了,事务2未提交,假设此时TSO=120,要读取1和4,会去查看write最近提交信息的TSO版本,查到了就去Default里面找数据,如果此时要修改1和4,则还要查看Lock中的信息,有锁就不能修改,如果此时去读2,也是先查看write提交信息最近的TSO版本,然后去Default里面把数据读出来,修改2的话,则查找了Write的提交信息还要去查看Lock中的锁,此时没有2的锁信息,则可以修改2,这就是MVCC的实现。如果把数据都读到TiDB上,网络开销比较大,cpu负载比较高。

zj88189748的专栏 1659

深入浅出分布式数据库TiDB架构设计

本文详细介绍了 TiDB 的核心组件,尤其是用于 OLTP 的分布式计算引擎 TiDB和分布式存储引擎 TiKV。一方面阐述了 TiDB 是如何将关系型表数据索引数据转换为键值对数据,另一方面,深度剖析了 TiKV 内部的架构设计和原理,尾篇大幅介绍了 TiKV 底层引入的单机键值对数据库 RocksDB 的原理,一定程度让大家知其然也知其所以然。本文抛砖引玉,关于 TiDB 内部的分布式通信、一致性原理、MVCC、GC清理算法、一些巧妙数据结构,仍需大家深入研究方可融会贯通,活学活用。

m0_59236433的博客 1225

TiDB ——TiKV

readIndex:读一定在写之后,读取保证在修改之后,在读之写都应该commited掉,apply。不单单是写提交信息,当用户写入了一行小于255字节,那么会存储在write列中,否则会被存入default列中。TiDB Server收到读取请求,会先去PD查,这个key在哪一个node的哪一个region当中。其他的事务是可以感知到的。发起投票,term+1,谁的term大,谁就会变成leader。里面有没有锁,如果有则先不修改,起到了阻塞的作用。:判断集合中的元素,它说元素不在就是不在,在可能不在。

万伏小太阳 1383

TiDB 数据库调度(PD)揭秘

TiDB PD (Placement Driver) 是 TiDB 分布式数据库系统中的核心组件之一,负责整个集群的元数据管理和调度工作。PD 在 TiDB 架构中扮演着至关重要的角色,确保了数据的正确分布、高可用性、以及资源的有效利用。

我是一名热爱编程和分享知识的技术作者,在金融和教育领域有多年的研发管理经验,感谢您访问我的博客,一定会为您带来不一样的收货! 2358

TiDB分布式关系型数据库简介

本文主要介绍TiDB架构以及使用场景。

翔云 1540

【TiDB系列文章】TiKV Server 介绍

TiKV是TiDB数据库的核心存储引擎,它是一个开源的、分布式、支持事务的Key-Value数据库。TiKV以其高性能、高可用性和水平扩展能力而闻名,是构建TiDB HTAP数据库架构的基础。

weixin_67032322的博客 1762

【TiDB理论知识 03】TiKV-RocksDB 数据持久化(写入)与读取过程

Level 0 比较特殊, Level 0就是 Immutable Memtable的一个复刻,内容都是是相同的,如果Level 0的文件达到 达到四个之后,就会触发compaction,每一层都会切割成一个一个的SST Table,就是咱们说的SST 文件,这里的每个SST 文件都是键值对,是按照Key排序的。写日志(wal),写MemTable后一次写入就算完成了,其余的都是在后台完成。MemTable 同时服务于读和写 ,最新写入的数据在MemTable,即MemTable中的数据永远是最新的。

DBA之路的博客 1904

【TiDB】快速起步

学习 TiDB 由来、发展与演进,理解 TiDB 5.0 数据库的体系架构、技术创新、关键特性、应用案例与适用场景。

weixin_45922876的博客 7327

TiKV 数据存取机制解析

读取数据时,客户端发送读请求到 TiKV 节点,TiKV 节点将请求转发给 Leader 节点进行处理,并将结果返回给客户端。写入数据时,客户端发送写入请求到 TiKV 节点,TiKV 节点将写入操作复制给其他 Follower 节点,确保数据的冗余和容错。整个过程中,TiKV 使用 Raft 一致性算法实现数据的分布和复制,确保数据的一致性和可靠性。如果该 Region 的 Leader 所在的节点不是当前请求所在节点,那么请求将被转发到 Leader 所在的节点上。

FdhApps的博客 301

TI官方PSpice for TI安装避坑指南:从申请Key到解决器件搜索栏空白(附详细步骤)

本文详细介绍了PSpice for TI的安装与配置全流程,包括申请Key、解决器件搜索栏空白等常见问题。通过分步指南和实战避坑技巧,帮助工程师高效完成安装并优化性能,确保电路仿真工具的正常使用。

weixin_29299807的博客 1085

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者: 尚雷5580 原文来源: https://tidb.net/blog/beeb9eaf ...

TiDB 社区干货传送门 2129

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4869

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对

TiDB是开源的分布式数据库,是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品,具备水平扩容或缩容、金融级高可用、实时HTAP、云原生分布式数据库、兼容MySQL5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP、OLAP、HTAP 解决方案。

我是一名热爱编程和分享知识的技术作者,在金融和教育领域有多年的研发管理经验,感谢您访问我的博客,一定会为您带来不一样的收货! 1920

避坑指南:Abaqus网格划分中90%用户会遇到的5个质量陷阱(附解决方案)

本文深入剖析Abaqus网格划分中90%用户会遇到的5个典型质量陷阱,包括单元扭曲、扫掠网格失败、尺寸梯度控制等,并提供工程级解决方案。通过Python脚本和虚拟拓扑等技巧,帮助用户提升网格质量,确保有限元分析结果的可靠性,适用于CAE工程师和仿真分析师。

weixin_29243279的博客 99

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

TiDB介绍及原理

TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。同时兼容 MySQL 协议和生态,迁移便捷,运维成本极低。

qq_36037795的博客 2551

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 802

TiDB排行再升5位;盘点平凯数据库的发明专利(2024上半年公布)

将数据划分成 Region 后,TiKV 将会做两件重要的事情:(1)以 Region 为单位,将数据分散在集群中所有的节点上,并且尽量保证每个节点上服务的 Region 数量差不多。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。

少安事务所 1379

基于Joplin和Joplin Server搭建私有云笔记

我们知道,多端同步功能是笔记工具最重要的功能。只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。Joplin 在同步上做得不错,支持 Dropbox、OneDrive 和 AWS s3(当然国内都没法用),支持 WebDAV 协议,也支持自家的 Joplin Server。 本文介绍如何在自己的服务器上搭建 Joplin Server,并配置好 Joplin Desktop 的同步功能。 前置条件 安装docker 创建 Joplin Server 配置文件 创建配置文件,~/docke

代码时光 1万+

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5609

TiDB分布式数据库技术架构概述

TiDB是一款开源的分布式NewSQL数据库,采用计算存储分离的三层架构:计算层(TiDB Server)、存储层(TiKV/TiFlash)和调度层(PD Server)。其核心技术包括:1)基于Percolator模型的分布式事务处理机制,通过两阶段提交实现ACID;2)TSO时间戳分配机制保证全局事务有序;3)MVCC多版本并发控制实现高效读写隔离;4)HTAP架构整合行式存储(TiKV)和列式存储(TiFlash),支持混合负载处理;5)分布式执行框架(DXF)实现资源统一调度。TiDB通过Raft

言之。 1万+

【控制模块算法】控制理论的进修之路

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、(经典)自动控制理论【本科阶段】二、现代控制理论【本科阶段】三、最优控制理论【硕士阶段】总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对对控制理论的理解做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、(经典)自动控制理论【本科阶段】 一般控制工程、自动化相关的考研专业课就是自动

qq_35635374的博客 1448

TiDB中TiKV优化配置

TiKV是TiDB的核心组件之一,负责存储和处理数据。优化TiKV的配置对于提升整个系统的性能和稳定性至关重要。提高性能:通过优化TiKV的配置,可以提高整个系统的读写性能。例如,通过调整Raft相关的参数,可以提高TiKV在处理分布式事务时的性能。另外,通过调整存储引擎的相关参数,可以提高存储和查询数据的效率。提升稳定性:TiKV的稳定性对于一个分布式数据库系统来说至关重要。通过优化TiKV的配置,可以减少系统的故障和异常情况。

Winter的博客 1067

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

分布式数据库——TiDB的介绍和基本原理

1、TiDB 介绍 1.1 TiDB 介绍 1.1.1 TiDB 是什么? TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景(on-line transaction processing,联机事务处理)还适合 OLAP 场景(On-Line Analytical Processing,联机分析处理)的混合数据库。 1.1.2 TiDB 是基于 MySQL 开

gb4215287的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 数据库系列之MySQL中的SQL Mode介绍
下一篇: 数据库系列之openGauss主备环境部署
solihawk
博客等级 码龄17年 8002粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值