PostgreSQL 多个同步复制服务器
admin
2023-03-03 11:02:31
0

PG9.6版本时,只能支持基于优先级的同步备库方式。

PG10及以后版本中,引入了 synchronous_standby_names 这种基于 Quorum的同步复制优选提交的机制。

 


同步复制支持一个或者更多个同步后备服务器,事务将会等待,直到所有同步后备服务器都确认收到了它们的数据为止。事务必须等待其回复的同步后备的数量由synchronous_standby_names指定。这个参数还指定一个后备服务器名称及方法(FIRSTANY)的列表来从列出的后备中选取同步后备。

 

方法FIRST指定一种基于优先的同步复制并且让事务提交等待,直到它们的WAL记录被复制到基于优先级选中的所要求数量的同步后备上为止。在列表中出现较早的后备被给予较高的优先级,并且将被考虑为同步后备。其他在这个列表中位置靠后的后备服务器表示可能的同步后备。如果任何当前的同步后备由于任何原因断开连接,它将立刻被下一个最高优先级的后备所替代。

 

基于优先级的多同步后备的synchronous_standby_names示例1

synchronous_standby_names = 's1, s2'

在这个例子中,s1是同步备库,s2为潜在同步备库,当s1不可用时,s2升级为同步备库

 

基于优先级的多同步后备的synchronous_standby_names示例2

synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'

在这个例子中,如果有四个后备服务器s1s2s3s4在运行,列表前两个后备服务器s1s2将被选中为同步后备。

主库提交事务时,必须要等s1s2都接收并写入WAL日志文件才能返回给客户端成功。

s3是一个潜在的同步后备,当s1s2中的任何一个失效, 它将升级为同步备库。

s4则是一个异步后备因为它的名字不在列表中。

 

基于Quorum数量的同步复制 示例:

synchronous_standby_names的基于规定数量的多同步后备的例子:

synchronous_standby_names = 'ANY 2 (s1, s2, s3)'

在这个例子中,如果有四台后备服务器s1s2s3以及s4正在运行,事务提交将会等待来自s1 s2 s3中至少任意两台后备服务器的回复。

s4是一台异步后备,因为它的名字不在该列表中。

 

后备服务器的同步状态可以使用pg_stat_replication视图查看。

 

当一台后备服务器第一次附加到主服务器时,它将处于一种还没有正确同步的状态。这被描述为追赶模式。一旦后备服务器和主服务器之间的迟滞第一次变成零,我们就来到了实时的流式状态。在后备服务器被创建之后的很长一段时间内可能都是追赶模式。如果后备服务器被关闭,则追赶周期将被增加,增加量由后备服务器被关闭的时间长度决定。只有当后备服务器到达流式状态后,它才能成为一台同步后备。这种状态可以使用pg_stat_replication视图查看。

 


注意:

如果在提交正在等待确认时主服务器重启,那些正在等待的事务将在主数据库恢复时被标记为完全提交。没有办法确认所有后备服务器已经收到了在主服务器崩溃时所有还未处理的 WAL 数据。某些事务可能不会在后备服务器上显示为已提交,即使它们在主服务器上显示为已提交。我们提供的保证是:在 WAL 数据已经被所有后备服务器安全地收到之前,应用将不会收到一个事务成功提交的显式确认。

 

 

实验部分:

一主两备的流复制实验(集群使用patroni搭建,它会自动构建同步复制节点):

postgres=# select pid,usename,application_name,client_addr,state,sync_state,sync_priority from pg_stat_replication ;

  pid  |  usename   | application_name |  client_addr  |   state   | sync_state | sync_priority

-------+------------+------------------+---------------+-----------+------------+---------------

 58691 | replicator | pg_node3         | 192.168.2.189 | streaming | sync       |             1

 58712 | replicator | pg_node2         | 192.168.2.188 | streaming | potential  |             1

(2 rows)

 

说明:

sync       表示同步库

potential  表示潜在同步库

 

patroni 构建的PG流复制集群中,我的配置是已经开启了基于优先级多备库的方式。 因此我们可以任意关闭1standby节点,但是如果我们关闭全部的standby节点后,会造成主节点的修改阻塞。

 


下面是我自建的基于Quorum的同步备库演示贴图(因为我在patroni里面没找到哪里配的支持Quorum。。。暂时也懒得找了):

修改 postgresql.conf 的如下内容:

synchronous_standby_names = 'ANY 2 (pg_node2,pg_node3)'

 

然后重载pg的配置文件:

pg_ctl reload  

 

然后在主库查询配置是否生效:

postgres=# show synchronous_standby_names ;

 synchronous_standby_names

---------------------------

 ANY 2 (pg_node2, pg_node3)

(1 row)

 

这时候,在主库查看到的如下:

postgres=# select pid,usename,application_name,client_addr,state,sync_state,sync_priority from pg_stat_replication ;

  pid  |  usename   | application_name |  client_addr  |   state   | sync_state | sync_priority

-------+------------+------------------+---------------+-----------+------------+---------------

 65373 | replicator | pg_node3         | 192.168.2.189 | streaming | quorum     |             1

 65375 | replicator | pg_node2         | 192.168.2.188 | streaming | quorum     |             1

(2 rows)

 

图上可以看出,2standby节点的sync_state都是 quorum的,并且 sync_priority 优先级都是1 (基于Quorum的同步备库 sync_prioriy的值对备库无影响,可忽略)

 

接着关闭一个同步备库 pg_node2 ,这时候我们去主库插入数据,可看到被阻塞了。


相关内容

热门资讯

农业农村“半年报”发布,这些看... 7月24日召开的国新办发布会上,农业农村部介绍2026年上半年农业农村经济运行情况。夏粮喜获丰收、常...
世界遗产+1!景德镇打卡地图,... 北京时间7月25日,在韩国釜山举行的第48届世界遗产大会上,由我国申报的“景德镇手工瓷业遗存”项目经...
有人呼吁白宫“封杀”中国开源大... 未来一段时间,将有多款中国开源模型发布。Kimi K3定于7月27日正式开源,阿里即将开源2.4万亿...
20名“高考状元”选择学医!此... 2026年香港高考的24名“状元”中,有20人明确表示将留港攻读医科。多年来,香港最顶尖的“学霸们”...
“抢人大战”,风向有变? 各地一场“抢老人”的大战,已然徐徐拉开大幕。最近,有着人口净流出压力的吉林,计划拿出3亿元发展旅居康...
石家庄一家不限量的爱心素食面馆... 7月24日正午时分,记者来到位于石家庄市新华区东明家居西二环店北门旁的“素面”小店,不大的店面里坐满...
中材科技申请风电叶片外补强辅助... 国家知识产权局信息显示,中材科技(伊吾)风电叶片有限公司申请一项名为“风电叶片外补强辅助固化装置”的...
为人工智能治理提供重要公共产品 图为2026世界人工智能大会暨人工智能全球治理高级别会议举办期间,在世博展览馆灵心巧手展位,参观者观...
泽连斯基称俄对乌多地发动大规模... 当地时间25日,乌克兰总统泽连斯基通报称,俄军于当日凌晨对乌克兰多地发动大规模空袭,使用2枚导弹、近...