我使用复制槽在 Postgresql 9.5 上设置了复制。我有一台主机和一台从机,两者都是 Ubuntu 14.04,带有一个名为 main 的集群,该集群位于默认目录以外的目录中。在两台服务器上,数据库分别按预期工作(在设置复制之前),包括来自另一台 Ubuntu 服务器的访问。
在主服务器上,我在 postgresql.conf 中有:
wal_level = hot_standby
archive_mode = on
max_replication_slots = 8
archive_timeout = 60
max_wal_senders = 8
wal_keep_segments = 100
logging_collector = on
我在 pg_hba.conf 中添加了一个复制用户:
host replication repuser [iprange] md5
我重新启动了数据库并像这样创建了一个复制槽(如 sudo -u postgres psql postgres):
SELECT * FROM pg_create_physical_replication_slot('repslot001');
在从机上,我从 pg_basebackup 开始:
sudo -u postgres pg_basebackup -v -h [ipofprimary] -U repuser -D [mydatadir] -R -Xs -P
我添加到 postgresql.conf:
hot_standby = on
我的恢复.conf:
standby_mode = 'on'
primary_conninfo = 'user=repuser password=geheim host=[ipofprimary] port=[port] sslmode=prefer sslcompression=1 krbsrvname=postgres'
primary_slot_name = 'repslot001'
trigger_file = '[datadirectory]/finish.recovery'
recovery_target_timeline='latest'
我重新启动了数据库,一切似乎都很好。这个时候我就回家了。
第二天,由于磁盘已满,我的主服务器崩溃了:
PANIC: could not write to file "pg_xlog/xlogtemp.11700": No space left on device
我搜索了一下,发现如果 master 上的 postgresql.conf 中设置的 archive_command 不正确或丢失,就会发生这种情况。
但据我了解,在使用复制槽时,我不需要 archive_command(因此,我没有设置存档命令)。我犯了什么错误?
如果您需要更多信息才能回答此问题,请告诉我。但是请注意,我需要继续我的工作,我现在正在尝试是否可以将奴隶提升为大师并清理旧的破碎大师。我将备份数据目录,其中也有日志。另请注意,这是一个测试设置,我不会丢失任何数据。只有当我确信我知道它是如何工作的以及如何正确设置它时,我才会开始在生产环境中使用复制。
谢谢你。
编辑。我犯的错误是我混淆了使用归档和使用复制槽(感谢 Frankie 的耐心等待)。我现在在我的 postgresql.conf 中有以下内容 - 它按预期工作:
wal_level = hot_standby
max_wal_senders = 8
max_replication_slots = 1
hot_standby = on
我删除了归档设置archive_mode
和archive_command
.
如果您只想要一个热备用主/从设置,而不需要例如时间点恢复,只需将 archive_mode 设置为 false 或将其从您的 postgres.conf 中删除。否则,您必须制定一个存储计划,以便您有足够的空间,这可能涉及设置 archive_command 以将存档复制到具有足够空间的磁盘。