【是否原创】是
【首发渠道】TiDB 社区
【正文】
首先来看下TiKV的架构和作用
五大作用:
1、数据持久化
2、分布式一致性
3、MVCC
4、分布式事务
5、Coprocessor
首先看下RocksDB
一、RocksDB的介绍
二、RocksDB的写入流程(一)
工作原理:数据先写入WAL日志中,再写入内存(防止掉电丢失,通过日志恢复),当memtable写入磁盘后WAL日志就可以覆盖了,immutable Memtable有一个就写一个到磁盘。
注:当数据写入到内存的write_buffer_size的大小时,数据从MemTable转存到immutable MemTable(中间过渡层)中,然后再写入flush(目的是防止写阻塞)。
特殊情况:如果Mem Table写入过快,导致immutable MemTable大于5个时,这时触发write stull(流控),并限制写入速度,通过优化存储或者调整mmutable MemTable 参数值解决。
三、RocksDB的写入流程(二)
工作原理:memtable 写入level0写满4个后,向level 1的第一个压缩,当level 1达到256M时,继续在向下一层合并。
四、RocksDB的查询
1、优先到内存中查找数据
2、其次是到磁盘中查找数据
五、RocksDB–Column fa’mily(CF-列簇)
RockDB的分片技术
注:列簇技术提供数据分片,将一张表的数据打散再两个或者多个分片中,需要指定cf(列簇片),如果不指定则使用default。每个列簇有自己的memtable,有自己的ssd,但共享一份wal日志。
六、分布式事务
这里由CF引出分布式事务
一个事务修改3个column family
1是Default(保存修改数据,包括开始时间戳,时间戳由PD分配)
2是Lock(保存写锁信息/主键等业务信息/)(只给第一行数据加一把主锁,其他数据行依附在这个主锁上)
3是Write(保存提交信息,包括结束时间戳,开始时间戳,时间戳由PD分配)(删除锁信息时使用D加业务信息实现,表示已删除锁信息)。
场景举例:
一个会话想要读写另一个会话,顺序是先去Write CF中查找键值和时间戳的信息,如果能找到则去Default CF 和Lock CF中去验证,如果Write CF中没有,则代表该信息刚刚上锁。
场景举例:
分布式事务在TIDB中的实现,如果,除主锁外的其他事务数据在lock或write中丢失,重启后这些事务会根据主锁信息进行判断,如果主锁未丢失,则其他数据行将在其他TIKV节点中恢复出来,如果主锁信息丢失,则放弃。
七、MVCC
这里由CF引出MVCC的概念
注:早期tidb版本只有乐观事务/乐观锁