1
1
type : update
2
2
id : postgres-master-slave-auto-cluster
3
- baseUrl : https://raw.githubusercontent.com/jelastic-jps /postgres/master
3
+ baseUrl : https://raw.githubusercontent.com/DmytroZubelevych /postgres/v2.0.0
4
4
logo : /images/postgres-70x70.png
5
5
name : PostgreSQL Primary-Secondary Auto-Cluster
6
6
@@ -10,77 +10,262 @@ nodeGroupAlias:
10
10
11
11
onInstall : init
12
12
13
+ globals :
14
+ pgpoolintpass : ${settings.pgpoolintpass:[fn.password]}
15
+ postgresqlConf : ' /var/lib/pgsql/data/postgresql.conf'
16
+
17
+ onAfterResetServicePassword[sqldb] :
18
+ - copyPcpassFile
19
+
20
+ onAfterResetNodePassword[sqldb] :
21
+ - copyPcpassFile
22
+
13
23
onAfterScaleOut[sqldb] :
24
+ - copyPcpassFile
25
+ - if ('${settings.is_pgpool2}' == 'true') :
26
+ - adjustConfigs4PgpoolUser
14
27
- getPswd
28
+ - getNodes
15
29
- forEach(event.response.nodes) :
16
- initSlave :
17
- id : ${@i.id}
30
+ initSecondary :
31
+ id : ${@i.id}
18
32
ip : ${@i.address}
33
+ - forEach(nodes.sqldb) :
34
+ if (${@i.id} != ${nodes.sqldb.master.id}) :
35
+ cmd[${@i.id}] : jcm updateHbaConf ${globals.nodes_address} ${@i.address}
36
+ - if ('${settings.is_pgpool2}' == 'true') :
37
+ - forEach(event.response.nodes) :
38
+ - addPgNodesToPgPool :
39
+ pgaddress : ${@i.address}
40
+ - forEach(pgpoolnode:nodes.pgpool) :
41
+ - generateAndTransferSSHKeys :
42
+ id : ${@pgpoolnode.id}
43
+ - addToKnownHosts
44
+
45
+ onBeforeScaleIn[pgpool] :
46
+ - forEach(pgpoolnode:event.response.nodes) :
47
+ - removeWatchdogConfig :
48
+ pgpoolAddress : ${@pgpoolnode.address}
49
+ - cmd[sqldb] : sed -ci -e '/${@pgpoolnode.address}/d' /var/lib/pgsql/data/pg_hba.conf;
50
+ - cmd[sqldb,pgpool] : jem service restart
51
+
52
+ onAfterScaleOut[pgpool] :
53
+ - preparePgpoolNodes
54
+ - cmd[${event.response.nodes.join(id,)}] : rm -f ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
55
+ - forEach(pgpoolnode:event.response.nodes) :
56
+ - generateAndTransferSSHKeys :
57
+ id : ${@pgpoolnode.id}
58
+ - cmd[pgpool] : jcm enableWatchdog
59
+ user : root
60
+ - forEach(pgpoolnode:nodes.pgpool) :
61
+ - cmd[sqldb] : grep -q '${@pgpoolnode.address}' /var/lib/pgsql/data/pg_hba.conf || sed -ci -e '1i host all pgpool ${@pgpoolnode.address}/32 trust' /var/lib/pgsql/data/pg_hba.conf;
62
+ - getPgPoolNodesCount
63
+ - setPgpoolNodeId :
64
+ pgPoolNode : ${@pgpoolnode.id}
65
+ - addWatchdogConfig :
66
+ pgpoolAddress : ${@pgpoolnode.address}
67
+ - addToKnownHosts
19
68
20
- onBeforeScaleIn[sqldb] :
21
- - forEach(event.response.nodes) :
22
- cmd[${nodes.sqldb.master.id}] : jcm removeReplicaHost ${@i.address}
69
+ onAfterScaleIn[sqldb] :
70
+ - getNodes
71
+ - forEach(nodes.sqldb) :
72
+ cmd[${@i.id}] : jcm updateHbaConf ${globals.nodes_address} ${@i.address}
73
+ - if ('${settings.is_pgpool2}' == 'true') :
74
+ - forEach(event.response.nodes) :
75
+ - removePgNodesFromPgPool :
76
+ pgaddress : ${@i.address}
77
+
78
+ onAfterScaleIn[pgpool] :
79
+ - if (nodes.pgpool.length == 1) :
80
+ - cmd[pgpool] : jcm disableWatchdog
81
+ - removeWatchdogConfig :
82
+ pgpoolAddress : ${nodes.pgpool.master.address}
83
+ - cmd[pgpool] : |-
84
+ rm -f /etc/pgpool-II/pgpool_node_id
85
+ sed -ci -e 's/use_watchdog/#use_watchdog/' /etc/pgpool-II/pgpool.conf
86
+ jem service restart
23
87
24
88
onAfterClone :
25
89
- script : delete MANIFEST.id; return {result:0, jps:MANIFEST};
26
90
- install : ${response.jps}
27
91
envName : ${event.response.env.envName}
28
- settings :
29
- nodeGroup : ${settings.nodeGroup}
30
- clone : true
92
+ settings :
93
+ pgpoolintpass : ${settings.pgpoolintpass}
94
+ nodeGroup : ${settings.nodeGroup}
95
+ is_pgpool2 : ${settings.is_pgpool2}
96
+ clone : true
97
+
98
+ onBeforeMigrate :
99
+ if (${env.status} != 1) :
100
+ stopEvent :
101
+ type : warning
102
+ message : Migration of stopped PostgreSQL Primary-Secondary Auto-Cluster is not supported.
31
103
32
104
onAfterMigrate :
33
105
init :
34
106
update : true
35
107
36
108
actions :
37
109
init :
38
- # - env.control.AddContainerEnvVars[sqldb]:
39
- # vars: {"KEY_PASS":"${fn.password}"}
40
110
- if (${settings.clone:false} || ${this.update:false}) :
41
111
- cmd[${nodes.sqldb.master.id}] : jcm removeAllReplicaHosts
112
+ - getPswd
113
+ - getNodes
42
114
- forEach(nodes.sqldb) :
43
115
- if (${@i.id} != ${nodes.sqldb.master.id}) :
44
116
- cmd[${nodes.sqldb.master.id}] : |-
45
117
jcm addReplicaHost ${@i.address} &>> /var/log/run.log
46
118
sudo jem service reload
47
119
- cmd[${@i.id}] : |-
48
- # jcm updateReplicaHost ${nodes.sqldb.master.address} &>> /var/log/run.log
49
- jcm updatePrimaryConnInfo &>> /var/log/run.log
120
+ jcm updatePrimaryConnInfo &>>/var/log/run.log
121
+ jcm updateHbaConf ${globals.nodes_address} ${@i.address}
50
122
sudo jem service restart
123
+ - if ('${settings.is_pgpool2}' == 'true') :
124
+ - cmd[pgpool] : jcm cleanupNodesFromPgpool2Conf &>>/var/log/run.log
125
+ user : root
51
126
- else :
52
127
- setNodeDisplayName[${nodes.sqldb.master.id}] : Primary
53
- - getPswd
128
+ - initPrimary
129
+ - getNodes
54
130
- forEach(nodes.sqldb) :
55
- if (${@i.id} != ${nodes.sqldb.master.id}) :
56
- initSlave :
131
+ - if (${@i.id} != ${nodes.sqldb.master.id}) :
132
+ - initSecondary :
57
133
id : ${@i.id}
58
134
ip : ${@i.address}
59
-
135
+ - cmd[${@i.id}] : |-
136
+ jcm updateHbaConf ${globals.nodes_address} ${@i.address}
137
+ sudo jem service reload
138
+ - copyPcpassFile
139
+ - if ('${settings.is_pgpool2}' == 'true') :
140
+ - adjustConfigs4PgpoolUser
141
+ - cmd[${nodes.sqldb.master.id}] : |-
142
+ psql -U webadmin -d postgres -c "CREATE USER pgpool REPLICATION LOGIN CONNECTION LIMIT -1 ENCRYPTED PASSWORD '${globals.pgpoolintpass}';"
143
+ - preparePgpoolNodes
144
+ - forEach(nodes.sqldb) :
145
+ - addPgNodesToPgPool :
146
+ pgaddress : ${@i.address}
147
+ - forEach(pgpoolnode:nodes.pgpool) :
148
+ - generateAndTransferSSHKeys :
149
+ id : ${@pgpoolnode.id}
150
+ - cmd[sqldb] : sed -ci -e '1i host all pgpool ${@pgpoolnode.address}/32 trust' /var/lib/pgsql/data/pg_hba.conf;
151
+ - if (nodes.pgpool.length > 1) :
152
+ - cmd[pgpool] : jcm enableWatchdog
153
+ user : root
154
+ - forEach(pgpoolnode:nodes.pgpool) :
155
+ - getPgPoolNodesCount
156
+ - setPgpoolNodeId :
157
+ pgPoolNode : ${@pgpoolnode.id}
158
+ - addWatchdogConfig :
159
+ pgpoolAddress : ${@pgpoolnode.address}
160
+ - cmd[sqldb] : jem service restart
161
+ - cmd[pgpool] : jem service restart
162
+ - cmd[${nodes.pgpool.master.id}] : cat /var/lib/pgsql/.pcppass |awk -F ':' '{print $4}'
163
+ - setGlobals :
164
+ pgpoolPasswd : ' ${response.out}'
165
+ successPath : /text/success-pgpool.md?_r=${fn.random}
166
+ - else :
167
+ - setGlobals :
168
+ successPath : /text/success.md?_r=${fn.random}
169
+
170
+ addToKnownHosts :
171
+ - forEach(pgnode:nodes.sqldb) :
172
+ - cmd[pgpool] : |-
173
+ ssh-keygen -R ${@pgnode.address}
174
+ ssh-keyscan ${@pgnode.address} 2>&1 1>> ~/.ssh/known_hosts
175
+
176
+ copyPcpassFile :
177
+ - cmd[${nodes.sqldb.master.id}] : cat /var/lib/pgsql/.pgpass
178
+ - cmd[sqldb] : echo '${response.out}' > /var/lib/pgsql/.pgpass
179
+
180
+ generateAndTransferSSHKeys :
181
+ - cmd[${this.id}] : |-
182
+ [ -f "/var/lib/pgsql/.ssh/id_rsa.pub" ] || ssh-keygen -q -t rsa -N '' <<< $'\ny'
183
+ - cmd[${this.id}] : |-
184
+ cat /var/lib/pgsql/.ssh/id_rsa.pub
185
+ - cmd[sqldb] :
186
+ grep -q '${response.out}' /var/lib/pgsql/.ssh/authorized_keys || echo '${response.out}' >> /var/lib/pgsql/.ssh/authorized_keys
187
+
188
+ preparePgpoolNodes :
189
+ - cmd[pgpool] : |-
190
+ pg_md5 --md5auth --username=pgpool ${globals.pgpoolintpass}
191
+ chown -R postgres:postgres /etc/pgpool-II
192
+ user: root
193
+
194
+ adjustConfigs4PgpoolUser :
195
+ - cmd[sqldb] : |-
196
+ jem service stop;
197
+ source /etc/jelastic/metainf.conf;
198
+ if [ "$COMPUTE_TYPE_VERSION" -ge "14" ] ; then
199
+ sed -ci -e 's|#password_encryption.*|password_encryption = md5|' ${globals.postgresqlConf}
200
+ fi
201
+ if [ "$COMPUTE_TYPE_VERSION" -ge "13" ] ; then
202
+ echo 'wal_keep_size = 1024' >> ${globals.postgresqlConf}
203
+ else
204
+ echo "wal_keep_segments = 128" >> ${globals.postgresqlConf}
205
+ fi
206
+ grep -q "^wal_log_hints" ${globals.postgresqlConf} || echo 'wal_log_hints = on' >> ${globals.postgresqlConf};
207
+ jem service start;
208
+ user: root
209
+
210
+ initPrimary :
211
+ - cmd[${nodes.sqldb.master.id}] : jcm initPrimary &>> /var/log/run.log
212
+ - getPswd
213
+
60
214
getPswd :
61
- - cmd[${nodes.sqldb.master.id}] : |-
62
- jcm initMaster &>> /var/log/run.log
63
- jcm getPswd
215
+ - cmd[${nodes.sqldb.master.id}] : jcm getPswd
64
216
- setGlobals :
65
- pswd : ${response.out}
66
-
67
- initSlave :
217
+ pswd : ${response.out}
218
+
219
+ initSecondary :
68
220
- setNodeDisplayName[${this.id}] : Secondary
69
221
- cmd[${nodes.sqldb.master.id}] : |-
70
222
jcm addReplicaHost ${this.ip} &>> /var/log/run.log
71
223
sudo jem service reload
72
224
- cmd[${this.id}] : |-
73
225
jcm setPswd ${globals.pswd}
74
- jcm initSlave ${nodes.sqldb.master.address} &>> /var/log/run.log
75
-
76
- startPage : ${nodes.sqldb.master.url}
77
- success : |
78
- **Admin Panel**: [${nodes.sqldb.master.url}](${nodes.sqldb.master.url})
79
- **User**: webadmin
80
- **Password**: ${globals.pswd}
226
+ jcm initSecondary &>> /var/log/run.log
81
227
82
- * [Database Replication with PostgreSQL](https://docs.jelastic.com/postgresql-database-replication/)
83
- * [Remote Access to PostgreSQL](https://docs.jelastic.com/remote-access-postgres/)
84
- * [Import and Export Dump to PostgreSQL](https://docs.jelastic.com/dump-postgres/)
228
+ getNodes :
229
+ - script : |
230
+ var resp = jelastic.env.control.GetEnvInfo('${env.envName}', session);
231
+ if (resp.result != 0) return resp;
232
+ var nodes_address = [];
233
+ for (var l = 0, k = resp.nodes; l < k.length; l++) {
234
+ if (k[l].nodeGroup == 'sqldb') {
235
+ nodes_address.push(k[l].address);
236
+ }
237
+ }
238
+ return { result: 0, nodes_address: nodes_address.join(",") }
239
+ - setGlobals :
240
+ nodes_address : ${response.nodes_address}
85
241
86
-
242
+ addPgNodesToPgPool :
243
+ - forEach(pgpoolnode:nodes.pgpool) :
244
+ - cmd[${@pgpoolnode.id}] : jcm addPgNodeToPgpool2Conf ${this.pgaddress} &>>/var/log/run.log
245
+
246
+ removePgNodesFromPgPool :
247
+ - forEach(pgpoolnode:nodes.pgpool) :
248
+ - cmd[${@pgpoolnode.id}] : jcm removePgNodeFromPgpool2Conf ${this.pgaddress} &>>/var/log/run.log
249
+ user : root
250
+
251
+ getPgPoolNodesCount :
252
+ - cmd[${nodes.pgpool.master.id}] : grep '^wd_port[0-9]*' /etc/pgpool-II/pgpool.conf|wc -l
253
+ - setGlobals :
254
+ pgPoolCount : ${response.out}
255
+
256
+ setPgpoolNodeId :
257
+ - cmd[${this.pgPoolNode}] : let PGPOOLCOUNT='${globals.pgPoolCount}+1'; [ -f "/etc/pgpool-II/pgpool_node_id" ] || jcm setPgpoolNodeId $PGPOOLCOUNT
258
+ user : root
259
+
260
+ addWatchdogConfig :
261
+ - cmd[pgpool] : let PGPOOLCOUNT='${globals.pgPoolCount}+1'; jcm addWatchdogConfig $PGPOOLCOUNT ${this.pgpoolAddress}
262
+ user : root
263
+
264
+ removeWatchdogConfig :
265
+ - cmd[pgpool] : jcm removeWatchdogConfig ${this.pgpoolAddress}
266
+ user : root
267
+
268
+ startPage : ${nodes.sqldb.master.url}
269
+ success :
270
+ email : ${globals.successPath}
271
+ text : ${globals.successPath}
0 commit comments