pg_waldump example
[edozvola] / edozvola-dpavlin.txt
1 # instalirati etckeeper da čuva /etc/ direktorij u git-u\r
2 # (nije na produkcijskom enviromentu)\r
3 \r
4 yum install etckeeper\r
5 cd /etc/\r
6 git config --global user.email "dpavlin@rot13.org"\r
7 git config --global user.name "Dobrica Pavlinusic"\r
8 git commit -m base\r
9 \r
10 \r
11 PostgreSQL replikacija, wal shipping, streaming, host standby\r
12 \r
13 \r
14 https://www.postgresql.org/docs/9.6/static/warm-standby.html\r
15 \r
16 # napraviti ssh autorizaciju za postgresql korisnika bez passworda\r
17 \r
18 [root@edozvola-db-01 pgsql]# sudo -u postgres bash\r
19 bash-4.2$ pwd\r
20 /var/lib/pgsql\r
21 bash-4.2$ ssh-keygen\r
22 Generating public/private rsa key pair.\r
23 Enter file in which to save the key (/var/lib/pgsql/.ssh/id_rsa):\r
24 Created directory '/var/lib/pgsql/.ssh'.\r
25 Enter passphrase (empty for no passphrase):\r
26 Enter same passphrase again:\r
27 Your identification has been saved in /var/lib/pgsql/.ssh/id_rsa.\r
28 \r
29 \r
30 bash-4.2$ cp -v .ssh/id_rsa.pub .ssh/authorized_keys\r
31 ‘.ssh/id_rsa.pub’ -> ‘.ssh/authorized_keys’\r
32 \r
33 \r
34 ## prekopirati isti kljuc i authoriorized keys na slave:\r
35 \r
36 \r
37 [root@edozvola-db-01 pgsql]# rsync -rav .ssh edozvola-db-02:`pwd`\r
38 root@edozvola-db-02's password:\r
39 sending incremental file list\r
40 .ssh/\r
41 .ssh/id_rsa\r
42 .ssh/id_rsa.pub\r
43 .ssh/known_hosts\r
44 \r
45 \r
46 \r
47 \r
48 \r
49 \r
50 \r
51 \r
52 # kreirati testnu bazu i tablicu\r
53 \r
54 [root@edozvola-db-01 ~]# sudo -u postgres createdb test\r
55 [root@edozvola-db-01 ~]# sudo -u postgres psql test\r
56 test=# create table test1 ( id serial, a text, b int ) ;\r
57 test=# insert into test1 (a,b) values ('foo',42) ;\r
58 INSERT 0 1\r
59 test=# insert into test1 (a,b) values ('bar',1234) ;\r
60 INSERT 0 1\r
61 \r
62 \r
63 \r
64 # nfs share za wal fileove\r
65 \r
66 [root@edozvola-db-pgpool ~]# yum install nfs-utils nfs4-acl-tools\r
67 [root@edozvola-db-pgpool ~]# systemctl enable nfs-server.service\r
68 Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.\r
69 [root@edozvola-db-pgpool ~]# systemctl start nfs-server.service\r
70 \r
71 [root@edozvola-db-pgpool ~]# mkdir -p /shared/pgsql\r
72 [root@edozvola-db-pgpool ~]# chown postgres /shared/pgsql/\r
73 \r
74 [root@edozvola-db-pgpool ~]# vi /etc/exports\r
75 \r
76 [root@edozvola-db-pgpool ~]# cat /etc/exports\r
77 /shared/pgsql edozvola-db-01(rw,no_root_squash) edozvola-db-02(rw,no_root_squash)\r
78 \r
79 [root@edozvola-db-pgpool ~]# exportfs -va\r
80 exporting edozvola-db-01:/shared/pgsql\r
81 exporting edozvola-db-02:/shared/pgsql\r
82 \r
83 \r
84 \r
85 # mount na database serverima\r
86 \r
87 [root@edozvola-db-01 ~]# yum install nfs-utils nfs4-acl-tools\r
88 [root@edozvola-db-01 ~]# mkdir -p /shared/pgsql\r
89 [root@edozvola-db-01 ~]# vi /etc/fstab\r
90 \r
91 [root@edozvola-db-01 ~]# grep shared /etc/fstab\r
92 edozvola-db-pgpool:/shared/pgsql        /shared/pgsql   nfs     defaults        0 0\r
93 \r
94 [root@edozvola-db-01 ~]# mount /shared/pgsql/\r
95 \r
96 ## provjeriti da li postgresql korisnik moze pisati po nfs share-u\r
97 \r
98 [root@edozvola-db-01 ~]# sudo -u postgres touch /shared/pgsql/test-01\r
99 [root@edozvola-db-01 ~]# ls -al /shared/pgsql/test-01\r
100 -rw-r--r-- 1 postgres postgres 0 Aug 18 13:57 /shared/pgsql/test-01\r
101 [root@edozvola-db-01 ~]# rm -f /shared/pgsql/test-01\r
102 \r
103 ## isto ponoviti na edozvola-db-02!\r
104 \r
105 \r
106 \r
107 \r
108 \r
109 # podesiti wal archiving\r
110 \r
111 https://www.postgresql.org/docs/9.6/static/continuous-archiving.html\r
112 \r
113 \r
114 [root@edozvola-db-01 ~]# vi /var/lib/pgsql/9.6/data/postgresql.conf\r
115 wal_level = replica # same as hot_standby\r
116 \r
117 # https://www.postgresql.org/docs/9.6/static/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT\r
118 synchronous_commit = on\r
119 \r
120 archive_mode = on\r
121 archive_command = 'test ! -f /shared/pgsql/%f && cp %p /shared/pgsql/%f'\r
122 \r
123 max_wal_senders = 3 \r
124 max_replication_slots = 3\r
125 \r
126 hot_standby = on\r
127 \r
128 \r
129 [root@edozvola-db-01 ~]# systemctl restart postgresql-9.6.service\r
130 \r
131 \r
132 \r
133 # kreirati replication korisnika\r
134 \r
135 [root@edozvola-db-01 ~]# sudo -u postgres psql\r
136 \r
137 postgres=# create user replication with password 'replication123' login replication ;\r
138 CREATE ROLE\r
139 \r
140 \r
141 [root@edozvola-db-01 ~]# vi /var/lib/pgsql/9.6/data/pg_hba.conf\r
142 \r
143 \r
144 host    replication     replication     10.200.1.62/24          md5\r
145 \r
146 ## netmask je /24 da mozemo imati istu konfiguraciju na oba node-a\r
147 \r
148 \r
149 \r
150 \r
151 \r
152 # testirati replikaciju\r
153 [root@edozvola-db-01 ~]# sudo -u postgres psql test\r
154 test=# insert into test1 (a,b) values ('baz',3);\r
155 INSERT 0 1\r
156 \r
157 \r
158 \r
159 \r
160 napraviti slave instancu\r
161 db-01 => db-02\r
162 \r
163 \r
164 [root@edozvola-db-02 ~]# systemctl stop postgresql-9.6.service\r
165 \r
166 \r
167 \r
168 \r
169 [root@edozvola-db-01 data]# sudo -u postgres psql -c "select pg_start_backup('to-slave')"\r
170 \r
171 \r
172 [root@edozvola-db-01 data]# rsync -rav --delete /var/lib/pgsql/9.6/data/ edozvola-db-02:/var/lib/pgsql/9.6/data/\r
173 \r
174 \r
175 [root@edozvola-db-01 data]# sudo -u postgres psql -c "select pg_stop_backup()"\r
176 \r
177 \r
178 \r
179 \r
180 [root@edozvola-db-02 data]# cp ~/recovery.conf .\r
181 [root@edozvola-db-02 data]# chown postgres recovery.conf\r
182 \r
183 \r
184 [root@edozvola-db-02 data]# systemctl start postgresql-9.6.service\r
185 # ili ovo dolje za bolji debugging:\r
186 [root@edozvola-db-02 data]# sudo -u postgres /usr/pgsql-9.6/bin/pg_ctl --pgdata=/var/lib/pgsql/9.6/data start\r
187 server starting\r
188 \r
189 \r
190 promote slave to master\r
191 da bi svi podaci zavrsili na slave-u, na masteru je dobro izvrsiti komandu checkpoint\r
192 \r
193 \r
194 \r
195 \r
196 [root@edozvola-db-02 data]# sudo -u postgres /usr/pgsql-9.6/bin/pg_ctl --pgdata=/var/lib/pgsql/9.6/data promote\r
197 \r
198 \r
199 \r
200 \r
201 \r
202 \r
203 \r
204 \r
205 \r
206 \r
207 \r
208 \r
209 \r
210 \r
211 \r
212 \r
213 # recovery.conf\r
214 \r
215 [root@edozvola-db-02 ~]# cat recovery.conf\r
216 standby_mode = 'on'\r
217 primary_conninfo = 'host=10.200.1.61 port=5432 user=replication password=replication123'\r
218 restore_command = 'cp /shared/pgsql/%f %p'\r
219 archive_cleanup_command = 'pg_archivecleanup /shared/pgsql %r'\r
220 \r
221 \r
222 \r
223 \r
224 # skripte\r
225 \r
226 \r
227 [root@edozvola-db-01 pgsql]# pwd\r
228 /var/lib/pgsql\r
229 \r
230 \r
231 ## promoviranje slave-a u master\r
232 \r
233 [root@edozvola-db-01 pgsql]# cat promote-slave-to-master.sh\r
234 #!/bin/sh -xe\r
235 /usr/pgsql-9.6/bin/pg_ctl --pgdata=/var/lib/pgsql/9.6/data promote\r
236 \r
237 \r
238 ## kreiranje slave instance od mastera\r
239 \r
240 [root@edozvola-db-01 pgsql]# cat create-pgsql-slave.sh\r
241 #!/bin/sh -e\r
242 \r
243 # WARNING: this script depends that two database nodes have IPs which and in x1 and x2\r
244 # tr 12 21 does swap from currnet node number/ip to other one!\r
245 \r
246 test "`whoami`" != "postgres" && echo "$0 needs to be run as postgres user!" && exit 1\r
247 \r
248 here=`hostname -s`\r
249 there=`hostname -s | tr 12 21`\r
250 \r
251 my_ip=`ip addr | grep 10.200.1. | sed 's/^.*\(10\.200\.1\.[0-9]*\)\/.*$/\1/'`\r
252 other_ip=`echo $my_ip | tr 12 21`\r
253 \r
254 echo "Create slave on $here $my_ip using data from master on $there $other_ip"\r
255 echo "[enter] to start"\r
256 read\r
257 \r
258 #systemctl stop postgresql-9.6.service || true\r
259 /usr/pgsql-9.6/bin/pg_ctl --pgdata=/var/lib/pgsql/9.6/data stop || true\r
260 \r
261 echo "select pg_start_backup('slave')" | ssh $there psql\r
262 \r
263 rsync -rav --delete --exclude pg_xlog $there:/var/lib/pgsql/9.6/data/ /var/lib/pgsql/9.6/data/\r
264 \r
265 echo "select pg_stop_backup()" | ssh $there psql\r
266 \r
267 test -e /var/lib/pgsql/9.6/data/recovery.done || ( echo "ERROR: no recovery.done !" && exit 1 )\r
268 cat /var/lib/pgsql/9.6/data/recovery.done | sed -e s/$my_ip/$other_ip/ > /var/lib/pgsql/9.6/data/recovery.conf\r
269 \r
270 \r
271 \r
272 \r
273 #systemctl start postgresql-9.6.service\r
274 /usr/pgsql-9.6/bin/pg_ctl --pgdata=/var/lib/pgsql/9.6/data start\r
275 \r
276 \r
277 \r
278 \r
279 \r
280 \r