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

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.1新特性之五:同步复制 ( Synchronous replication )  

2011-11-19 16:46:57|  分类: PG高可用性 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


         PostgreSQL9.0 版本开始提供非常酷的流复制技术,即备库可以实时同步主库,如果备库机器性能足够好,
从库延迟时间可以是毫秒级;尽管如此, PostgreSQL9.0 的流复制技术依然是异步的,当主库 crash 时,从库
存在数据丢失的危险,到了 PostgreSQL 9.1 ,可以支持同步复制了,下面仅列出PostgreSQL 9.1 搭建 HOT-Standby
的关键参数,因为大部分步骤和 PostgreSQL9.0 的搭建类似,关于 9.0 版本搭建 HOT-Standby 可以参考之前的
blog:  http://francs3.blog.163.com/blog/static/40576727201108864230/


--环境信息
主节点:            192.168.1.25
备节点:           192.168.1.26
PostgreSQL 版本:  9.1
操作系统:          Red Hat Enterprise Linux Server release 5.5

 

--创建 replicaton role ( On primary)
CREATE ROLE replication_role REPLICATION LOGIN PASSWORD 'pwd_replication'

 备注:9.1 版本以后 replication 角色不再需要是超级用户,只需要新赋予 "REPLICATION" 权限。


--修改 pg_hba.conf ( On primary),增加以下记录
host     replication     replication_role   192.168.1.25/32      md5


--主库备份,并将数据文件 copy 到 standby 节点(略)


--配置 recovery.conf ( On standby )
standby_mode = 'on'  #标记PG为STANDBY SERVER
primary_conninfo = 'host=192.168.1.26 port=1923 user=replication_role  application_name=mydb_standby1'
trigger_file = '/opt/pgdata/pg_root/postgresql.trigger.1923'

  备注: recovery.conf 的参数 primary_conninfo 里面和9.0 版本配置的不一样,这里多了个 application_name
           参数,primary 节点的 synchronous_standby_names 参数会用到从库的 application_name 参数值,接着
            往下看就明白了。


--设置 postgresql.conf ( on primary)
synchronous_standby_names = 'mydb_standby1'

 备注:1 这个参数的值为从库节点 recovery.conf 文件的参数 primary_conninfo 的 application_name 属性值。
 
        2   修改主库的 synchronous_standby_names 参数,表示主库开启同步复制功能,这意味着当主库上发生数据
             变化时,主库会先等侍这一变化发送到从库并提交,之后主库才显示已提交,这样即使主节点 crash , 也
             能保证数据不会丢失。
        
       3    这个参数可以配置多个 standby 节点,参数列表中排最最前面的优先级最高,排第一的为 stadnby 同步节点,
             当排第一的 standby 节点 crash 时,排第二的 standby 节点可以顶上去,所以指定大于1的 standby 节点
             提高了系统的高可用性。
        
--上面参数修改后,可以看到日志 ( on primary )
2011-11-19 15:54:48.742 CST,"replication_role","",19250,"192.168.1.25:50092",4ec76003.4b32,3,"streaming 1/1801B114",2011-11-19 15:51:31 CST,1/0,0,LOG,00000,"standby ""mydb_standby1"" is now the synchronous standby with priority 1",,,,,,,,,"mydb_standby1"

   备注:如果主库参数 synchronous_standby_names 设置的值找不到对应的从库信息,那么当在主库上提交 SQL时,
             SQL 会一直处于等待状态,因为它找不到同步 standby 节点 ,这所以这个参数需要小心配置。


--新增 pg_stat_replication 视图
mydb=# \d  pg_stat_replication
          View "pg_catalog.pg_stat_replication"
      Column      |           Type           | Modifiers
------------------+--------------------------+-----------
 procpid          | integer                  |
 usesysid         | oid                      |
 usename          | name                     |
 application_name | text                     |
 client_addr      | inet                     |
 client_hostname  | text                     |
 client_port      | integer                  |
 backend_start    | timestamp with time zone |
 state            | text                     |
 sent_location    | text                     |
 write_location   | text                     |
 flush_location   | text                     |
 replay_location  | text                     |
 sync_priority    | integer                  |
 sync_state       | text                     |


mydb=> \c mydb postgres
You are now connected to database "mydb" as user "postgres".
mydb=# select * from  pg_stat_replication ;
 procpid | usesysid |     usename      | application_name | client_addr  | client_hostname | client_port |         backend_start   
     |   state   | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state
---------+----------+------------------+------------------+--------------+-----------------+-------------+--------------------------
-----+-----------+---------------+----------------+----------------+-----------------+---------------+------------
   19250 |    16403 | replication_role | mydb_standby1    | 192.168.1.25 |                 |       50092 | 2011-11-19 15:51:31.54513
7+08 | streaming | 1/1801B304    | 1/1801B304     | 1/1801B304     | 1/1801B304      |             1 | sync
(1 row)


mydb=# \c mydb mydb
You are now connected to database "mydb" as user "mydb".
mydb=> select * from  pg_stat_replication ;
 procpid | usesysid |     usename      | application_name | client_addr | client_hostname | client_port | backend_start | state | se
nt_location | write_location | flush_location | replay_location | sync_priority | sync_state
---------+----------+------------------+------------------+-------------+-----------------+-------------+---------------+-------+---
------------+----------------+----------------+-----------------+---------------+------------
   19250 |    16403 | replication_role | mydb_standby1    |             |                 |             |               |       |  
            |                |                |                 |               |
(1 row)

  备注:9.1 新增视图 pg_stat_replication 记录主节点上所有 wal 发送进程信息, 使用超级用户时,可以看到这个
              视图的详细的信息,而普通用户看到的信息更少,这应该是 PostgreSQL 基于安全性的考虑。
       
       
--开启同步模式的风险
       若开启同步模式,第一个standby 节点的状态直接影响到主库,若第一个 standby 节点 crash ,而又没有其它
standby 节点顶上,那么主库上的所有操作将会被 HANG 住,直到从点恢复;主库才恢复正常,如果是很重要的业务,
建议至少配置两个 standby 节点,提高高可用性。    
        
--后续( 性能测试 )
       理论上开启了同步功能会对主库的性能有所影响,今天没有详细地测试。       

 

--参考资料
http://francs3.blog.163.com/blog/static/40576727201108864230/
http://www.postgresql.org/docs/9.1/static/runtime-config-replication.html#RUNTIME-CONFIG-REPLICATION-MASTER
http://www.postgresql.org/docs/9.1/static/warm-standby.html#SYNCHRONOUS-REPLICATION    

  评论这张
 
阅读(31073)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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