PostgreSQL同步复制

同步与异步区别

PostgreSQL流复制默认是异步的。如果主服务器崩溃,那么某些已被提交的事务可能还没有被复制到从服务器,会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。

同步复制能够保证一个事务的所有修改都能被传送到同步的从服务器。提高了事务提交标准的持久化级别,这种保护级别被称为2-safe复制。

同步复制时,写事务的每次提交将一直等待,直到该提交在主服务器和从服务器上都已被写入到磁盘上的预写日志中。数据会被丢失的唯一可能性是主服务器和后备服务器在同一时间都崩溃

一旦流复制已经被配置,配置同步复制就只需要一个额外的配置步骤,将synchronous_standby_names设置为一个非空值。 synchronous_commit也必须被设置为on,但由于这是默认值,通常不需要改变。同步模式比异步模式增加了响应时间,用性能换取了安全

设置application_name

更新备库配置文件 recovery.conf 中的 primary_conninfo 参数,默认值为 walreceiver ,需要指定该实例的 application_name

更新前

1
primary_conninfo = 'host=192.168.1.2 port=5432 user=repuser password=repuser'

主库查询复制状态为

1
2
3
4
5
select application_name, client_addr, sync_state from pg_stat_replication;
application_name | client_addr | sync_state
------------------+---------------+------------
walreceiver | 192.168.1.3 | async
(1 row)

更新后

1
primary_conninfo = 'host=192.168.1.2 port=5432 user=repuser password=repuser application_name=standby003'

重启从库服务,主库查询复制状态为

1
2
3
4
5
select application_name, client_addr, sync_state from pg_stat_replication;
application_name | client_addr | sync_state
------------------+---------------+------------
standby003 | 192.168.1.3 | async
(1 row)

根据 application_name 参数,可以看出实例名更改已经生效为 standby003

设置synchronous_standby_names

更新主服务器的postgresql.conf文件

1
synchronous_standby_names = 'standby003'

重启主库服务,主库查询复制状态为

1
2
3
4
5
select application_name, client_addr, sync_state from pg_stat_replication;
application_name | client_addr | sync_state
------------------+---------------+------------
standby003 | 192.168.1.3 | sync
(1 row)

根据sync_state参数,可以看出复制模式是同步状态。

synchronous_standby_names

同步复制支持一个或多个同步从服务器,提交的事务会一直等待,直到所有同步从服务器都确认收到了数据为止。该参数支持三种配置方式。

1
[FIRST] num_sync ( standby_name [, ...] )

关键字FIRST加上num_sync,指定基于优先级的同步复制。 例如,FIRST 3 (s1, s2, s3, s4) 名称出现在列表前面3个的从服务器被赋予更高的优先级,并将被视为同步复制。在列表后面出现的其它从服务器为潜在的同步从服务器。如果当前的某些同步从服务器断开连接,列表后面的从服务器,优先级将被提高,从而转变为同步从服务器,其中关键字FIRST是可选的。

1
ANY num_sync ( standby_name [, ...] )

关键字ANY加上num_sync,指定基于数量的同步复制,例如,ANY 3 (s1, s2, s3, s4) 每个提交至少被s1s2s3s4中的任意三个从服务器同步复制。

1
standby_name [, ...]

与第一个使用FIRSTnum_sync等于1的语法相同。例如,FIRST 1 (s1, s2)s1, s2具有相同的含义:选择s1s2作为同步服务器。特殊项*匹配任何备用服务器名称。

----------------本文结束 感谢阅读----------------