Skip to content

Commit 61c754f

Browse files
Update auto-cluster.yaml
1 parent daf2121 commit 61c754f

File tree

1 file changed

+219
-34
lines changed

1 file changed

+219
-34
lines changed

addons/auto-cluster.yaml

Lines changed: 219 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
type: update
22
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
44
logo: /images/postgres-70x70.png
55
name: PostgreSQL Primary-Secondary Auto-Cluster
66

@@ -10,77 +10,262 @@ nodeGroupAlias:
1010

1111
onInstall: init
1212

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+
1323
onAfterScaleOut[sqldb]:
24+
- copyPcpassFile
25+
- if ('${settings.is_pgpool2}' == 'true'):
26+
- adjustConfigs4PgpoolUser
1427
- getPswd
28+
- getNodes
1529
- forEach(event.response.nodes):
16-
initSlave:
17-
id: ${@i.id}
30+
initSecondary:
31+
id: ${@i.id}
1832
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
1968

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
2387
2488
onAfterClone:
2589
- script: delete MANIFEST.id; return {result:0, jps:MANIFEST};
2690
- install: ${response.jps}
2791
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.
31103

32104
onAfterMigrate:
33105
init:
34106
update: true
35107

36108
actions:
37109
init:
38-
#- env.control.AddContainerEnvVars[sqldb]:
39-
# vars: {"KEY_PASS":"${fn.password}"}
40110
- if (${settings.clone:false} || ${this.update:false}):
41111
- cmd[${nodes.sqldb.master.id}]: jcm removeAllReplicaHosts
112+
- getPswd
113+
- getNodes
42114
- forEach(nodes.sqldb):
43115
- if (${@i.id} != ${nodes.sqldb.master.id}):
44116
- cmd[${nodes.sqldb.master.id}]: |-
45117
jcm addReplicaHost ${@i.address} &>> /var/log/run.log
46118
sudo jem service reload
47119
- 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}
50122
sudo jem service restart
123+
- if ('${settings.is_pgpool2}' == 'true'):
124+
- cmd[pgpool]: jcm cleanupNodesFromPgpool2Conf &>>/var/log/run.log
125+
user: root
51126
- else:
52127
- setNodeDisplayName[${nodes.sqldb.master.id}]: Primary
53-
- getPswd
128+
- initPrimary
129+
- getNodes
54130
- forEach(nodes.sqldb):
55-
if (${@i.id} != ${nodes.sqldb.master.id}):
56-
initSlave:
131+
- if (${@i.id} != ${nodes.sqldb.master.id}):
132+
- initSecondary:
57133
id: ${@i.id}
58134
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+
60214
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
64216
- setGlobals:
65-
pswd: ${response.out}
66-
67-
initSlave:
217+
pswd: ${response.out}
218+
219+
initSecondary:
68220
- setNodeDisplayName[${this.id}]: Secondary
69221
- cmd[${nodes.sqldb.master.id}]: |-
70222
jcm addReplicaHost ${this.ip} &>> /var/log/run.log
71223
sudo jem service reload
72224
- cmd[${this.id}]: |-
73225
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
81227
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}
85241

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

Comments
 (0)