今天正在将大数据技术的微服务迁移案例制作成课件,其中第一步,也是数据源采集来自对PostgreSQL的数据变更捕获(CDC)方式,本来对于采集所需的PG复制机制并不在我的主题范围内,但是的确觉得这是个挺有意思的事情,就索性将PG复制的原理也一并研究了。
其实PG最古老传统的方式是流复制,也叫物理复制,主要是将WAL记录和所映射的堆表数据块用流形式从主库传递给备库,实现块级的一致性复制,这样实时性效率是最高的。
不过流复制有个问题就是操作太底层了!只能保持全库复制,无法针对某张表进行同步,而且也无法实现对外扩展,那么就在PG9.4版本加入了逻辑复制,核心机制变化了:PG内核将WAL记录传入逻辑解码模块转换成高层格式,即易于解析和阅读的tuple结构,通过发布与订阅的架构设计,主库作为发布者将WAL变化通过复制槽传递出去,然后在备库订阅端对源源不断传递来的tuple数据实现insert、delete、update回放,这个逻辑复制的原理就特别类似MySQL的binglog了。
于是乎基于逻辑复制架构,PG内核还设计出了扩展的插件机制,可以通过wal2json插件和pg_recvlogical命令,将变化数据输出到文件,且输出的记录形成了更易阅读的json数据结构,我只要利用外部程序监测这个不断变化的文件就实现了对PG库的数据变更捕获,最后将捕获记录扔到大数据系统中。
总之,一直应用PostgreSQL,但这还是第一次去研究它,它坚如磐石且成熟严谨的特性,一直是我最喜爱的开源系统之一,而且基于BSD license,可以说使用二进制和修改源代码都非常的宽松,而且具有极为精良的品质,为什么国内高喊去IOE,自主可控,却没有多少目光投向PG的商业化呢?貌似一直没有出现一批深耕于PG研究的技术匠人,实现PG数据库在自主化的社区或商业化的有力支撑,是不是有些暴殄天物啦!