##介绍
tidb是一种分布式关系型数据库,由pingCap公司开发和维护,它可以更加灵活的拓展,为了解决传统关系型数据库在大规模数据和高并发场下的性能瓶颈而诞生的。下面是它的架构图:
tidb分为tidb Server、pd、tikv三大模块,下面分别介绍一下三个模块。
tidbServer
上图是tidb Server的架构,它的主要功能:
第二层:当一些点查会走kv,需要事物时会需要Transaction处理;而一些范围查询则是Executor、DistSQL进行执行。
第三层:对于另外两个组件对其封装了client,而online ddl则由其他三个组件完成。
当接收到ddl语句时,会通过start job把job放入到job queue中,由当前可执行的tidb Server中的worker从job queue中获取job进行执行,执行后把job放入history queue;只有onwer角色的tidb Server可以执行job,同一时刻只有一个onwer,每个onwer都有一段任期,任期过后会重新选择onwer。而schema load看名字就知道加载schema到自身的缓存中。
第四层:缓存数据;默认使用tidb Server的全部内存,主要用于sql结果,线程缓存,元数据,统计信息等。
除此之外它还负责k-v与关系型数据转化;如下图是一个关系型数据库,它会转换为 tableId + 主键作为key,其他值作为value的形式。
而这种结构在tidb中称为region,region默认为96m,当超过144m时会进行分裂成为2个region,它分布存储在tikv中。
前2个
tidbkv
tikv的整体架构图如下:
- tikv提供了数据持久化,底层采用的是Rocks DB,rocksdb采用的是lsm(日志结构合并树)进行存储的:
它由多个层级组成,每条数据都是连续存储的,对于rocks db压缩模式下,除Level 0层以外不存在写放大情况,每个层中的sst文件都由上一层合并而来,这样可以更大程度的存储更多数据,但对于查询需要对每一层级进行查询,rocks db通过给每个sst增加key的范围信息以及布隆过滤器进而减少io次数。它更适合读大面积存储写多读少的场景。下图是Rocks Db的写入流程:
它也采用了WAL预写日志、内存操作数据的形式;每次写数据都在memTable中进行,当写到write buffer size大小时(默认128M)就转存起来,当写入的过快,默认immutable memtable达到max-write-buffer-size(默认5)个就会流控。而转为immutable memtable会写入到磁盘中,level 0层的sst文件和immutable memtable是相同的,默认为4个,再往上就会一点点的压缩,例如table1和table2同时操作了一个key,那么就可以把该key进行合并,对于level0层总是会选择全部文件进行合并,而其他层会根据策略进行选择,压缩时会对选择的sst进行排序,找到最大值与最小值,同时也找出n+1层对应的sst,同时也会创建一些sst,以上为压缩默认,还存在非压缩模式,会把选择的文件都放入到新建的sst中,以上就为存储的流程。对应的层级sst可以看下图:
对于写入不像mysql中需要找到对应数据再进行修改,但查询就要比mysql麻烦了;首先查询block cache,memtable等缓存,如果存在则直接返回,如果不存在则需要依次查询每个sst,好在每个sst都维护了一个布隆过滤器,同时也是排好顺序的。
而整个库所有的信息都用这一套数据结构,当没有命中磁盘时会导致查询特别慢,所以tidb搞出来列簇的概念,如下图:
它支持多个列簇,每个列簇共享wal文件,但不共享数据文件。对于每个tikv一共有2个rocksdb实例,4个列簇(raft、default、write、lock)。
分布式一致性、mvcc、分布式事务、Coprocessor(协同处理器:算子下推等)。
pd
Pd作为集群的大脑,主要负责:元数据存储、分配全局id和事务id、全局时钟生成以及收集集群信息region的调度、提供label支持高可用、dashborad;它由raft算法保证各pd数据的一致性。
元数据存储:主要存储各个region的信息,例如要查询一个key在哪个region,就需要tikv从pd中读取,当然tidb server会缓存这个数据,当region发生调度时,region会自动指向leader节点。
分配全局id、事务id:见名知意。
信息收集以及region调度:tikv和region会周期性向pd汇报信息,pd根据是否均衡生成(拓扑、缩容、故障恢复、merge region、hot region)生成调度,再根据生成的调度执行调度。
全局时钟生成:如下图所示,由于每个事务开始和结束都需要或者tso,访问量是巨大的,pd提供批量接口同时还会对tso进行缓存。
提供label支持高可用:对各个tikv打上标签,pd会根据策略进行分配region到tikv上,类似于k8s。
热点问题解决
- 热点库(region)
- 在线ddl
- 数据回收gc
- 崩溃恢复