首页 > 其他分享 >Fabse的同步异步复制转换

Fabse的同步异步复制转换

时间:2024-08-11 15:17:12浏览次数:7  
标签:异步 stat Fabse sync client state 复制 pg 节点

240711-Fabse的同步/异步复制转换

1. 主从搭建

详情请见240710-Fbase一主一从安装文档.md 安装文档。

2. 主从复制方式查看

2.1 判断主从库

执行select * from pg_stat_replication ;在主库上有结果,在备库上无结果;

select * from pg_stat_replication;

执行select * from pg_stat_wal_receiver,在备库上查询有结果,在主库上查询无结果:

select * from pg_stat_wal_receiver;

2.2 检查主从复制方式

(1)查看同步复制配置。

SHOW synchronous_commit;

这个命令将显示当前的 synchronous_commit 设置。如果设置为 on,则表示主节点在提交事务时会等待至少一个同步从节点确认已接收 WAL 记录,这通常是同步复制的一部分。

(2)检查同步从节点设置:
若要确认哪些从节点被配置为同步,执行以下查询:

SHOW synchronous_standby_names;

如果返回结果中包含从节点的名称列表,则说明这些节点被配置为同步从节点。这个设置决定了哪些节点必须确认 WAL 记录的接收,以便主节点可以提交事务。

(3)查看从节点的同步状态:
可以通过查询 pg_stat_replication 视图来查看连接到主节点的从节点的状态,特别是 sync_state 列,它显示每个从节点的同步状态:

SELECT client_addr, state, sync_state FROM pg_stat_replication;

如果 sync_statesync,则表示该从节点是同步复制的;如果为 async,则表示是异步复制的。

3. 异步复制转同步复制

在主库中查看SHOW synchronous_commit;显示为off,并且SELECT client_addr, state, sync_state FROM pg_stat_replication;中显示的sync_stateasync;表示这个从库使用异步复制。

在主库的postgresql.conf配置文件中修改:

synchronous_commit = on
synchronous_standby_names = 'walreceiver'

其中walreceiver取决于从库的名称。可以使用select usename , application_name , client_addr,sync_state from pg_stat_replication;语句在主库中查看。

postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication;
 usename | application_name |   client_addr   | sync_state 
---------+------------------+-----------------+------------
 repuser | walreceiver      | 192.168.198.147 | async
(1 row)

修改完毕之后,使用pg_ctl reload重新加载配置文件。

在主库上再次查看SHOW synchronous_commit;显示为on,并且SELECT client_addr, state, sync_state FROM pg_stat_replication;中显示的sync_statesync

postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication;
 usename | application_name |   client_addr   | sync_state 
---------+------------------+-----------------+------------
 repuser | walreceiver      | 192.168.198.147 | sync
(1 row)


postgres=# select * from pg_stat_replication ;
  pid  | usesysid | usename | application_name |   client_addr   | client_hostname | client_port |     backend_start   | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state |          reply_time           
-------+----------+---------+------------------+-----------------+-----------------+-------------+---
 12646 |    16384 | repuser | walreceiver      | 192.168.198.147 |                 |       63231 | 2024-07-10 14:44:32.305602+08 |    
      748 | streaming | 0/31A10F8 | 0/31A10F8 | 0/31A10F8 | 0/31A10F8  |           |           |            |             1 | sync    
   | 2024-07-10 17:53:23.958976+08
(1 row)

在从库上:

postgres=# select * from pg_stat_wal_receiver;
 pid  |  status   | receive_start_lsn | receive_start_tli | written_lsn | flushed_lsn | received_tli | last_msg_send_time  |last_msg_receipt_time     | latest_end_lsn | latest_end_time   | slot_name |   sender_host   | sender_port |  conninfo                                                                                                                        
------+-----------+-------------------+-------------------+-------------+-------------+--------------
 2855 | streaming | 0/3000000         |                 1 | 0/31A10F8   | 0/31A10F8   |            1 | 2024-07-10 17:54:24.887802+08 |
 2024-07-10 17:53:33.922588+08 | 0/31A10F8      | 2024-07-10 15:05:42.665568+08 |           | 192.168.198.145 |        8432 | user=rep
