1.逻辑复制槽创建与使用
首先设置postgresql.conf,max_wal_sender和max_replication_slots可以适当调整。
wal_level = logical
max_wal_senders = 10
max_replication_slots = 10
在重启后执行SELECT pg_create_logical_replication_slot( 'slot_name', 'pgoutput');
创建逻辑复制槽。
主库执行CREATE PUBLICATION publication FOR TABLE table_name;
创建PUBLICATION。
备库执行CREATE SUBSCRIPTION sub CONNECTION 'host=172.168.18.50 port=5432 user=repl dbname=testdb' PUBLICATION publication --连接信息根据实际情况填写
至此完成复制槽的创建和订阅
2.在failover发生时,迁移逻辑复制槽到备库
可以观察到,当数据库运行在只读模式下时(这是备库的运行模式),复制槽并不会丢失
那么,1.设置hot_standby_feedback=on
防止主库自动清理提前删除备库仍在使用的行版本2.调用pg_read_binary_file()
将备库中缺少的slot复制过去,保证在切换后同名的逻辑复制槽仍然存在3.定期调用pg_replication_slot_advance()
来更新备库复制槽的LSN位点。
Patroni2.1.0已经自动化了这个过程,用户也可以编写脚本来实现上述步骤。