PostgreSQL數據庫流複製主庫和備庫之間的延遲時間是多少,不管對HA仍是負載均衡來講都應該作個評估。好比單純的HA架構,當主庫發生故障時,咱們容許多少時間內的數據丟失。不廢話,直接進入本次實驗測試。html
主庫:內存:32G,CPU:8核,IP:192.168.122.101ios
備庫:內存:32G,CPU:8核,IP:192.168.122.102sql
數據庫配置:默認數據庫
在兩臺服務器上安裝好PostgreSQL數據庫,安裝過程不清楚的能夠參考文章《PostgreSQL數據庫編譯安裝》,網址:http://www.sijitao.net/1535.html 。ubuntu
搭建數據庫之間的異步流複製環境,配置過程參考文章《PostgreSQL Streaming Replication流複製環境搭建》,網址:http://www.sijitao.net/1764.html 。bash
重要:測試以前必定要同步下主庫和備庫兩臺服務器的時間,否則會出現延遲時間不許備的狀況。服務器
建立測試數據庫和測試表,這裏我用的德哥的測試模型,模擬用戶登錄操做。網絡
create table user_info (userid int, engname text, cnname text, occupation text, birthday date, signname text, email text, qq numeric, crt_time timestamp without time zone, mod_time timestamp without time zone ); create table user_session (userid int, logintime timestamp(0) without time zone, login_count bigint default 0, logouttime timestamp(0) without time zone, online_interval interval default interval '0' ); create table user_login_rec (userid int, login_time timestamp without time zone, ip inet ); create table user_logout_rec (userid int, logout_time timestamp without time zone, ip inet );
insert into user_info (userid,engname,cnname,occupation,birthday,signname,email,qq,crt_time,mod_time) select generate_series(1,2000000), 'zhangnq', '章郎蟲', 'DBA', '1970-01-01' ,E'我就是章郎蟲。', '248687950@qq.com', 248687950, clock_timestamp(), NULL; insert into user_session (userid) select generate_series(1,2000000); alter table user_info add constraint pk_user_info primary key (userid); alter table user_session add constraint pk_user_session primary key (userid);
-- 模擬用戶登陸的函數 create or replace function f_user_login (i_userid int, OUT o_userid int, OUT o_engname text, OUT o_cnname text, OUT o_occupation text, OUT o_birthday date, OUT o_signname text, OUT o_email text, OUT o_qq numeric ) as $BODY$ declare begin select userid,engname,cnname,occupation,birthday,signname,email,qq into o_userid,o_engname,o_cnname,o_occupation,o_birthday,o_signname,o_email,o_qq from user_info where userid=i_userid; insert into user_login_rec (userid,login_time,ip) values (i_userid,now(),inet_client_addr()); update user_session set logintime=now(),login_count=login_count+1 where userid=i_userid; return; end; $BODY$ language plpgsql; -- 模擬用戶退出的函數 create or replace function f_user_logout (i_userid int, OUT o_result int ) as $BODY$ declare begin insert into user_logout_rec (userid,logout_time,ip) values (i_userid,now(),inet_client_addr()); update user_session set logouttime=now(),online_interval=online_interval+(now()-logintime) where userid=i_userid; o_result := 0; return; exception when others then o_result := 1; return; end; $BODY$ language plpgsql;
\setrandom userid 1 2000000 SELECT f_user_login(:userid);
在備數據庫中建立時間延遲測試的腳本,這裏一塊兒監測了備庫的負載,網絡流量和同步延遲時間,這裏我測試了100次。session
#!/bin/bash export PATH=/opt/PostgreSQL/93/bin:$PATH export PGDATA=/data/pgsql export PGHOME=/opt/PostgreSQL/93 export PGPORT=5432 i=0 sql=" SELECT CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location() THEN 0 ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp()) END AS replication_lag;" while [ $i -lt 100 ] do echo -e "`/usr/bin/top -b -n 1 |sed -n '1p' |awk '{print +$(NF-2)}'` | \c";echo -e `psql -t -A -c "$sql" -d zhangnq`" | \c";/usr/bin/ifstat -i eth0 -n 1 1 | awk 'NR>2 {print $1 " KB/s"}' let i=$i+1 done
在主庫使用pgbench對數據庫施壓。架構
pgbench -M prepared -n -r -f ./test.sql -h 127.0.0.1 -p 5432 -U postgres -c 64 -j 32 -T 300 zhangnq
同時在備庫上運行流複製延遲測試腳本,記錄測試後的數值。
修改pgbench的鏈接數和線程數後測試屢次,獲得相似以下的結果。
postgres@ubuntu:~$ ./pglag_time.sh 0.24 | 28.444522 | 3833.48 KB/s 0.24 | 28.442567 | 4260.23 KB/s 0.24 | 28.442438 | 4676.84 KB/s 0.3 | 0 | 5151.29 KB/s 0.3 | 28.442349 | 5439.33 KB/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/