我们有一个如下的主从复制配置。
在主节点上:
postgresql.conf
的数据库复制配置如下(为简洁起见,已省略了注释行):
max_wal_senders = 1
wal_keep_segments = 8
在从属节点上:
postgresql.conf
与主节点相同。 recovery.conf
如下所示:
standby_mode = 'on'
primary_conninfo = 'host=master1 port=5432 user=replication password=replication'
trigger_file = '/tmp/postgresql.trigger.5432'
最初设置时,我们进行了一些简单的测试,并确认了复制正在工作。然而,在进行初始数据加载时,只有部分数据传输到从服务器。
从服务器的日志现在充满了像这样的消息:
< 2015-01-23 23:59:47.241 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:47.241 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:52.259 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:52.260 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:57.270 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:57.270 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
在 #postgresql IRC 频道上进行了一些分析和帮助后,我得出结论是从库无法跟上主库的速度。 我提出的解决方案如下:
在主库上:
- 设置
max_wal_senders=5
- 设置
wal_keep_segments=4000
。是的,我知道这很高,但我想监控情况并观察会发生什么。我在主库上有空间。
在从库上:
- 在数据目录中保存配置文件(即
pg_hba.conf pg_ident.conf postgresql.conf recovery.conf
) - 清空数据目录(
rm -rf /var/lib/pgsql/9.3/data/*
)。这似乎是pg_basebackup
所必需的。 - 运行以下命令:
pg_basebackup -h master -D /var/lib/pgsql/9.3/data --username=replication --password
我漏掉了什么吗?有没有更好的方法使从库保持最新状态而不必重新加载所有数据?
非常感谢任何帮助。