user password=******** channel_binding=prefer dbname=replication host=192.168.198.145 port=8432 fallback_application_name=walreceiver 
sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=a
ny
(1 row)

4. 同步复制转异步复制

在主库的postgresql.conf配置文件中修改:

synchronous_standby_names = ''

即删除掉从库名称即可。再使用pg_ctl reload重新加载配置。

主库上查看。

postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication;
 usename | application_name |   client_addr   | sync_state 
---------+------------------+-----------------+------------
 repuser | walreceiver      | 192.168.198.147 | async
(1 row)

5. 流复制参数介绍

  • synchronous_commit (enum)

    • 描述:指定数据库服务器返回“success”指示给客户端之前,必须要完成多少WAL处理。
    • 值列表
      • **remote_apply **:提交将等待,直到来自当前同步备用服务器的答复显示他们已收到事务的提交记录并应用了它,以便它变得对备 用服务器上的查询可见,并写入备用服务器上的持久存储。
      • on:提交将等待,直到来自于当前同步的后备服务器的回复显示它们已经收到了事务的提交记录并将其刷入了磁盘。 这保证事务将不会被丢失,除非主服务器和所有同步后备都遭受到了数据库存储损坏的问题。
      • remote_write:提交将等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经把该记录写到它们的文件系统。
      • local:当事务提交时,写入本地磁盘即可,不用关心备机的情况。
      • off:当数据库事务提交时不需要等待本地WAL buffer写入WAL日志,立刻向客户端返回成功。
  • max_wal_senders

    • 描述:主要用于流复制,指定了可以同时连接到主节点的最大备节点数量。每个备节点在连接到主节点时,都会占用一个 WAL sender 进程。wal_level必须设置为replica或更高级别以允许来自后备服务器的连接。
    • 默认值:默认值为 10。 0,表示复制被禁用;
    • 注意
      • 考虑备节点数量:在设置 max_wal_senders 参数时,当运行备用服务器时,你必须将此参数设置为与主服务器上相同的或更高的值。否则,备用服务器中将不允许查询。
      • 考虑主节点性能:增加 max_wal_senders 的值会增加主节点的资源消耗
  • wal_level

    • 描述:确定写入WAL的信息量,影响复制和恢复能力。
    • 可选值:
      • minimal:只记录足够用于崩溃恢复的信息。
      • replica:记录足够的信息以支持WAL归档和流复制。
      • logical:记录足够的信息以支持逻辑解码,这是比replica更详细的日志级别。
    • 默认值replica(对于大多数用途足够)。修改后需要重启数据库生效。
    • 注意:在 9.6 之前的版本中,这个参数也允许值archivehot_standby。现在仍然接受这些值,但是它们会被映射到replica
  • recovery_target_timeline

    • 描述:指定恢复到特定时间线。该值可以是数字时间线 ID 或特殊值。该值将沿着执行基本备份时的同一时间线恢复。该值将恢复到存档中找到的最新时间线,这在备用服务器中非常有用。
    • 默认值latest是默认值。
    • 注意:要以十六进制形式指定时间轴 ID。
  • primary_conninfo

    • 描述:指定备用服务器用来连接发送服务器的连接字符串。
    • 示例primary_conninfo = 'host=192.168.152.134 port=5432 user=replica password=replica'
  • hot_standby

    • 描述:指定在恢复期间,你是否能够连接并运行查询。
    • 默认值:默认值是onoff表示不允许备用节点成为热备用。备用节点只能在从主节点获取所有 WAL 日志后才能打开,不能执行查询操作。
  • synchronous_standby_names

    • 描述:指定哪些备库应被视为同步备库。这个参数接受一个或多个备库的application_name或网络地址。

    • 格式:一个或多个用逗号分隔的字符串,每个字符串可以是一个备库的application_name或网络地址。

      单台从可表示为 synchronous_standby_names = 'Standby1'。

      通常有ANY和FIRST两种设置多从的方式,如ANY num(...)表示任意num台答复,FIRST num(...)表示优先级前num的机器都答复。

    • 注意:当此参数被设置时,synchronous_commit参数的行为会受到影响,以确保在返回客户端成功之前,同步备库也提交了相应的事务。

