美文网首页
ticdc逻辑组件mounter

ticdc逻辑组件mounter

作者: nchuxyz | 来源:发表于2021-10-13 23:38 被阅读0次

众所周知tidb是将SQL转换为KV键值对存储的,那么对于ticdc而言,它需要将原始的KV键值对(byte数组)反向解码成SQL Event(有sql含义的对象,如DML/DDL)
其中实现DML解码的组件叫mounter(虽然mounter中实现了DDL解码,但不是在mounter协程执行的,实际是由ddl puller执行)。mounter启动时会同时启动若干个(defaultMounterWorkerNum = 32)解码协程,对接收到的KV键值对 并行解码,再通过pipeline传给sink组件。
本文主要介绍mounter解码协程工作的几个核心点。

解码key值

tidb当前版本(4.x~5.x),从TiKV变更数据流接收到的DML的key值设计如下

<tablePrefix><tableId><recordPrefix><recordId>
var (
    tablePrefix  = []byte{'t'}
    recordPrefix = []byte("_r")
    ...
)

在这里只需要从key值里面获取tableIdrecordId
可以通过tableId查询到完整的表结构信息
recordId稍后再说

解码value值

tidb当前版本(4.x~5.x),从TiKV变更数据流接收到的value值设计如下

<CodecVer(1byte)><large(1byte)><非空字段数(2bytes)><空字段数(2bytes)>
<columnId 0><columnId 1>...<columnId n>
<column 0在data段中的偏移量>...<column n在data段中的偏移量>
<data段>

从以上结构中可以很方便地取出各个column的值,并且根据columnId将这些值与表的每个字段一一关联起来,还原出一行数据

关于types.Datum

上一节中解码的字段值会被封装进types.Datum这个对象。特别值得一提的是,这里的Datum取代了go语言的interface{},设计成专门用于数据传输的场景,具有更高的性能和易用性,由此可见tidb设计的精巧。但是很不幸,当前版本的ticdc数据传输pipeline中并未完全采用Datum,仍然是将其转化为interface{}发送到sink组件使用。

特殊情况

有一类表,它只有1个int类型的主键,这种表在写入KV存储时,key做了优化,直接把主键用作recordId(上文所提)
这种表在收到delete事件、并且enableOldValue参数未设置时,value会是空的
所以这种场景下会使用recordId作为主键值输出
tidb5.x版本不存在此情况

相关文章

  • React hooks 学习笔记

    组件类缺点: 大型组件很难拆分和重构,也很难测试。 业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑。 组...

  • 一些话

    为了业务逻辑组件的实现与DAO组件的实现分离,程序应该为每个DAO组件都提供接口,业务逻辑组件面向DAO接口编程,...

  • Hooks

    组件类的几个缺点。 大型组件很难拆分和重构,也很难测试。业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑。...

  • 2 React组件、组件交互、属性校验

    1、React组件: 函数组件:视图组件/木偶组件,只做展示使用无逻辑,var TarList = () => {...

  • 拯救react的hooks:react的问题和hooks的作用

    react组件和react组件逻辑复用 react是一个视图层组件方案,最核心的功能就是绑定视图与数据和逻辑,实现...

  • React高阶组件(HOC)

    高阶组件(Higher-Order Components) 高阶组件(HOC)是 React 中用于重用组件逻辑的...

  • React高阶组件HOC

    高阶组件本质是函数,参数是 组件1 返回组件2,高阶组件是为了复用通用逻辑高阶组件eg:import React,...

  • React中UI组件和容器组件的拆分

    UI组件,也叫傻瓜组件,负责页面的渲染。 容器组件,也叫聪明组件,负责处理逻辑。 拿todolist组件举例,to...

  • React Hook

    零、动机 1、在组件之间复用状态逻辑很难,React 需要为共享状态逻辑提供更好的原生途径 2、复杂组件变...

  • React 高阶组件

    高阶组件(HOC)是React中用于复用组件逻辑的高级技巧。输入是组件,输出新的组件的过程就是高阶组件。巴拉巴拉 ...

网友评论

      本文标题:ticdc逻辑组件mounter

      本文链接:https://www.haomeiwen.com/subject/gzspoltx.html