本来想睡觉,最近很累,但看完某篇文章后,实在是经不起诱惑,起来继续,Change Data Capture, 其实这东西很多数据库都有这个功能,SQL SERVER 本身就有 CDC 的功能。PostgreSQL 的 CDC ,不能光看,还的去实践。
首先 POSTGRESQL 本身的复制方式有流式复制和逻辑复制两种,今天要说的就是逻辑复制中的CDC功能。而实施CDC POSTGRESQL 要具备两个功能,1 获取数库的变更日志(WAL) 和 获取变更日志前的数据一致性快照,最后要保存消费者的偏移量。而提到逻辑复制,是从PG10开始的新功能。
1 先通过一个实践来看看什么叫PG的 CDC (以忽略部分数据库基础设置)
首先我们先要创建一个逻辑复制槽,并且使用系统给定的一个test_decoding的解码插件。
创建完复制槽后,我们开始一些相关的数据库操作,从下图可以看出想的DDL 操作并没有解析,仅仅是记录了begin commit
我们来在做做 DML操作,明显相关的记录可以被解码并且可以看出数据库刚才在操作了什么。
当然具体的使用我们还需要使用 pg_recvlogical 来进行数据的捕捉和更多的应用,如果直接将这些输出output 到动态的文件中,那一个数据库的CDC的记录就有了。以后在发现数据库哪个表里面的记录不对,就可用这样的方法早做日志进行记录。
同时我们也可以更换逻辑复制槽中的解码工具,我们看一下,在PG中输入的数据,经过逻辑复制槽后,直接解码为为 JSON 的数据
当然如果我们使用了其他的解析插件的情况下,还可以将语句直接翻译过来,如果保留这些语句,可以自己做一个类似于UNDO 的东西,将已经执行的语句,进行回滚,从中也更加理解了 data pipleline 中为什么对传统数据库要设置主键,这样可能方便捕获的数据进行一个更新或者判断插入或更新等等的操作。
通过上图,其实我们就可以建立一个自己简易的CDC 系统,通过记录如果表的设计上在完整一些,CDC 的一个日志系统将会为POSTGRESQL 数据库的数据任意时间点的数据 UNDO ,作为一个强有力的支持。
从中就更能理解开源的数据库在使用中的灵活度和相关的乐趣。