标签:异步,stat,Fabse,sync,client,state,复制,pg,节点
From: https://www.cnblogs.com/zreo2home/p/18353394

相关文章

  • PostgreSQL的同步异步复制简介及互相转换
    PostgreSQL的同步/异步复制简介及互相转换一、介绍1.概念1.1.同步流复制同步流复制就是当主库发生变化,比如有一条DML语句产生了WAL日志后,通过后台进程传送到备库,备库必须要应用这个日志,然后向主库返回一个成功应用的信号,主库才可以成功的commit;否则主库会一直等待到备库成功......
  • Java中的异步编程模型与事件处理框架:从CompletableFuture到Reactive Streams
    Java中的异步编程模型与事件处理框架:从CompletableFuture到ReactiveStreams大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,异步编程和事件驱动架构变得越来越重要。它们能有效提高应用程序的性能和响应速度,特别是在处理高并发和I......
  • 单体应用提高性能及处理高并发-异步处理与消息队列
            在单体应用中,应对高并发和提升性能是开发者常面对的挑战。异步处理与消息队列是两个有效的手段,可以帮助开发者将耗时操作与主线程分离,减少阻塞,提高系统的响应速度和吞吐量。1.异步处理异步处理允许应用程序在执行耗时操作时不阻塞主线程。这对于提高系统性......
  • React深度解析三:高级用法HOC、Hooks、异步组件
    本文分文三部分:HOC高阶组件higherordercomponentHooks16.8版本后新增的钩子API异步组件使用lazy和suspense两个api实现组件代码打包分割和异步加载一、HOC高阶组件1、定义高阶组件不是组件而是函数,是react中用于复用组件逻辑的高级技巧,HOC本身不是react一部分,是基于......
  • MySQL--主从复制
    前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除一、什么是主从复制1、定义主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。2、作用做数据的热备,作为后备数据库,主数据库服务器故障后,可切......
  • 编写类 MyTools 类,编写一个方法可以打印二维数组的数据。 2) 编写一个方法 copyPerson
    1publicclassMethodExercise02{2publicstaticvoidmain(String[]args){34Personp=newPerson();5p.name="milan";6p.age=100;7//创建tools8MyToolstools=newMyTools();9......
  • Element学习(axios异步加载数据、案例操作)(5)
    1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。——>axios来发送异步请求(1)(2)在vue当中安装axios(注意在当前的项目目录,并且安装完之后再将项目重启一下)(3)这里我用到数据的url地址为:https://mock.apifox.cn/m1/3128855-0-default/emp/list......
  • 异步FIFO设计
    AsynchronousFIFODesign总结来自CliffordE.Cummings论文《SimulationandSynthesisTechniquesforAsynchronousFIFODesign》一、设计难点使用格雷码计数时空和满的判断。同步FIFO读写时钟相同,而异步FIFO读写来自不同两个读写时钟,需要考虑跨时钟域设计。二、设......
  • SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
    问题场景SQLServer事务复制在正常创建发布和订阅之后,logreaderJob启动异常,出现“Theprocesscouldnotexecute‘sp_replcmds’onxxx”等异常日志导致代理服务无法正常启动。 异常现象参考下图,异常日志如下Errormessages:Theprocesscouldnotexecute‘sp_re......
  • TINYMCE可以如何直接复制WORD的图文内容到编辑器中?
    昨天晚上论坛里面有一位网友给我发私信请教问题,如何解决word内容复制粘贴的问题,这位网友也是刚开始学习接触这块,很多基础知识并不了解,比如如何上传图片,如何保存图片,如何返回文件路径,这些技术他都不了解。先花了大概半个小时左右的时间给他讲解了一下基础知识,然后又花了一个小时......