注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL 9.4: Replication slots  

2014-05-17 10:17:13|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      "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 被主库覆盖了,而出现以下错误

       ERROR:  requested WAL segment 00000001000000010000002D has already been removed

         关于这个错误,我在之前的blog 有介绍: 详见:  http://francs3.blog.163.com/blog/static/4057672720136225542598/ ;    为了防止这种情况, 通常的做法是设置较大的 wal_keep_segments , 从而使主库保留较大的 wal 日志文件, 当然,也可以开启归档, 这都是可以操作的, 前提是需要将监控做好, 不要因为 pg_xlog 撑暴硬盘了.  
         
        设置 Replication slots 后, 那么主库随时知道从库应用 wal 的情况 , 哪怕从库掉线,主库依然保留 WAL,  当然这种机制也有缺点,  如果从库掉线很久, 那么主库的 pg_xlog 会一直保留以至于撑暴硬盘, 这时监控需要做到位. 

        另一方面 Replication slots 的设置也是用来支持 logical replication, 本文不做介绍.

       下面简单演示 Replication slots 的使用, 流复制搭建略.
     
         
三 replication slots 的使用
--3.1 主库配置

max_replication_slots = 1
wal_level = hot_standby

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

--3.2 重启主库

[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

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


--3.4 从库配置 recovery.conf 

primary_slotname = 'slot1'

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

--3.5 主库上验证

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

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

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

--3.7 再次删除主库 slot

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 处于不活动状态,再次删除成功.
 
四 附 pg_replication_slots
NameTypeReferencesDescription
slot_namename A unique, cluster-wide identifier for the replication slot
pluginname The basename of the shared object containing the output plugin this logical slot is using, or null for physical slots.
slot_typetext The slot type - physical or logical
datoidoidpg_database.oidThe oid of the database this slot is associated with, or null. Only logical slots have an associated database.
databasetextpg_database.datnameThe name of the database this slot is associated with, or null. Only logical slots have an associated database.
activeboolean True if this slot is currently actively being used
xminxid The oldest transaction that this slot needs the database to retain. VACUUM cannot remove tuples deleted by any later transaction.
catalog_xminxid The oldest transaction affecting the system catalogs that this slot needs the database to retain. VACUUM cannot remove catalog tuples deleted by any later transaction.
restart_lsnpg_lsn The address (LSN) of oldest WAL which still might be required by the consumer of this slot and thus won't be automatically removed during checkpoints.

五 参考
  评论这张
 
阅读(2495)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016