Postgres 9.4,复制槽,不工作故障转移主

abr*_*low 5 postgresql replication failover

我已经通过本手册安装了 postgres 主节点和从节点:

在主 (10.0.0.1) 处

sudo -u postgres initdb -D /data/postgres/main
Run Code Online (Sandbox Code Playgroud)

更改 postgresql.conf:

listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 2
logging_collector = on
max_wal_senders = 5
Run Code Online (Sandbox Code Playgroud)

将复制记录添加到 pg_hba.conf:

host replication replica 10.0.0.2/32 md5
Run Code Online (Sandbox Code Playgroud)

然后启动postgres

service postgresql start
Run Code Online (Sandbox Code Playgroud)

创建复制用户:

CREATE USER replica WITH REPLICATION ENCRYPTED PASSWORD '123456';
Run Code Online (Sandbox Code Playgroud)

并添加复制槽:

SELECT pg_create_physical_replication_slot('standby_slot');
Run Code Online (Sandbox Code Playgroud)

在从站 (10.0.0.2)

pg_basebackup -h 10.0.0.1 -U replica -D /db/postgres/main -X s -P
Run Code Online (Sandbox Code Playgroud)

在 postgresql.conf 中将状态更改为备用:

hot_standby = on
Run Code Online (Sandbox Code Playgroud)

添加recovery.conf:

standby_mode = 'on'
primary_conninfo = 'host=10.0.0.1 port=5432 user=replica password=123456'
primary_slot_name = 'standby_slot'
trigger_file = 'trigger'
Run Code Online (Sandbox Code Playgroud)

开始待机:

service postgresql start
Run Code Online (Sandbox Code Playgroud)

因此,复制工作正常。如果我创建数据库,它会同时出现在 master 和 slave 上。

如果 slave 宕机然后启动,所有的变化都会出现。这一切也很好。

但是如果主人宕机了,我就会遇到问题。当它停止时,我在从站创建触发文件。然后我在从属数据库创建另一个数据库,现在是主数据库。之后我启动master,触发自动删除文件,recovery.conf也自动重命名为recovery.done。好的。但是如何同步从slave(新primary)到master(旧primary)的变化呢?

我发现我必须做这四个步骤:

在大师处:

停止 postgres:

service postgresql stop
Run Code Online (Sandbox Code Playgroud)

在奴隶:

打开备份模式:

SELECT pg_backup_start('backup', true);
Run Code Online (Sandbox Code Playgroud)

然后将新数据从从站同步到主站。

然后关闭备份模式:

SELECT pg_backup_stop();
Run Code Online (Sandbox Code Playgroud)

最后一步后,我收到消息

NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
Run Code Online (Sandbox Code Playgroud)

然后,如果我启动 master,它不会以日志消息开头:

FATAL: could not locate required checkpoint record
Run Code Online (Sandbox Code Playgroud)

我不明白,如何在 master 上获取新数据并使其再次成为主要数据。

所以在未来我计划安装 pgpool2 用于平衡和故障转移,但测试安装不起作用,因为我不知道这种机制应该如何工作。

dez*_*zso 4

你不能只是跳回到旧主人那里,正如这里所说的:

一旦发生故障转移到备用服务器,就只有一台服务器在运行。这被称为简并状态。以前的备用数据库现在是主要数据库,但以前的主要数据库已关闭并且可能会保持关闭状态。要恢复正常操作,必须在以前的主系统启动时重新创建备用服务器,或者在第三个系统(可能是新系统)上重新创建。

为此,你需要一位recovery.conf老师傅。这应该与当前的几乎相同,只是连接必须指向其他地方。