加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL数据库Streaming Replication流复制主备延迟测试

发布时间:2020-12-13 18:15:10 所属栏目:百科 来源:网络整理
导读:PostgreSQL数据库流复制主库和备库之间的延迟时间是多少,无论对HA还是负载均衡来说都应该做个评估。比如单纯的HA架构,当主库发生故障时,我们允许多少时间内的数据丢失。不废话,直接进入本次实验测试。 测试环境: 主库:内存:32G,CPU:8核,IP:192.16

PostgreSQL数据库流复制主库和备库之间的延迟时间是多少,无论对HA还是负载均衡来说都应该做个评估。比如单纯的HA架构,当主库发生故障时,我们允许多少时间内的数据丢失。不废话,直接进入本次实验测试。

测试环境:

主库:内存:32G,CPU:8核,IP:192.168.122.101

备库:内存:32G,CPU:8核,IP:192.168.122.102

数据库配置:默认

测试准备:

在两台服务器上安装好PostgreSQL数据库,安装过程不清楚的可以参考文章《PostgreSQL数据库编译安装》,网址:http://www.sijitao.net/1535.html 。

搭建数据库之间的异步流复制环境,配置过程参考文章《PostgreSQL Streaming Replication流复制环境搭建》,网址:http://www.sijitao.net/1764.html 。

重要:测试之前一定要同步下主库和备库两台服务器的时间,不然会出现延迟时间不准备的情况。

测试步骤:

创建测试数据库和测试表,这里我用的德哥的测试模型,模拟用户登陆操作。

1、创建测试表

createtableuser_info
(useridint,engnametext,cnnametext,occupationtext,birthdaydate,signnametext,emailtext,qqnumeric,crt_timetimestampwithouttimezone,mod_timetimestampwithouttimezone
);

createtableuser_session
(useridint,logintimetimestamp(0)withouttimezone,login_countbigintdefault0,logouttimetimestamp(0)withouttimezone,online_intervalintervaldefaultinterval'0'
);

createtableuser_login_rec
(useridint,login_timetimestampwithouttimezone,ipinet
);

createtableuser_logout_rec
(useridint,logout_timetimestampwithouttimezone,ipinet
);

2、初始化测试数据

insertintouser_info(userid,engname,cnname,occupation,birthday,signname,email,qq,crt_time,mod_time)
selectgenerate_series(1,2000000),'zhangnq','章郎虫','DBA','1970-01-01',E'我就是章郎虫。','248687950@qq.com',248687950,clock_timestamp(),NULL;

insertintouser_session(userid)selectgenerate_series(1,2000000);

altertableuser_infoaddconstraintpk_user_infoprimarykey(userid);
altertableuser_sessionaddconstraintpk_user_sessionprimarykey(userid);

3、创建业务函数

--模拟用户登录的函数
createorreplacefunctionf_user_login
(i_useridint,OUTo_useridint,OUTo_engnametext,OUTo_cnnametext,OUTo_occupationtext,OUTo_birthdaydate,OUTo_signnametext,OUTo_emailtext,OUTo_qqnumeric
)
as$BODY$
declare
begin
selectuserid,qq
intoo_userid,o_engname,o_cnname,o_occupation,o_birthday,o_signname,o_email,o_qq
fromuser_infowhereuserid=i_userid;
insertintouser_login_rec(userid,login_time,ip)values(i_userid,now(),inet_client_addr());
updateuser_sessionsetlogintime=now(),login_count=login_count+1whereuserid=i_userid;
return;
end;
$BODY$
languageplpgsql;
--模拟用户退出的函数
createorreplacefunctionf_user_logout
(i_useridint,OUTo_resultint
)
as$BODY$
declare
begin
insertintouser_logout_rec(userid,logout_time,inet_client_addr());
updateuser_sessionsetlogouttime=now(),online_interval=online_interval+(now()-logintime)whereuserid=i_userid;
o_result:=0;
return;
exception
whenothersthen
o_result:=1;
return;
end;
$BODY$
languageplpgsql;

4、创建测试脚本

setrandomuserid12000000
SELECTf_user_login(:userid);

5、创建流复制时间延迟测试脚本

在备数据库中创建时间延迟测试的脚本,这里一起监测了备库的负载,网络流量和同步延迟时间,这里我测试了100次。

#!/bin/bash

exportPATH=/opt/PostgreSQL/93/bin:$PATH
exportPGDATA=/data/pgsql
exportPGHOME=/opt/PostgreSQL/93
exportPGPORT=5432

i=0
sql="
SELECT
CASE
WHENpg_last_xlog_receive_location()=pg_last_xlog_replay_location()THEN0
ELSEEXTRACT(EPOCHFROMnow()-pg_last_xact_replay_timestamp())
END
ASreplication_lag;"

while[$i-lt100]
do
echo-e"`/usr/bin/top-b-n1|sed-n'1p'|awk'{print+$(NF-2)}'`|c";echo-e`psql-t-A-c"$sql"-dzhangnq`"|c";/usr/bin/ifstat-ieth0-n11|awk'NR>2{print$1"KB/s"}'
leti=$i+1
done

6、开始测试

在主库使用pgbench对数据库施压。

pgbench-Mprepared-n-r-f./test.sql-h127.0.0.1-p5432-Upostgres-c64-j32-T300zhangnq

同时在备库上运行流复制延迟测试脚本,记录测试后的数值。

修改pgbench的连接数和线程数后测试多次,得到类似如下的结果。

postgres@ubuntu:~$./pglag_time.sh
0.24|28.444522|3833.48KB/s
0.24|28.442567|4260.23KB/s
0.24|28.442438|4676.84KB/s
0.3|0|5151.29KB/s
0.3|28.442349|5439.33KB/s
......
......

测试结果

同步延迟最大时间基本都是在8秒左右,连接并发数增大时延迟次数增加。

带宽使用使用量和连接并发数成正比关系。

系统负载在数据库连接并发数增加时没怎么变化,系统资源使用率不高。

接下来就可以优化或者可以把延迟数据添加进nagios监控了。

原文链接:http://www.sijitao.net/1860.html

参考网址:

http://blog.163.com/digoal@126/blog/static/163877040201221382150858/

https://vibhorkumar.wordpress.com/2014/05/21/monitoring-approach-for-streaming-replication-with-hot-standby-in-postgresql-9-3/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读