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_state
为 sync
,则表示该从节点是同步复制的;如果为 async
,则表示是异步复制的。
3. 异步复制转同步复制
在主库中查看SHOW synchronous_commit;
显示为off,并且SELECT client_addr, state, sync_state FROM pg_stat_replication;
中显示的sync_state
为async
;表示这个从库使用异步复制。
在主库的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_state
为sync
;
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 sender 进程。
-
wal_level
- 描述:确定写入WAL的信息量,影响复制和恢复能力。
- 可选值:
minimal
:只记录足够用于崩溃恢复的信息。replica
:记录足够的信息以支持WAL归档和流复制。logical
:记录足够的信息以支持逻辑解码,这是比replica
更详细的日志级别。
- 默认值:
replica
(对于大多数用途足够)。修改后需要重启数据库生效。 - 注意:在 9.6 之前的版本中,这个参数也允许值
archive
和hot_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
- 描述:指定在恢复期间,你是否能够连接并运行查询。
- 默认值:默认值是
on
。off
表示不允许备用节点成为热备用。备用节点只能在从主节点获取所有 WAL 日志后才能打开,不能执行查询操作。
-
synchronous_standby_names
-
描述:指定哪些备库应被视为同步备库。这个参数接受一个或多个备库的application_name或网络地址。
-
格式:一个或多个用逗号分隔的字符串,每个字符串可以是一个备库的application_name或网络地址。
单台从可表示为 synchronous_standby_names = 'Standby1'。
通常有ANY和FIRST两种设置多从的方式,如ANY num(...)表示任意num台答复,FIRST num(...)表示优先级前num的机器都答复。
-
注意:当此参数被设置时,
synchronous_commit
参数的行为会受到影响,以确保在返回客户端成功之前,同步备库也提交了相应的事务。
-