1、元数据管理
每个DataBase/Table的相关元数据,即其定义以及各项属性都被持久化存储在TiKV中,每个Database/Table都被分配了一个唯一的ID,这个ID作为唯一标识,并且在编码为Key-Value时,这个ID都会被编码到Key中,再加上m_前缀,这样可以构造出一个key,value中存储的是序列化后的元数据信息。
{m_id:序列化的元数据信息}
除此之外,还有一个专门的Key-Value存储当前的Schema信息的版本。TiDB的后台线程不断检查TiKV上面存储的Schema版本是否发生变化,并且保证在一定时间能够获取版本的变化。
2、SQL on KV架构
TiDB Server这一层的节点都是无状态的节点,本身不存储数据,节点之前完全对等。
TiDB Server这一层最重要的的工作是处理用户请求,执行SQL运算逻辑。
3、SQL单机运算
(1)运算逻辑:将SQL查询映射为KV的查询,再通过KV接口获取对应的数据,最后执行各种运算。
(2)示例:
select count(*) form user where name = "TiDB"
- 查询流程:
①构造Key Range:一个表中所有的RowID都在[0,MaxInt64)这个范围内,那么我们用0和MaxInt64根据Row的Key编码规则,就能构造出一个[StartKey,EndKey)的左闭区右开区间。
②扫描Key Range:根据上面构造出的Key Range,读取TiKV中的数据。
③过滤数据:对于读到的每一行数据,计算name="TiDB"这个表达式,如果为真则向上返回这一行,否则丢弃这一行数据。
④计算Count:对符合要求的每一行,累计到Count值上面。
4、SQL分布式运算
- 分布式计算特性:
①将计算尽量靠经存储节点,以避免大量的RPC调用;
②将Filter也下推到存储节点进行计算,只需要返回有用的行,避免无意义的网络传输;
③将聚合函数、GroupBy也下推到存储节点进行预聚合,每个节点只需要返回一个Count值即可,再由tidb-server将Count值sum起来。