“Replication slots” 是 PostgreSQL 9.4 的主要特性之一, 看了这方面的相关资料,可能理解会比较模糊,先从概念入手.
Replication Slots 概述
replication slots 是 9.4 的主要特性之一, standby 使用 replication slots 后会自动将 WAL 的应用情况发给 Primary, 尽管当 standby 由于某种原因掉线或者连接断开时, 这些信息依然对 Primary 可见;
流复制并不会默认开启 replication slots, 如果需要使用 replication slots 特性, 需手工配置.
Replication Slots 的意义
大家知道在流复制环境中, WAL 日志起着至关重要的作用, 特别是对于比较繁忙的库, WAL 的日志量是非常大的,如果备库由于某种原因掉线, 那么再次启动备库后, 很有可能由于所需的 WAL 被主库覆盖了,而出现以下错误
1 |
ERROR: requested WAL segment 00000001000000010000002D has already been removed |
关于这个错误,我在之前的blog 有介绍: 详见: https://postgres.fun/20130702145542.html 为了防止这种情况, 通常的做法是设置较大的 wal_keep_segments , 从而使主库保留较大的 wal 日志文件, 当然,也可以开启归档, 这都是可以操作的, 前提是需要将监控做好, 不要因为 pg_xlog 撑暴硬盘了.
设置 Replication slots 后, 那么主库随时知道从库应用 wal 的情况 , 哪怕从库掉线,主库依然保留 WAL, 当然这种机制也有缺点, 如果从库掉线很久, 那么主库的 pg_xlog 会一直保留以至于撑暴硬盘, 这时监控需要做到位.
另一方面Replication slots 的设置也是用来支持logical replication, 本文不做介绍.
下面简单演示 Replication slots 的使用, 流复制搭建略.
Replication slots 的使用
3.1 主库配置
1 |
max_replication_slots = 1 |
备注:其它参数未列出,设置后重启生效.
3.2 重启主库
1 |
[pg94@db1 pg_root]$ pg_ctl restart -D $PGDATA -m fast |
3.3 在主库上创建 slot
1 |
postgres=# select * from pg_create_physical_replication_slot('slot1'); |
3.4 从库配置 recovery.conf
1 |
primary_slotname = 'slot1' |
备注: 从库的 recovery.conf 文件设置 primary_slotname 参数, 指向主库创建的 ‘slot1’.
3.5 主库上验证
1 |
postgres= |
备注: active 表示是否使用, 关于这个视图的含义,参考本文后面的附录, 如果想关闭 replication_slot ,那么建议删掉刚创建的 slots.
3.6 删除 slot
1 |
postgres=# select pg_drop_replication_slot('slot1'); |
备注: 活跃状态的 slot 不可以删除,这时需要取消从库的 primary_slotname = ‘slot1’ 设置, 之后重启从库.
3.7 再次删除主库 slot
1 |
postgres=# select * from pg_replication_slots ; |
备注: 之后发现主库的 slot1 处于不活动状态,再次删除成功.
参考
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/238056.html