postgresql数据库不能复制。没有错误

时间:2014-09-15 21:04:08

标签: linux postgresql database-replication

背景:

我正在尝试在两台服务器之间设置流式复制。虽然postgresql在两个盒子上运行时没有任何错误,但是当我从主服务器添加或更改记录时,这些更改不会反映在辅助服务器上。

我在主数据库服务器上进行了以下设置:

(注意:我使用假的ip地址,但10.222.22.12代表主服务器而.21代表次要服务器)

主服务器 - posgresql.conf

listen_addresses = '10.222.22.12'
unix_socket_directory = '/tmp/postgresql'
wal_level = hot_standby
max_wal_senders = 5             # max number of walsender processes
                                # (change requires restart)
wal_keep_segments = 32          # in logfile segments, 16MB each; 0 disables

主服务器 - pg_hba.conf

host    all             all             10.222.22.21/32         trust
host    replication     postgres        10.222.22.0/32          trust

主服务器 - 防火墙

我已经检查过以确保所有传入fw的内容都已打开并且所有流量都被允许。

辅助服务器 - posgresql.conf

listen_addresses = '10.222.22.21'
wal_level = hot_standby
max_wal_senders = 5             # max number of walsender processes
                                # (change requires restart)
wal_keep_segments = 32          # in logfile segments, 16MB each; 0 disables
hot_standby = on              

辅助服务器 - pg_hba.conf

host    all             all             10.222.22.12/32         trust
host    all             all             10.222.22.21/32         trust
host    replication     postgres        10.222.22.0/24          trust

辅助服务器 - recovery.conf

standby_mode='on'
primary_conninfo = 'host=10.222.22.12 port=5432 user=postgres'

辅助服务器防火墙

一切都在这里开放。

到目前为止我尝试了什么

  1. 对主要数据进行了更改。什么都没有复制过。
  2. 检查两台服务器上的防火墙设置。
  3. 检查辅助盒上的arp表以确保它可以与主服务器通信。
  4. 检查了两台服务器上的postmaster.log文件。他们是空的。
  5. 检查两台服务器上的syslog文件。没有发现错误。
  6. 在两台服务器上重新启动postgresql以确保它启动时没有错误。
  7. 我不确定还有什么要检查。如果您有任何建议,我会很感激。

    编辑1

    我已检查主人上的pg_stat_replication表,我得到以下结果:

    psql -U postgres testdb -h 10.222.22.12 -c "select * from pg_stat_replication;"
    
     pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | state | sent_location | write_location | flush_location | repl
    ay_location | sync_priority | sync_state 
    -----+----------+---------+------------------+-------------+-----------------+-------------+---------------+-------+---------------+----------------+----------------+-----
    ------------+---------------+------------
    (0 rows)
    

    奴隶上的,请注意以下查询的结果:

    testdb=# select now()-pg_last_xact_replay_timestamp();
     ?column? 
    ----------
    
    (1 row)
    

    openser =#

2 个答案:

答案 0 :(得分:1)

我更改了主服务器上的pg_hba.conf文件并添加了我的slave的确切ip地址,如下所示:

host    all             all             10.222.22.21/32         trust
host    replication     postgres        10.222.22.0/32          trust
#added the line below
host    replication     postgres        10.222.22.12/32         trust

然后我重新启动postgresql并且它有效。 我想我期待我添加的新线上方的线可以工作,但事实并非如此。我必须在子网上做更多的阅读。

答案 1 :(得分:0)

在主设备上,监听地址应允许从设备连接,即

listen_addresses = '10.222.22.21'

看来你的postgres日志记录配置不好。

我的猜测是,奴隶无法流式传输,因为它落后于主服务器,可能是由于网络延迟造成的。

我的建议是,你应该归档wal文件,所以如果奴隶落后于主人,它可以从档案中重播wal文件。

您也可以通过

进行检查
select * from pg_stat_replication;

在主人身上。如果它没有显示任何行,则表示流式传输失败,可能是由于奴隶落后于主服务器。

您也可以通过发出:

进行检查
select now()-pg_last_xact_replay_timestamp();

在奴隶身上。查询计算从站落后于主站的距离。

通常,流复制滞后不到1秒。滞后大于1秒,然后流媒体将被切断。