PostgreSQL9.0 版本开始提供非常酷的流复制技术,即备库可以实时同步主库,如果备库机器性能足够好,从库延迟时间可以是毫秒级;尽管如此, PostgreSQL9.0 的流复制技术依然是异步的,当主库 crash 时,从库存在数据丢失的危险,到了 PostgreSQL 9.1 ,可以支持同步复制了,下面仅列出PostgreSQL 9.1 搭建 HOT-Standby 的关键参数,因为大部分步骤和 PostgreSQL9.0 的搭建类似,关于 9.0 版本搭建 HOT-Standby 可以参考之前的
blog: PostgreSQL: Setting up streaming log replication (Hot Standby )
环境信息
主节点: 192.168.1.25
备节点: 192.168.1.26
PostgreSQL 版本: 9.1
操作系统: Red Hat Enterprise Linux Server release 5.5
同步复制配置
创建 replicaton role ( On primary)
1 |
CREATE ROLE replication_role REPLICATION LOGIN PASSWORD 'pwd_replication' |
备注:9.1 版本以后 replication 角色不再需要是超级用户,只需要新赋予 “REPLICATION” 权限。
修改 pg_hba.conf ( On primary),增加以下记录
1 |
host replication replication_role 192.168.1.25/32 md5 |
主库备份,并将数据文件 copy 到 standby 节点(略)
配置 recovery.conf ( On standby )
1 |
standby_mode = 'on' #标记PG为STANDBY SERVER |
备注: recovery.conf 的参数 primary_conninfo 里面和9.0 版本配置的不一样,这里多了个 application_name 参数,primary 节点的 synchronous_standby_names 参数会用到从库的 application_name 参数值,接着往下看就明白了。
设置 postgresql.conf ( on primary)
1 |
synchronous_standby_names = 'mydb_standby1' |
- 这个参数的值为从库节点 recovery.conf 文件的参数 primary_conninfo 的 application_name 属性值。
- 修改主库的 synchronous_standby_names 参数,表示主库开启同步复制功能,这意味着当主库上发生数据变化时,主库会先等侍这一变化发送到从库并提交,之后主库才显示已提交,这样即使主节点 crash , 也能保证数据不会丢失。
- 这个参数可以配置多个 standby 节点,参数列表中排最最前面的优先级最高,排第一的为 stadnby 同步节点,当排第一的 standby 节点 crash 时,排第二的 standby 节点可以顶上去,所以指定大于1的 standby 节点提高了系统的高可用性。
上面参数修改后,可以看到日志 ( on primary )
1 |
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 视图
1 |
mydb=# /d pg_stat_replication |
备注:9.1 新增视图 pg_stat_replication 记录主节点上所有 wal 发送进程信息, 使用超级用户时,可以看到这个视图的详细的信息,而普通用户看到的信息更少,这应该是 PostgreSQL 基于安全性的考虑。
开启同步模式的风险
若开启同步模式,第一个standby 节点的状态直接影响到主库,若第一个 standby 节点 crash ,而又没有其它 standby 节点顶上,那么主库上的所有操作将会被 HANG 住,直到从点恢复;主库才恢复正常,如果是很重要的业务,建议至少配置两个 standby 节点,提高高可用性。
后续( 性能测试 )
理论上开启了同步功能会对主库的性能有所影响,今天没有详细地测试。
参考资料
- PostgreSQL: Setting up streaming log replication (Hot Standby )
- 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
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/237809.html