WalReceiverMain 进程,这里有个 bug,如果 mirror 节点本身的日志比 primary 还要多,这样会出问题,但不知道 greenplum 有没有修复这个 bug。
首先读出 timeline 的位置,进入 wal 的接收状态 (walrcv_receive),当有消息到来,告知 primary 节点已收到日志,将日志刷盘后,再告知 primary 节点,刷盘的消息。
创建 xxx.done 文件来标记备份完成。并等待下一条消息(WalRcvWaitForStartPosition)。
startup 背景进程收到消息后,会读 wal 文件,执行 redo(RmgrTable[record->xl_rmid].rm_redo(ReadRecPtr, EndRecPtr, record);)