Re: [HACKERS] Logical Replication WIP - Mailing list pgsql-hackers
| From | Erik Rijkers |
|---|---|
| Subject | Re: [HACKERS] Logical Replication WIP |
| Date | |
| Msg-id | 5046ac88cc78e04753ba7c81e1a6523f@xs4all.nl Whole thread Raw |
| In response to | Re: [HACKERS] Logical Replication WIP (Erik Rijkers <er@xs4all.nl>) |
| Responses |
Re: [HACKERS] Logical Replication WIP
|
| List | pgsql-hackers |
On 2016-12-19 08:04, Erik Rijkers wrote:
> On 2016-12-18 11:12, Petr Jelinek wrote:
>
> (now using latest: patchset:)
>
> 0001-Add-PUBLICATION-catalogs-and-DDL-v14.patch
> 0002-Add-SUBSCRIPTION-catalog-and-DDL-v14.patch
> 0003-Define-logical-replication-protocol-and-output-plugi-v14.patch
> 0004-Add-logical-replication-workers-v14.patch
> 0005-Add-separate-synchronous-commit-control-for-logical--v14.patch
>
> Sometimes replication (caused by a pgbench run) runs for a few
> seconds replicating all 4 pgbench tables correctly, but never longer
> than 10 to 20 seconds.
>
I've concocted pgbench_derail.sh. It assumes 2 instances running,
initially without the publication and subsciption.
There are two separate installations, on the same machine.
To startup the two instances I use instance.sh:
# ./instances.sh
#!/bin/sh
port1=6972
port2=6973
project1=logical_replication
project2=logical_replication2
pg_stuff_dir=$HOME/pg_stuff
PATH1=$pg_stuff_dir/pg_installations/pgsql.$project1/bin:$PATH
PATH2=$pg_stuff_dir/pg_installations/pgsql.$project2/bin:$PATH
server_dir1=$pg_stuff_dir/pg_installations/pgsql.$project1
server_dir2=$pg_stuff_dir/pg_installations/pgsql.$project2
data_dir1=$server_dir1/data
data_dir2=$server_dir2/data
options1="
-c wal_level=logical
-c max_replication_slots=10
-c max_worker_processes=12
-c max_logical_replication_workers=10
-c max_wal_senders=10
-c logging_collector=on
-c log_directory=$server_dir1
-c log_filename=logfile.${project1} "
options2="
-c wal_level=replica
-c max_replication_slots=10
-c max_worker_processes=12
-c max_logical_replication_workers=10
-c max_wal_senders=10
-c logging_collector=on
-c log_directory=$server_dir2
-c log_filename=logfile.${project2} "
which postgres
export PATH=$PATH1; postgres -D $data_dir1 -p $port1 ${options1} &
export PATH=$PATH2; postgres -D $data_dir2 -p $port2 ${options2} &
# end ./instances.sh
#--- pgbench_derail.sh
#!/bin/sh
# assumes both instances are running
# clear logs
# echo >
$HOME/pg_stuff/pg_installations/pgsql.logical_replication/logfile.logical_replication
# echo >
$HOME/pg_stuff/pg_installations/pgsql.logical_replication2/logfile.logical_replication2
port1=6972
port2=6973
function cb()
{ # display the 4 pgbench tables' accumulated content as md5s # a,b,t,h stand for: pgbench_accounts, -branches,
-tellers,-history for port in $port1 $port2 do md5_a=$(echo "select * from pgbench_accounts order by aid"
|psql -qtAXp$port|md5sum|cut -b 1-9) md5_b=$(echo "select * from pgbench_branches order by bid"
|psql -qtAXp$port|md5sum|cut -b 1-9) md5_t=$(echo "select * from pgbench_tellers order by tid"
|psql -qtAXp$port|md5sum|cut -b 1-9) md5_h=$(echo "select * from pgbench_history order by
aid,bid,tid"|psql -qtAXp$port|md5sum|cut -b 1-9) cnt_a=$(echo "select count(*) from pgbench_accounts"|psql -qtAXp
$port) cnt_b=$(echo "select count(*) from pgbench_branches"|psql -qtAXp
$port) cnt_t=$(echo "select count(*) from pgbench_tellers" |psql -qtAXp
$port) cnt_h=$(echo "select count(*) from pgbench_history" |psql -qtAXp
$port) printf "$port a,b,t,h: %6d %6d %6d %6d" $cnt_a $cnt_b $cnt_t
$cnt_h echo -n " $md5_a $md5_b $md5_t $md5_h" if [[ $port -eq $port1 ]]; then echo " master" elif [[
$port-eq $port2 ]]; then echo " replica" else echo " ERROR" fi done
}
echo "
drop table if exists pgbench_accounts;
drop table if exists pgbench_branches;
drop table if exists pgbench_tellers;
drop table if exists pgbench_history;" | psql -X -p $port1 \ && echo "
drop table if exists pgbench_accounts;
drop table if exists pgbench_branches;
drop table if exists pgbench_tellers;
drop table if exists pgbench_history;" | psql -X -p $port2 \ && pgbench -p $port1 -qis 1 \ && echo "alter table
pgbench_historyreplica identity full;" | psql
-1p $port1 \ && pg_dump -F c -p $port1 \ -t pgbench_accounts \ -t pgbench_branches \ -t
pgbench_tellers \ -t pgbench_history \ | pg_restore -p $port2 -d testdb
echo "$(cb)"
sleep 2
echo "$(cb)"
echo "create publication pub1 for all tables;" | psql -p $port1 -aqtAX
echo "
create subscription sub1 connection 'port=${port1}' publication pub1 with (disabled);
alter subscription sub1 enable;
" | psql -p $port2 -aqtAX
#------------------------------------
# repeat a short (10 s) pgbench-un to show that during such
# short runs the logical replication often remains intact.
# Longer pgbench-runs always derail the logrep of one or more
# of these 4 table
#
# bug: pgbench_history no longer replicates
# sometimes also the other 3 table de-synced.
echo "$(cb)"
echo "-- pgbench -c 1 -T 10 -P 5 (short run, first)" pgbench -c 1 -T 10 -P 5
sleep 2
echo "$(cb)"
echo "-- pgbench -c 1 -T 10 -P 5 (short run, second)" pgbench -c 1 -T 10 -P 5
sleep 2
echo "$(cb)"
echo "-- pgbench -c 1 -T 120 -P 15 (long run)" pgbench -c 1 -T 120 -P 15
sleep 2
echo "-- 60 second (1)"
echo "$(cb)"
#--- end pgbench_derail.sh
(Sorry for the messy bash.)
thanks,
Erik Rijkers
pgsql-hackers by date: