46.3. Streaming Replication Protocol #
要启动流复制,前端在
startup 消息中发送
replication 参数。它会告诉后端进入
WAL 发送进程模式,在该模式下只能发出少量复制命令,而不能发出
SQL 语句。WAL 发送进程模式下只能使用简单查询协议。WAL 发送进程模式下接受的命令有:
- IDENTIFY_SYSTEM
请求服务器标识自身。服务器返回一个只有一行的结果集,包含两个字段:
- systemid
标识集簇的唯一系统标识符。可用于检查初始化备库所用的基础备份是否来自同一个集簇。
- timeline
当前 TimelineID。也可用于检查备库是否与主库一致。
- START_REPLICATION
XXX/XXX 指示服务器开始流式传输 WAL,从 WAL 位置
XXX/XXX开始。服务器可能回复错误,例如所请求的 WAL 段已被回收。成功时,服务器会回复一条 CopyOutResponse 消息,然后开始向前端流式传输 WAL。WAL 将持续流式传输,直到连接断开为止;不会再接受其他命令。WAL 数据以一系列 CopyData 消息发送。(这样可以混合发送其他信息;尤其是服务器在开始流式传输后遇到故障时,可以发送 ErrorResponse 消息。)每条 CopyData 消息的有效载荷遵循以下格式:
- XLogData (B)
- Byte1('w')
Identifies the message as WAL data.
- Byte8
本消息中 WAL 数据的起始点,以 XLogRecPtr 格式给出。
- Byte8
服务器上 WAL 的当前末尾,以 XLogRecPtr 格式给出。
- Byte8
传输时服务器的系统时钟,以 TimestampTz 格式给出。
- Byte
n WAL 数据流的一段。
单条 WAL 记录绝不会拆分到两条 CopyData 消息中。当一条 WAL 记录跨越 WAL 页边界(因而已经用继续记录拆分)时,它可以在页边界处拆分。换句话说,第一条主 WAL 记录与它的继续记录可以在不同的 CopyData 消息中发送。
注意,WAL 数据内部以及上面描述的头部中的所有字段,都采用发送服务器的本机格式。字节序和时间戳的格式是不可预测的,除非接收方已验证发送方的系统标识符与自己
pg_control中的内容一致。如果 WAL 发送进程正常终止(postmaster 关闭期间),它会在退出前发送一条 CommandComplete 消息。当然,异常关闭时可能不会发生这种情况。