同步复制
Halo支持同步复制。默认情况下,Halo采用异步复制的方式,如果主库崩溃,则某些已被提交的事务可能还没有被复制到从库,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步从库。这提升了由一次事务提交所提供的标准持久化级别。Halo提供了2种保护级别。当synchronous_commit为on或者remote_apply时,提供2-safe保护级别;当synchronous_commit为remote_write时,提供group-1-safe保护级别。
当使用同步复制时,需要在主库上指定同步复制的备库名称,在postgresql.con中配置synchronous_standby_names ='备库名称',同时备库需要在primary_conninfo 中配置连接参数application_name=备库名称,primary_conninfo = 'application_name=node2 user=replica password=123456 channel_binding=prefer host=node1 port=1921 sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=halo target_session_attrs=any'
配置完成后,重启备库,pg_ctl restart,主库再启动同步复制, pg_ctl restart。
主库查询状态:
halo0root=# select application_name,client_addr,state,sync_state from pg_stat_replication;
application_name | client_addr | state | sync_state
------------------+----------------+-----------+------------
node2 | 192.168.56.109 | streaming | sync
(1 行记录)
在同步复制场景下,一个写事务的每次提交将一直等待,直到收到一个确认表明该提交在主库和从库上都已经被写入到磁盘上的WAL日志中。只读事务和事务回滚不需要等待从库的回复。子事务提交也不需要等待从库的响应,只有最外层的提交才需要等待。