PostgreSQL 9.4: Replication Slots

“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
2
max_replication_slots =  1
wal_level = hot_standby

备注:其它参数未列出,设置后重启生效.

3.2 重启主库

1
2
3
4
[pg94@db1 pg_root]$ pg_ctl restart -D $PGDATA -m fast
waiting for server to shut down..... done
server stopped
server starting

3.3 在主库上创建 slot

1
2
3
4
5
postgres=# select * from pg_create_physical_replication_slot('slot1');
slotname | xlog_position
----------+---------------
slot1 |
(1 row)

3.4 从库配置 recovery.conf

1
primary_slotname =  'slot1'

备注: 从库的 recovery.conf 文件设置 primary_slotname 参数, 指向主库创建的 ‘slot1’.

3.5 主库上验证

1
2
3
4
5
6
7
8
9
10
11
postgres=# select * from pg_replication_slots ;
-[ RECORD 1 ]+----------
slot_name | slot1
plugin |
slot_type | physical
datoid |
database |
active | t
xmin |
catalog_xmin |
restart_lsn | 0/E0009E8

备注: active 表示是否使用, 关于这个视图的含义,参考本文后面的附录, 如果想关闭 replication_slot ,那么建议删掉刚创建的 slots.

3.6 删除 slot

1
2
postgres=# select pg_drop_replication_slot('slot1');
ERROR: replication slot "slot1" is already active

备注: 活跃状态的 slot 不可以删除,这时需要取消从库的 primary_slotname = ‘slot1’ 设置, 之后重启从库.

3.7 再次删除主库 slot

1
2
3
4
5
6
7
8
9
10
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn
-----------+--------+-----------+--------+----------+--------+------+--------------+-------------
slot1 | | physical | | | f | | | 0/E000AB0
(1 row)

postgres=# select pg_drop_replication_slot('slot1');
pg_drop_replication_slot
--------------------------
(1 row)

备注: 之后发现主库的 slot1 处于不活动状态,再次删除成功.

参考

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/238056.html

(0)
上一篇 2022年1月30日
下一篇 2022年1月30日

相关推荐

发表回复

登录后才能评论