微信又改版了,为了我们能一直相见
你的加星和在看对我们非常重要
点击“长亭安全课堂”——主页右上角——设为星标?
期待与你的每次见面~
0 1 前言基于 PostgreSQL 12.0 的代码实现。初步认识在逻辑复制中所使用的历史系统表快照(Historic Catalog Snapshot)。这部分的代码位于 src/backend/replication/logical/snapbuild.c。PostgreSQL 拥有十分良好的系统使用手册与源代码注释,为了尽可能避免让系列文章成为堆砌注释翻译及其源代码的“源码分析”类文章,一般文档对于关键性细节和重要实现逻辑都有所描述的,本文将不再进行赘述。因此推荐配合 PostgreSQL 源码及其注释一同进行阅读,相信读者能够从源码和系统使用手册中收获颇丰。
0 1 逻辑复制使用数据库的流复制(Stream Replication)进行主从同步相信对于使用 PostgreSQL 的 DBA 或是系统开发者而言并不陌生。而从 9.4 版本开始,PostgreSQL 又正式支持了逻辑复制功能(Logical Replication),关于主从同步的更多不同的解决方案比较的扩展阅读可参阅这篇官方手册(www.postgresql.org/docs/12/different-replication-solutions.html)。我们目前在 HA 下的数据库主从同步便是使用了逻辑复制的方案,可以更为灵活的复制特定的表,自定义分发规则等。
更为复杂的情况下逻辑复制可以自行开发逻辑解码插件,文档中称为 Output Plugin。除了插件的初始化、自定义选项外,主要实现 src/include/replication/output_plugin.h 中定义的 OutputPluginCallbacks。参考这篇官方示例(www.postgresql.org/docs/12/logicaldecoding-example.html),我们可以使用 test_decoding 来进行一些实验,方便地观察逻辑复制的基本操作流程和效果等。一般我们使用 PostgreSQL 标准的解码插件 pgoutput 做同步。
0 2 从一个问题入手起初在我们开始使用 PostgreSQL 提供的逻辑复制功能进行开发时,执行下列 SQL 分别创建复制槽及一个 Publication:
SELECT * FROM pg_create_logical_replication_slot('ha_sync_sub','pgoutput');
CREATE PUBLICATION ha_sync_pub FOR ALL TABLES;
从数据库进行订阅: