Postgresql的流复制是异步的,异步的缺点是Standby上的数据落后于主库上的数据,如果使用Hot Standby做读写分离,就会存在数据一致性的问题,对于一些一致性高的应用来说是不可接受的。所以PG从9.1之后提供了同步流复制的架构。同步复制要求在数据写入Standby数据后,事务的commit才返回,所以Standby库出现问题时,会导致主库被Hang住。解决这个问题的方法是启动两个standby数据库,这两个Standby数据库只有有一个是正常的,就不会让主库Hang住。所以在实际应用中,同步流复制,总是有一个主库和2个以上的Standby库。
实现同步复制功能主要是在主库上配置参数”synchronous_standby_names",这个参数指定多个Standby的名称,各个名称之间通过逗号分隔,而Standby名称是在Standby连接到主库时,由连接参数“application_name"指定的。要使用同步复制,在Standby数据库中,recovery.conf里的primary_conninfo一定要指定连接参数”application_name"。
1、配置环境:
示例环境 |
|||||
主机名 |
IP地址 |
角色 |
系统版本 |
数据目录 |
pg版本 |
pg-1 |
10.0.2.60 |
主库 |
RedHat6.4 |
/usr/local/postgresql-9.4.4/data |
9.4 |
pg-2 |
10.0.2.61 |
standby |
RedHat6.4 |
/usr/local/postgresql-9.4.4/data |
9.4 |
pg-3 |
10.0.2.62 |
standby |
RedHat6.4 |
/usr/local/postgresql-9.4.4/data |
9.4 |
2、1)在主库上修改pg_hba.conf:
host replication postgre 10.0.2.0/24 md5
2)修改postgresql.conf :
max_wal_senders = 4
wal_level = hot_standby
hot_standby = on