【问题标题】:How to bring back the replication system in postgresql if the master ip address has been changed in ubuntu?如果在 ubuntu 中更改了主 IP 地址,如何在 postgresql 中恢复复制系统?
【发布时间】:2020-06-08 21:51:32
【问题描述】:

Postgresql 数据库复制有两台服务器,一台用于主服务器,另一台用于从服务器。由于某种原因,主 IP 地址已更改,该地址已在从服务器的多个位置使用。使用新的 IP 地址,在从服务器中用最新的 IP 地址替换旧 IP 地址后,复制无法像以前一样工作。有人可以帮助解决这个问题吗? 以下是设置从服务器的步骤:

1.在pg_hba.conf文件中添加用户复制的主IP地址

nano /etc/postgresql/11/main/pg_hba.conf host
    replication  master-IP/24  md5

2.modify the following lines in the PostgreSQL.conf file of slave server where listen_addresses should be the IP of the slave server
    nano /etc/postgresql/11/main/postgresql.conf
    listen_addresses = 'localhost,slave-IP'
    wal_level = replica
    max_wal_senders = 10
    wal_keep_segments = 64

3. Take the backup of the master server by entering the IP


pg_basebackup -h master-ip -D /var/lib/postgresql/11/main/ -P -U
    replication --wal-method=fetch

4.create a recovery file and adding the following commands


 standby_mode          = 'on'
    primary_conninfo      = 'host=master-ip port=5432 user=replication password= '
    trigger_file = '/tmp/MasterNow'

以下是日志文件中的错误:

started streaming WAL from primary at A/B3000000 on timeline 2
FATAL:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000020000000A000000B3 has already been removed

FATAL:  could not connect to the primary server: could not connect to server: Connection timed out
        Is the server running on host "master ip" and accepting
        TCP/IP connections on port 5432?

record with incorrect prev-link 33018C00/0 at 0/D8E15D18

【问题讨论】:

    标签: postgresql database-replication master-slave


    【解决方案1】:

    主机复制master-IP/24 md5

    此行缺少一个字段。 USER 字段。

    listen_addresses = 'localhost,slave-IP'

    很少需要使用“*”以外的任何内容。如果您不尝试对其进行微观管理,那么您需要改变的事情就更少了。此外,除非您使用级联复制,否则更改副本上的 wal_keep_segments 并没有多大作用。需要在master上更改。

    pg_basebackup -h master-ip -D /var/lib/postgresql/11/main/ -P -U 复制 --wal-method=fetch

    这是否表明它成功了?

    致命:无法从 WAL 流接收数据:错误:请求的 WAL 段 000000020000000A000000B3 已被删除

    致命:无法连接到主服务器:无法连接到 服务器:连接超时 服务器是否在主机“master ip”上运行并接受 端口 5432 上的 TCP/IP 连接?

    这很奇怪。为了被告知文件“已经被删除”,它必须已经连接。但是下一行说它无法连接。配置错误导致您无法连接并不少见,但在这种情况下,它第一次将无法连接。您是否更改了这两条日志消息之间的配置?您的网络连接不稳定吗?

    【讨论】:

    • 嗨,珍妮丝。是的,连接问题现已解决。主要阻止程序是 WAL 文件,备用服务器没有在此停机期间从主服务器丢失的数据。我们如何将数据从主服务器带回备用服务器?
    • Laurenz 已经很好地涵盖了这些选项。除非你有一个 WAL 存档丢失了 WAL 文件,否则你将不得不再次运行 pg_basebackup。
    【解决方案2】:

    备用服务器停机的时间足够长,以至于主服务器不再具有所需的事务日志信息。

    有三种补救措施:

    1. 在备用服务器的恢复配置中设置 restore_command 参数以从存档中恢复 WAL 段(这应该与主服务器上的 archive_command 相反)。然后重启standby。

      这是让您无需从头开始重建备用服务器即可恢复的唯一选项。

    2. 在主服务器上将wal_keep_segments 设置得足够高,以保留足够的 WAL 来应对中断。

      这不会帮助您现在恢复,但可以避免将来出现问题。

    3. 在主服务器上定义一个物理复制槽,并将其名称放在备用服务器恢复配置中的primary_slot_name 参数中。

      这不会帮助您现在恢复,但可以避免将来出现问题。

      注意:使用复制槽时,请监控复制。否则,一个关闭的备用服务器将导致 WAL 段在主服务器上堆积,最终填满磁盘。

    除第一个选项外,所有选项都要求您使用 pg_basebackup 重建备用数据库,因为所需的 WAL 信息不再可用。

    【讨论】:

    • 感谢 Laurenz 的解决方案。我应该在不更改任何内容的情况下重建备用服务器吗?我的意思是我不应该删除现有的数据库,我所要做的就是从拥有所有数据的主服务器上删除 pg_basebackup?如果我在这里遗漏了有关如何恢复备用服务器的内容,请纠正我
    • 如果您像我的第一个解决方案一样使用存档,您所要做的就是等待备用服务器赶上来。使用其他选项,您必须停止备用,删除数据目录并使用 initdb 从头开始​​重建它。
    • 感谢 Laurenz 的解决方案。这有帮助!!对于将来出现此类故障的情况,您认为哪一种解决方案最适合?
    • 如果有存档我更喜欢1,如果有监控,我更喜欢3,否则2。
    • 这行得通。我尝试了删除数据目录的解决方案并运行 pg_basebackup 像以前一样工作。 Laurenz 能否请您建议哪种复制方法最适合 PostgreSQL 实现? (流媒体或热备或任何其他)
    猜你喜欢
    • 2014-04-06
    • 2018-02-19
    • 2018-09-28
    • 1970-01-01
    • 2015-10-18
    • 2020-11-27
    • 2013-01-11
    • 2010-09-24
    相关资源
    最近更新 更多