我正在尝试了解 PostgreSQL 复制的最佳用途及其工作原理,以便在生产环境中进行故障排除。
我很难理解这两种复制类型在(1)配置(2)2台服务器主/从服务器在每种情况下的执行方式方面的区别
PostgreSQL(9.2+)上的复制本质上是 16MB 大小的 XLOG 文件(取决于创建每个文件的频率设置)正在主服务器上创建并通过某种方法发送到从服务器。
我的设置(出于此问题的目的)
在 Master
archive_command='rsync -av %p postgres@[SlaveIP]:[wal_archive_folder]/%f' 上配置 Postgresql.conf
在 Slave 上配置 Recovery.conf 以读取日志文件
restore_command = 'cp [wal_archive_folder]/%f \"%p\"'
primary_conninfo = 'host=[MasterIP] port=5432 user=postgres'
我的问题是这个配置的哪一部分使得这种“流式”复制与“日志传送”?我的主服务器配置为使用 rsync 将日志发送到从服务器(这是日志传送吗?)我的从服务器配置为能够连接到 recovery.conf 中的主服务器(这是流式传输吗?)
问题的第二部分:发生了什么?我知道通过 WAL_sender 和 WAL_receiver 在 PostgreSQL 上有另一个协议。但我不清楚这是否仅用于流式传输,如果是,主控中如何使用 rsync?
:) 谢谢!!对不起,如果这是一个明显的问题。我一直在阅读大量博客/书籍,但很难理解。Postgres wiki 是如此深入,以至于需要很长时间才能完成所有工作(而且我有截止日期)
“流式复制”是指通过连接上的 walsender 协议在主服务器和副本之间通过 TCP/IP 连接连续发送 WAL 记录
replication
。master 读取自己的 WALpg_xlog
并按需将其发送到副本。它配置了一个primary_conninfo
指令 inrecovery.conf
和pg_hba.conf
master 上的条目以允许replication
连接。您还需要wal_keep_segments
文档中涵盖的其他一些选项。“日志传送”是指通过文件传输协议将 WAL 记录作为整个 WAL 存档定期发送到副本可以从中获取它们的存档位置。它配置了一个
restore_command
指令 inrecovery.conf
和一个archive_command
in 主控。PostgreSQL 不关心文件在哪里或它们是如何传输的,只关心archive_command
将它们放在那里并restore_command
获取所需的存档;这允许构建像 PgBarman 和 WAL-E 这样的系统。流式复制没有太多延迟,因为记录在生成时发送。但是,它要求主副本和副本都在线并且能够直接通信。它还要求副本保持足够好,以使主服务器仍然具有副本所需的 WAL 的磁盘副本,并且通常需要您花费额外的
pg_xlog
空间来为副本保留额外的 WAL。日志传送复制有更多的延迟,因为副本只有在发送整个存档后才能看到 WAL。但是,即使主服务器和副本无法使用共享存储位置通过 TCP/IP 直接通信,它也可以工作。即使副本关闭了一段时间,它也会继续工作,因为
pg_xlog
只有在归档之后主服务器才会丢弃 WAL,所以即使主服务器无法发送 WAL 仍然在归档中并且可供副本使用通过流式传输。请注意,archive_command
永不放弃,pg_xlog
如果归档失败,可以填写;出于这个原因,最好存档到一个可靠的位置,然后让副本服务器从该位置获取。一般来说,您实际上将两者结合起来,即同时使用两者。在这种情况下,当一切正常时,就会使用流复制。如果副本太落后并且主服务器已经丢弃了它需要的 xlog,出现连接问题等,那么副本将切换到读取存档的 WAL,直到它赶上。它会定期重新尝试切换回流式传输,直到成功。
如果您只打算使用一个,请使用日志传送,因为没有日志传送回退的流式复制(直到 PostgreSQL 9.4)可能容易出现复制滞后,从而导致故障迫使重新构建副本。
PostgreSQL 9.4 稍微改变了这一点,因为流式复制现在可以使用“复制槽”。这让 master 可以跟踪副本需要多少 WAL,并避免在副本重放之前将其丢弃。因此,
wal_keep_segments
如果您使用复制槽(不是默认值),则不再需要。请参阅我的文章PostgreSQL 9.4 中的流式复制槽。
9.4 还介绍了流式逻辑复制的基础,这是另一种机制,专为逻辑复制系统(如 Londiste、Slony-I)和新的双向异步多主复制功能而设计。