Postgres 从服务器日志重播详细信息
Postgres slave server log replay details
Postgres通过WAL(Write Ahead Log)文件支持主从复制。
在主服务器上,一个名为WALSender
的后端进程将向从服务器发送日志文件(记录),而在从服务器上,一个名为WALReceiver
的后端进程将接收日志文件(记录),并且块数据而不是 SQL 查询存储在 WAL 文件中。 (我说的对吗??)
那么从服务器在文件复制和流复制两种情况下如何应用日志更新呢?我的意思是详细说明哪个进程处理这个以及它是如何处理的?
提前致谢。
你的描述是一个合理的总结,是的。大致分为三个级别:
高级 SQL 查询,例如 "UPDATE mytable SET a=nextval('some_sequence'), b=current_timestamp WHERE id="
逻辑行更改,如 "in table abc with primary key value id=42 the tuple was updated to new value (a=11, b=12314234321)"。这些不是以这种形式记录在磁盘上的,而是执行器内部产生的一个中间阶段,然后变成:
块级更改先写入 xlog,然后写入堆,如 "in relation with relfilenode 12312.1 in dboid 9191 stored in tablespace 1, block 41231 byte offset 0x0012 changed to 0xde 0xad 0xbe 0xef 0x01"
(所有数字完全组成)
基于 WAL 的复制发生在最低级别,记录对数据库中文件的块更改。好的,所以它不是那么简单,但是为了理解复制的目的就可以了。
在独立主机上,SQL 被执行,产生记录到 WAL 和 shared_buffers
的行更改。然后重放 WAL 以将更改应用到数据库堆。 (同样,由于 bgwriter 等的脏回写,这并不是那么简单,但现在就可以了)。
对于基于 WAL 的复制,主服务器会保留 WAL - 将其发送到副本或将其存档。副本,而不是生成自己的 WAL 然后重放它,只是从其他地方的主服务器重放 WAL,使用它来更新数据库堆及其 shared_buffers
.
Then how does slave server apply the log updates in both cases of file-based replication
副本运行 restore_command
以在到达前一个存档的末尾时请求下一个 WAL 存档。恢复过程然后开始读取 WAL 存档,逐条处理它。
查看restore_command
在源码中是如何被调用的,看看它是如何被调用的。
and streaming replication?
副本的walreceiver连接上游的walsender,接收wal记录。这些被写入一个文件,然后恢复过程读取该文件。
两种情况下的恢复部分是相同的,不同之处在于如何从上游接收 WAL。在 master 上进行崩溃恢复时,恢复也大同小异;也只是重放 WAL。
I mean in detail which process handles this and how it does this?
最好的参考是源代码 - 特别是注释和 README 文件。
我强烈建议您使用pg_xlogdump
来查看WAL 实际包含的内容。然后阅读相关 WAL 记录的文档以了解每种记录类型的作用。
也从阅读 src/backend/access/transam/README
和 src/backend/access/transam/xlog.c
开始。
我不会重复相关 README 中已有的内容,它们比我的描述更可能是正确的。
Postgres通过WAL(Write Ahead Log)文件支持主从复制。
在主服务器上,一个名为WALSender
的后端进程将向从服务器发送日志文件(记录),而在从服务器上,一个名为WALReceiver
的后端进程将接收日志文件(记录),并且块数据而不是 SQL 查询存储在 WAL 文件中。 (我说的对吗??)
那么从服务器在文件复制和流复制两种情况下如何应用日志更新呢?我的意思是详细说明哪个进程处理这个以及它是如何处理的?
提前致谢。
你的描述是一个合理的总结,是的。大致分为三个级别:
高级 SQL 查询,例如 "UPDATE mytable SET a=nextval('some_sequence'), b=current_timestamp WHERE id="
逻辑行更改,如 "in table abc with primary key value id=42 the tuple was updated to new value (a=11, b=12314234321)"。这些不是以这种形式记录在磁盘上的,而是执行器内部产生的一个中间阶段,然后变成:
块级更改先写入 xlog,然后写入堆,如 "in relation with relfilenode 12312.1 in dboid 9191 stored in tablespace 1, block 41231 byte offset 0x0012 changed to 0xde 0xad 0xbe 0xef 0x01"
(所有数字完全组成)
基于 WAL 的复制发生在最低级别,记录对数据库中文件的块更改。好的,所以它不是那么简单,但是为了理解复制的目的就可以了。
在独立主机上,SQL 被执行,产生记录到 WAL 和 shared_buffers
的行更改。然后重放 WAL 以将更改应用到数据库堆。 (同样,由于 bgwriter 等的脏回写,这并不是那么简单,但现在就可以了)。
对于基于 WAL 的复制,主服务器会保留 WAL - 将其发送到副本或将其存档。副本,而不是生成自己的 WAL 然后重放它,只是从其他地方的主服务器重放 WAL,使用它来更新数据库堆及其 shared_buffers
.
Then how does slave server apply the log updates in both cases of file-based replication
副本运行 restore_command
以在到达前一个存档的末尾时请求下一个 WAL 存档。恢复过程然后开始读取 WAL 存档,逐条处理它。
查看restore_command
在源码中是如何被调用的,看看它是如何被调用的。
and streaming replication?
副本的walreceiver连接上游的walsender,接收wal记录。这些被写入一个文件,然后恢复过程读取该文件。
两种情况下的恢复部分是相同的,不同之处在于如何从上游接收 WAL。在 master 上进行崩溃恢复时,恢复也大同小异;也只是重放 WAL。
I mean in detail which process handles this and how it does this?
最好的参考是源代码 - 特别是注释和 README 文件。
我强烈建议您使用pg_xlogdump
来查看WAL 实际包含的内容。然后阅读相关 WAL 记录的文档以了解每种记录类型的作用。
也从阅读 src/backend/access/transam/README
和 src/backend/access/transam/xlog.c
开始。
我不会重复相关 README 中已有的内容,它们比我的描述更可能是正确的。