PostgreSQL的walsender和walreceiver进程介绍
在 PostgreSQL 中,WAL (Write-Ahead Logging) 是一种用于确保数据库事务日志安全可靠的机制。WAL 是 PostgreSQL 进行数据库恢复、复制等操作的基础。walsender
和 walreceiver
是 PostgreSQL 内部两个非常重要的进程,它们负责主从复制中的日志传输和应用。
walsender
walsender
(WAL Sender)是运行在主节点上的进程,它负责发送WAL记录给从节点。这个进程会读取pg_xlog
或pg_wal
目录下的WAL日志文件,并通过TCP/IP网络传输到从节点。
主要职责
- 传输WAL记录:读取WAL记录并将其发送给从节点的
walreceiver
进程。 - 维持心跳:确保复制连接的活跃性,避免因连接问题导致的复制中断。
- 管理WAL发送:基于从节点的接收和应用情况管理WAL文件的发送。
配置参数
在 postgresql.conf
文件中,有几个与 walsender
相关的重要配置:
max_wal_senders = 10 # 最大WAL发送进程数量
wal_level = replica # 设定为 replica 或更高级别以启用复制
max_replication_slots = 4 # 最大复制槽数
[pg12@test1 ~]$ ps -ef |grep walsender |grep -v grep
pg12 66591 62674 0 02:48 ? 00:00:00 postgres: walsender repmgr 192.168.10.101(53684) streaming 0/33DD75D0
walreceiver
walreceiver
(WAL Receiver)是运行在从节点上的进程,它负责接收来自主节点的WAL记录并将其应用到从节点上去。
主要职责
- 接收WAL记录:通过网络从主节点的
walsender
接收WAL记录。 - 应用WAL记录:将接收的WAL记录写入磁盘,并根据需要应用到数据页上。
- 发送确认:向主节点发送确认消息,通知已经接收到的WAL日志位置信息。
配置参数
在从节点的 recovery.conf
(或者 postgresql.auto.conf
和 standby.signal
文件)中,定义一些与 walreceiver
相关的配置,比如主节点的连接信息:
primary_conninfo = 'host=primary_host port=5432 user=replicator password=mysecretpassword'
primary_slot_name = 'my_replication_slot'
[pg12@test2 archivelog]$ ps -ef |grep walreceiver |grep -v grep
pg12 92949 92944 0 02:48 ? 00:00:00 postgres: walreceiver streaming 0/33DDDC78
动态协作
在主从节点间,walsender
和 walreceiver
共同协作完成WAL日志的传输和应用:
- 连接建立:启动时,
walreceiver
连接到主节点,并启动walsender
进程。 - WAL传输:
walsender
读取WAL记录,并通过连接发送给walreceiver
。 - 确认机制:
walreceiver
定期确认已接收和应用的WAL记录位置信息。 - 维护连接:通过心跳机制保持连接的稳定性。
- 故障情况下重连:如果连接中断,
walreceiver
会尝试重新连接到主节点,walsender
也会重启。
总结
walsender
和 walreceiver
是 PostgreSQL 主从复制中关键的进程,它们负责WAL日志的传输和应用。