您的位置:首页 > 数据库

AntDB中max_replication_slots参数使用详解

2018-03-19 14:01 393 查看
     开启replication slots,从节点会自动将wal情况发送给primary。当从节点掉线时,主节点会保留wal,防止wal被覆盖。下面将此参数设置前后的现象做对比:测试一:不设置max_replication_slots参数,制造从节点xlog落后的情况;1、同步模式下,不存在从节点落后的问题。异步模式下,才有可能出现。因此,设置在Manager中将从节点为async。


2、设置xlog相关参数设置:        PostgreSQL 9.5 废弃了checkpoint_segments 参数, 并引入max_wal_size 和 min_wal_size 参数, 通过max_wal_size和checkpoint_completion_target 参数来控制产生多少个XLOG后触发检查点, 通过min_wal_size和max_wal_size参数来控制哪些XLOG可以循环使用,这里使用默认值。wal_keep_segments:pg_xlog文件夹下,保留的xlog文件的最小数量,这里设置wal_keep_segments的大小是2。wal_segment_size:每个xlog文件大小在编译的时候由参数--with-wal-blocksize=64确定,本例中设置的是64M,默认是16M。在Manager上查看wal_segment_size大小,是64M。


3、参数设置完成,就可以开始测试啦。测试一,制造xlog文件落后场景:1、停止slave节点,由于是异步节点,所以不影响集群使用。2、执行以下语句,向表中插入大量数据,可以反复执行,然后执行checkpoint。create table tt(c1 int, c2 int, c3 text);copy tt from '/home/shan2/big_int_ranint_text_20million.sql' with delimiter as ',';然后查看datanode master和slave的xlog文件如下:datanode master:


datanode slave:


由此可以看出,备节点已经落后主节点很多,且同步需要的文件已经被覆盖。此时启动将slave节点的状态由异步改为同步,报错“流复制状态不正常”。


利用max_replication_slots参数避免这种情况的发生。测试二:重新初始化集群,使集群状态恢复正常,然后开始以下步骤。1、由于主节点只有一个备节点,所以将max_replication_slots设置为1.set datanode master all(max_replication_slots = 1);


2、在master节点上创建slot,执行下面的语句。有多少个datanode,就在相应的master节点上分别创建slot:SELECT * FROM pg_create_physical_replication_slot('dm1_slot');


3、在slave的recovery.conf中配置primary_slot_name,名字与刚才在主节点上设置的一样。primary_slot_name = 'dm1_slot'4、重启节点:查询slot状态:SELECT * FROM pg_replication_slots;active为true表示可用


replication_slots的状态是active,下面来验证replication_slots的作用:1、停止slave节点,模拟从节点故障,由于是异步节点,所以不影响集群使用。2、执行以下语句,向表中插入大量数据,可以反复执行,然后执行checkpoint。create table tt(c1 int, c2 int, c3 text);copy tt from '/home/shan2/big_int_ranint_text_20million.sql' with delimiter as ',';3、查看datanode master和slave的xlog文件,master上xlog会一直保持增长,保证slave节点同步时需要的xlog不会被覆盖:

查看xlog文件数量已经达到八十多个。


查看slave节点上xlog文件:


由此可知,slave节点同步需要的xlog文件在master节点上一直保留着。4、启动slave节点,然后修改异步为同步,如果失败,等过一会儿再试一次,因为slave节点正在追赶master节点。


postgres=# select * from pg_stat_replication;pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin| state | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state-----+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-----------------+---------------+------------679 | 10 | shan2 | ds0 | 10.1.226.202 | | 44146 | 2018-03-16 16:32:52.140363+08 || streaming | 1/80F54BE0 | 1/80F54BE0 | 1/80F54BE0 | 1/80F54BE0 | 1 | sync(1 row)        通过以上测试一和测试二的对比可知,replication_slots参数的使用可以有效防止master节点上需要同步的xlog文件被覆盖。但是应该注意,如果slave节点一直故障,会导致xlog文件一直暴涨导致磁盘不够用,在使用中应该注意。最后,如果不想使用replication_slot,可以用如下方法删除slot。select pg_drop_replication_slot('dm0_slot');postgres=# select pg_drop_replication_slot('dm0_slot');ERROR: replication slot "dm0_slot" is active for PID 679活跃状态的slot不能删除,需要删除recovery.conf文件中的primary_slotname 设置后,重启。再删除。
FYI:AntDB交流群:496464280源码地址:http://github.com/ADBSQL 欢迎广大postgresql爱好者使用和交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息