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

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
2
3
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)

1
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 )

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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 节点,提高高可用性。

后续( 性能测试 )

理论上开启了同步功能会对主库的性能有所影响,今天没有详细地测试。

参考资料

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

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

相关推荐

发表回复

登录后才能评论