首页 > 解决方案 > macOS 上的 postgresql 流式复制速度很慢

问题描述

我在尝试设置流复制的 MAC 上使用 PostgreSQL 10.1。我将主机和从机都配置在同一台机器上。我发现流复制滞后在 mac 上比预期的要慢。相同的测试在 Linux Ubuntu 16.04 机器上运行,没有太多延迟。

我有以下插入脚本。

for i in $(seq 1 1 1000)
do
bin/psql postgres -p 8999 -c "Insert into $1 select tz, $i * 127361::bigint, $i::real, random()*12696::bigint from generate_series('01-01-2018'::timestamptz, '02-01-2018'::timestamptz, '30 sec'::interval)tz;"
echo $i
done

使用以下查询测量滞后,

SELECT pg_last_wal_receive_lsn() - pg_last_wal_replay_lsn();
SELECT (extract(epoch FROM now()) - extract(epoch FROM pg_last_xact_replay_timestamp()))::int;

然而,观察结果非常出乎意料。从 master 上开始事务的那一刻起,延迟就在增加。

Slave    localhost_9001: 12680304        1  
Slave    localhost_9001: 12354168        1  
Slave    localhost_9001: 16086800        1  
.
.
.
Slave    localhost_9001: 3697460920      121    
Slave    localhost_9001: 3689335376      122    
Slave    localhost_9001: 3685571296      122
.
.
.
.
Slave    localhost_9001: 312752632       190    
Slave    localhost_9001: 308177496       190    
Slave    localhost_9001: 303548984       190
.
.
Slave    localhost_9001: 22810280        199    
Slave    localhost_9001: 8255144         199    
Slave    localhost_9001: 4214440         199    
Slave    localhost_9001: 0       0  

单个客户端插入单个表需要大约 4.5 分钟才能在主服务器上完成,而从服务器又需要 4 分钟才能赶上。请注意,除了用于测量滞后的脚本之外,不会同时运行任何选择。

我知道 PostgreSQL 中的重放非常简单,例如“将特定块移动到某个位置”,但我不确定这种行为。

我有以下其他配置,

checkpoint_timeout = 5min       
max_wal_size = 1GB
min_wal_size = 80MB

现在,我在 Linux Ubuntu 16.04 机器上使用相同的配置运行相同的测试,我发现延迟非常合理。

我错过了什么吗?

标签: postgresqldatabase-replicationpostgresql-10

解决方案


推荐阅读