TiKV列蔟问题提问

你好,请问一下:
1、 302 TiDB 高级系统管理 :Part 1:TiKV - 持久化 课程中,老师说一张table对应一个列蔟,那么region呢?一台TiKV有一张表分布了3个region,这3个region的数据都放在一个列蔟里吗?如果是放在一起怎么排序呢?

2、事务实现里的default、lock、write是对应三个列蔟CF,那么是不是可以理解一张表就要有三个CF,两张表就要有六个CF ?

1、table和CF没有对应关系
2、default、lock、write这3个CF对应的是Percolator事务模型中的data、lock和write列,具体可以去看一下Percolator的论文

table和CF没有关系的

1、region是KV Map中通过range方案划分出来的一个左闭右开区间,和SQL中的table没有什么关系。默认3副本的region数据持久化在三个KV节点的RocksDB中。
2、table是逻辑上的概念,所有的表数据都通过Key-Value的格式存储在RocksDB中。所有逻辑概念上的table都通过KV节点的2个RocksDB实例实现分布式ACID事务。一个KV节点上对应了4个CF,raft log db(Default CF),kvdb(default、lock、write)。
个人的理解,供参考。

一个KV节点,不同table的数据在kvdb(default、lock、write)怎么区分呢?按你的意思是都放在memtable、L0、L1这些一起了?

个人理解,单个Column Family包含一张或者多张表的kv数据,MemTable 、BlockCache等等,多个CF共享WAL,KV的话按KEY排序,写入的时候KV对应有个LSN号的会+1

前半句我和你理解是一样的,写入可以指定CF,这样就可以区分CF了。
后半句还是我的疑问,
1、MemTable、L0、L1… 这些,如果多张表都写入,那里面大概是不是这么存储的:t1_r100、t1_r101、t1_r102、t2_r100、t2_r200? (按key排序)
2、如果1成立,那么为什么不按表分开呢?不同的表不同的MemTable、L0、L1,因为都放在一起查找效率没有分开存储来的快

表有数量大小区别,按表不会是最佳

一个TiKV实例可以存在多套相同的内存文件和磁盘文件,我们称之为多套Column Families。
一套Column Familes对应一张表,或者几张表,一类键值对。
这也就实现了数据分片技术
此时写数据:
write({cf1,id,(name,age)})
write({cf2,id,(addr,tel)})
如果不指定列簇:write({default,id,(xxx,xxx))
WAL日志未作区分,被列簇共享。

老师,如果不指定列簇,那么单个KV节点多张表的region都放在一起,查询不是效率慢些吗?

你好!两个问题一起回答!
“Part 1:TiKV - 持久化 课程中,老师说一张 table 对应一个列蔟” 课程中的这句话,我指的是 rocksDB 这个单机数据库,并不是 TiDB 数据库,所以请不要混淆。具体到 TiDB 数据库我们可以这样理解:

(1). 我将某张表(行列的那种关系型的),先变成 key - value 形式的键值对组成的数据对象形式,然后存入 TiKV 中,当存满 96MB 时候就形成了一个 region。

(2).所有的表存储 TiKV 中都是(1)中的过程,也就是说这些表在 TiKV 中就变成了一个一个的 region(由 key - value 组成的集合),这里要注意,所有表在这里实现了统一,也就是统一为 key - value 了。

(3)接下来,我们进入 TiKV,TiKV 里面实际是将这些 region 往自己内部的 rocksDB 中存的,这个 rocksDB 叫 rocksDB KV,里面有 3 个 column families,分别是 default cf,lock cf 和 write cf。这 3 个 column families 和表就没有什么关系了,其中,咱们说的新进来的一个一个的 region(由 key - value 组成的集合)指定放到 default cf 的,如果 key-value 的值都小于 255 字节,也会放到 write cf 的。另外,数据库运行中的锁信息也是以 key-value 的形式存在 lock cf 的,数据库运行中的事务提交信息(提交时间等)也是以 key-value 的形式存在 write cf 的。

(4)所以,总结下来,TiKV 中的 rocksDB KV 中的 3 个 column families 其实和哪张表没有关系!对应数据的性质,可以简单理解为:<1>所表的数据都会统一转化为 key - value,形成 region,存在 default cf 中;<2> 所有锁信息,会以 key - value 形式存在 lock cf 中;<3>所有提交信息,会以 key - value 形式存在 write cf 中。

4 个赞

谢谢董老师详细的回答

:+1::+1::+1:学习了

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。