暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 逻辑复制原理浅析2-同步和异步




逻辑复制插槽使用

针对每一个订阅,都会有一个逻辑复制插槽。逻辑复制插槽主要作用是用插件来进行逻辑解码,记录解码的位置。

当你创建订阅的时候,会自动在主库上执行创建逻辑复制插槽。

pg_create_logical_replication_slot ( name, 'pgoutput' )

复制

pgoutput
是逻辑复制解码默认插件。它对wal进行解码,并创建逻辑复制消息。

接下来我们新建一个逻辑插槽,然后再新创建一个发布,由于当前没人订阅,我们可以通过pg_logical_slot_get_binary_changes
函数查询出初始化需要传输的信息(也就是两条记录)。

hr=# select pg_create_logical_replication_slot('test_slot', 'pgoutput');
 pg_create_logical_replication_slot 
------------------------------------
 (test_slot,0/1DC2E18)
(1 row)

hr=# CREATE PUBLICATION my_publication FOR TABLE jobs;       
CREATE PUBLICATION
hr=# SELECT * FROM pg_logical_slot_get_binary_changes('test_slot', NULL, NULL, 'proto_version', '1', 'publication_names', 'my_publication');
    lsn    | xid  |                          data                          
-----------+------+--------------------------------------------------------
 0/1DC2E38 | 1078 | \x420000000001dc904800026140013146c900000436
 0/1DC90E0 | 1078 | \x43000000000001dc90480000000001dc90e000026140013146c9
(2 rows)

复制

异步复制

如图所示:是一个异步复制的情况。
1.客户端发起commit提交事务。
2.后台进程会通知写wal日志。
3.后台进程发送sigusr1信号告知wal sender进程,订阅信息已更新。
4.客户端得到提示,事务已提交。
5.wal sneder进程读取wal日志文件,并通过pgoutput进行解码。
6.将解码后的信息传送给订阅端。

同步复制

如图所示:是一个同步复制的情况。
1.客户端发起commit提交事务。
2.后台进程会通知写wal日志。
3.后台进程发送sigusr1信号告知wal sender进程,订阅信息已更新。
4.wal sneder进程读取wal日志文件,并通过pgoutput进行解码。
5.将解码后的信息传送给订阅端。
6.wal sender进程通知后台进程,消息已经传递。
7.客户端得到提示,事务已提交。

后记

未来待续......


励志成为PostgreSQL大神

长按关注吧




文章转载自励志成为PostgreSQL大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论