Postgresql stream replication slow
目前有两台postgres db, 使用stream replication 做主从同步,在比较重的写操作时发生了比较重的延迟.
通过对
pg_xlog_location_diff(pg_current_xlog_location(), sent_location) AS not_sent,
pg_xlog_location_diff(sent_location, write_location) AS not_written,
pg_xlog_location_diff(write_location, flush_location) AS not_flushed,
pg_xlog_location_diff(flush_location, replay_location) AS not_replayed
FROM pg_stat_replication;
这几个参数的监控,我们发现在
pg_current_xlog_location() - (sent_location)有比较重的延迟,延迟的size将近在100MB+ ,网络吞吐量最大值在10MB/s.
最大的延迟将近5分钟.
wal sender发送xlog的前提是xlog已经在本地落盘,如果没有落盘是不能发的。
另外有几种情况会触发主walsender往备发送xlog
/*
* Fill the send timestamp last, so that it is taken as late as possible.
*/
resetStringInfo(&tmpbuf);
pq_sendint64(&tmpbuf, GetCurrentIntegerTimestamp());
memcpy(&output_message.data[1 + sizeof(int64) + sizeof(int64)],
tmpbuf.data, sizeof(int64));
pq_putmessage_noblock('d', output_message.data, output_message.len);
sentPtr = endptr;
current location则是在flush xlog后更新的。
你获取到的值,只能是一个参考,因为没有办法同时获得这两个值的一致状态。
你这个例子主要是产生XLOG的速度太快,可能造成了这个看起来的差异。实际的差异不应该这么大。
如果要更精准的值,可以hack一下,在walsender中获取到当前的current xlog location并存下来,返回时使用这个值。
本地模拟:
更新数据表的字段 一个表将近110w数据 ,size 是 612 MB.
我们在观察主从两边的wal log 的数目时发现,此次操作总归会生产104个wal 文件 size =16MB* 104 =1.644268775GB.
手工对比主从库wal 文件状态,从库远远落后于主库,将近落后30多个wal file.
Client connecting to 192.168.6.55, TCP port 5001
[ 3] local 192.168.6.56 port 41489 connected with 192.168.6.55 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.09 GBytes 939 Mbits/sec
网卡最大值为1G.
数据库 MAX_SEND_SIZE (XLOG_BLCKSZ * 16)
XLOG_BLCKSZ= 8K
理论上 延迟最大值为一秒.
Postgres version:psql (PostgreSQL) 9.2.13
有没有其他参数会影响到stream replication的性能?
期待大家的回复,讨论.
本地模拟:
更新数据表的字段 一个表将近110w数据 ,size 是 612 MB.
我们在观察主从两边的wal log 的数目时发现,此次操作总归会生产104个wal 文件 size =16MB* 104 =1.644268775GB.
手工对比主从库wal 文件状态,从库远远落后于主库,将近落后30多个wal file.
Client connecting to 192.168.6.55, TCP port 5001
[ 3] local 192.168.6.56 port 41489 connected with 192.168.6.55 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.09 GBytes 939 Mbits/sec
网卡最大值为1G.
本地模拟:
更新数据表的字段 一个表将近110w数据 ,size 是 612 MB.
我们在观察主从两边的wal log 的数目时发现,此次操作总归会生产104个wal 文件 size =16MB* 104 =1.644268775GB.
手工对比主从库wal 文件状态,从库远远落后于主库,将近落后30多个wal file.
我也使用了iperf去测试了网络情况
Client connecting to 192.168.6.55, TCP port 5001
[ 3] local 192.168.6.56 port 41489 connected with 192.168.6.55 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.09 GBytes 939 Mbits/sec
网卡最大值为1G.
数据库 MAX_SEND_SIZE (XLOG_BLCKSZ * 16)
XLOG_BLCKSZ= 8K
理论上 延迟最大值为一秒.
Postgres version:psql (PostgreSQL) 9.2.13
有没有其他参数会影响到stream replication的性能?
期待大家的回复,讨论.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。