1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#!/usr/bin/perl
#
# slony replication setup
#
# usage: slony-setup freesideuser
use strict;
use DBI;
use FS::UID qw(adminsuidsetup);
use FS::Record qw(dbdef);
my $user = shift or die "usage: slony-setup username\n";
adminsuidsetup($user);
#---
my $MASTERHOST = '192.168.20.10';
my $SLAVEHOST = '192.168.20.50';
#my $REPLICATIONUSER='pgsql';
my $REPLICATIONUSER='postgres';
#--------
print <<END;
#on slave:
useradd freeside
cp -pr /etc/skel /home/freeside
chown -R freeside /home/freeside
su postgres -c 'createuser freeside' #n y n
su freeside -c 'createdb freeside'
#on master:
su postgres -c 'createlang plpgsql freeside'
pg_dump -s -U $REPLICATIONUSER -h $MASTERHOST freeside | psql -U $REPLICATIONUSER -h $SLAVEHOST freeside
END
#--------
#drop set ( id = 1, origin = 1);
print <<END;
#on master:
slonik <<_EOF_
cluster name = freeside;
node 1 admin conninfo = 'dbname=freeside host=$MASTERHOST user=$REPLICATIONUSER';
node 2 admin conninfo = 'dbname=freeside host=$SLAVEHOST user=$REPLICATIONUSER';
init cluster ( id=1, comment = 'Master Node');
create set (id=1, origin=1, comment='All freeside tables');
END
my $id = 1;
foreach my $table ( dbdef->tables ) {
#next if $table =~ /^sql_/i;
print "set add table (set id=1, origin=1, id=". $id++. ", fully qualified name = 'public.$table' );\n";
}
print <<END;
store node (id=2, comment = 'Slave node');
store path (server = 1, client = 2, conninfo='dbname=freeside host=$MASTERHOST user=$REPLICATIONUSER');
store path (server = 2, client = 1, conninfo='dbname=freeside host=$SLAVEHOST user=$REPLICATIONUSER');
store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);
_EOF_
END
print <<END;
### start slon processes (both machines) (this is debian-specific)
mkdir /etc/slony1/freeside
cat >/etc/slony1/freeside/slon.conf <<_EOF_
# Set the cluster name that this instance of slon is running against
# default is to read it off the command line
cluster_name='freeside'
# Set slon's connection info, default is to read it off the command line
conn_info='host=localhost port=5432 dbname=freeside user=postgres'
_EOF_
/etc/init.d/slony1 start
END
print <<END;
#on master:
slonik <<_EOF_
cluster name = freeside;
node 1 admin conninfo = 'dbname=freeside host=$MASTERHOST user=$REPLICATIONUSER';
node 2 admin conninfo = 'dbname=freeside host=$SLAVEHOST user=$REPLICATIONUSER';
subscribe set ( id = 1, provider = 1, receiver = 2, forward = no);
_EOF_
END
|