Postgres从服务器日志重播详细信息

时间:2015-10-15 13:56:22

标签: postgresql master-slave wal

Postgres支持通过WAL(Write Ahead Log)文件进行主从复制。

在主服务器上,名为WALReceiver的后端进程将日志文件(记录)发送到从属服务器,而在从属服务器上,名为 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); fragment.onActivityResult(requestCode, resultCode, data); } 的后端进程将接收日志文件(记录)和块数据而不是SQL查询存储在WAL文件中。 (我是对的?)

那么从服务器如何在基于文件的复制和流复制的两种情况下应用日志更新?我的意思是详细说明哪个流程处理这个以及它是如何处理的?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的描述是一个合理的总结,是的。大致有三个级别:

  • 高级SQL查询,例如" UPDATE mytable SET a = nextval(' some_sequence'),b = current_timestamp WHERE id = $ 1"

  • 逻辑行更改,如"在表abc中,主键值id = 42,元组更新为新值(a = 11,b = 12314234321)"。这些没有以这种形式记录在磁盘上,但是在执行器内部产生的中间阶段,然后变成:

  • 写入xlog然后堆的块级更改,如"与存储在表空间1中的dboid 9191中的relfilenode 12312.1相关,块41231字节偏移0x0012更改为0xde 0xad 0xbe 0xef 0x01&#34

(所有数字完全组成)

基于WAL的复制发生在最低级别,记录数据库中文件的块更改。好的,所以它并不那么简单,但这样做是为了理解复制。

在独立主服务器上,执行SQL,产生记录到WAL和Context的行更改。然后重放WAL以将更改应用于数据库堆。 (再说一次,由于bgwriter等的粗回写,并不是那么简单,但是现在还可以使用。)

使用基于WAL的复制,主人将WAL保持在周围 - 将其发送到副本或存档。副本,而不是生成自己的WAL,然后重放它,只是从其他地方的主人重播WAL,使用它来更新数据库堆及其shared_buffers

  

然后,在两种基于文件的复制情况下,从服务器如何应用日志更新

副本运行shared_buffers,以便在它到达上一个存档的末尾时请求下一个WAL存档。然后恢复过程开始读取WAL存档,逐个记录处理它。

查看源代码中restore_command的使用方式,了解它是如何被调用的。

  

和流式复制?

副本的walreceiver连接到上游的walsender并接收wal记录。这些文件将写入文件,然后恢复过程将读取该文件。

恢复部分在两种情况下都是相同的,区别在于如何从上游接收WAL。在主服务器上进行崩溃恢复时,恢复也大致相同;那也只是重播WAL。

  

我的意思是详细说明哪个流程处理这个以及它是如何处理的?

对此最好的参考是源代码 - 特别是注释和README文件。

我强烈建议您使用restore_command来查看WAL实际包含的内容。然后阅读相关WAL记录的文档,以了解每种记录类型的作用。

首先阅读src/backend/access/transam/READMEpg_xlogdump

我不会重复已经在相关自述文件中的内容,这比我的描述更可能是正确的。