Skip to content

Commit 44d6d72

Browse files
authored
Add multisite support, update to PG17 and use Patroni 4
2 parents b616726 + 279e434 commit 44d6d72

9 files changed

Lines changed: 90 additions & 40 deletions

File tree

Makefile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ CONTAINERIMAGE ?= rockylinux/rockylinux:9-ubi-micro
66
IMAGE_REPOSITORY ?= docker.io
77
IMAGE_PATH ?= cybertec-pg-container
88
CONTAINERSUITE ?= cybertec-pg-container
9-
PGVERSION ?= 16
10-
PGVERSION_FULL ?= 16.3
11-
OLD_PG_VERSIONS ?= 13 14 15
12-
PATRONI_VERSION ?= 3.3.1
9+
PGVERSION ?= 17
10+
PGVERSION_FULL ?= 17.0
11+
OLD_PG_VERSIONS ?= 13 14 15 16
12+
PATRONI_VERSION ?= multisite-4.0.2.1
1313
PGBACKREST_VERSION ?= 2.53
1414
POSTGIS_VERSION ?= 34
1515
ETCD_VERSION ?= 3.5.15
1616
PACKAGER ?= dnf
17-
BUILD ?= 1
17+
BUILD ?= 2
1818
ARCH ?= amd64
1919
IMAGE_TAG ?= $(BASEOS)-$(PGVERSION_FULL)-$(BUILD)
2020
POSTGIS_IMAGE_TAG ?= $(BASEOS)-$(PGVERSION_FULL)-$(POSTGIS_VERSION)-$(BUILD)
@@ -198,4 +198,4 @@ publicbeta-pgbackrest-build:
198198
--build-arg PGVERSION=$(BETAVERSION) \
199199
--build-arg ARCH=$(ARCH)
200200

201-
publicbeta-pgbackrest: publicbeta-pgbackrest-build;
201+
publicbeta-pgbackrest: publicbeta-pgbackrest-build;

docker/postgres-gis/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,4 @@ ENTRYPOINT ["/scripts/nss_wrapper/nss_wrapper.sh"]
198198

199199
USER 26
200200

201-
CMD ["/bin/sh", "/launch.sh", "init"]
201+
CMD ["/bin/sh", "/launch.sh", "init"]

docker/postgres/Dockerfile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ RUN wget https://smarden.org/runit/runit-2.1.2.tar.gz -P /package/
7272
#&& curl -sL https://github.com/zalando-pg/pg_auth_mon/archive/$PG_AUTH_MON_COMMIT.tar.gz | tar xz \
7373

7474
RUN pip3 install 'PyYAML<6.0' setuptools pystache loader kazoo meld3 boto python-etcd psutil requests cdiff ydiff --upgrade \
75-
&& pip3 install patroni[kubernetes$EXTRAS]==$PATRONI_VERSION --upgrade \
75+
&& if [[ $PATRONI_VERSION == "multisite-"* ]]; then \
76+
git clone -b $PATRONI_VERSION https://github.com/cybertec-postgresql/patroni; \
77+
pip3 install ./patroni[kubernetes,etcd,etcd3]; \
78+
else \
79+
pip3 install patroni[kubernetes$EXTRAS]==$PATRONI_VERSION --upgrade; \
80+
fi \
7681
&& mkdir /usr/lib/postgresql \
7782
&& git clone -b $PG_PERMISSIONS https://github.com/cybertec-postgresql/pg_permissions.git \
7883
&& git clone -b $SET_USER https://github.com/pgaudit/set_user.git \
@@ -195,4 +200,4 @@ ENTRYPOINT ["/scripts/nss_wrapper/nss_wrapper.sh"]
195200

196201
USER 26
197202

198-
CMD ["/bin/sh", "/launch.sh", "init"]
203+
CMD ["/bin/sh", "/launch.sh", "init"]

scripts/callback_aws.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def main():
6565

6666
ec2 = boto.ec2.connect_to_region(metadata['region'])
6767

68-
if argc == 5 and role in ('master', 'standby_leader') and action in ('on_start', 'on_role_change'):
68+
if argc == 5 and role in ('primary', 'master', 'standby_leader') and action in ('on_start', 'on_role_change'):
6969
associate_address(ec2, sys.argv[1], instance_id)
7070

7171
instance = get_instance(ec2, instance_id)

scripts/callback_role.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def record_role_change(action, new_role, cluster):
7878
new_role = None if action == 'on_stop' else new_role
7979
logger.debug("Changing the pod's role to %s", new_role)
8080
pod_namespace = os.environ.get('POD_NAMESPACE', read_first_line(KUBE_NAMESPACE_FILENAME)) or 'default'
81-
if new_role == 'master':
81+
if new_role in ['master', 'primary']:
8282
change_endpoints(pod_namespace, cluster)
8383
change_pod_role_label(pod_namespace, new_role)
8484

scripts/configure_spilo.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def deep_update(a, b):
383383
threshold_megabytes: {{WALE_BACKUP_THRESHOLD_MEGABYTES}}
384384
threshold_backup_size_percentage: {{WALE_BACKUP_THRESHOLD_PERCENTAGE}}
385385
retries: 2
386-
no_master: 1
386+
no_leader: 1
387387
{{/USE_WALE}}
388388
basebackup_fast_xlog:
389389
command: /scripts/basebackup.sh
@@ -394,8 +394,36 @@ def deep_update(a, b):
394394
threshold_megabytes: {{WALE_BACKUP_THRESHOLD_MEGABYTES}}
395395
threshold_backup_size_percentage: {{WALE_BACKUP_THRESHOLD_PERCENTAGE}}
396396
retries: 2
397-
no_master: 1
397+
no_leader: 1
398398
{{/STANDBY_WITH_WALE}}
399+
{{#USE_MULTISITE}}
400+
multisite:
401+
name: '{{MULTISITE_SITE}}-{{SCOPE}}'
402+
namespace: {{MULTISITE_NAMESPACE}}
403+
etcd3:
404+
hosts: {{MULTISITE_ETCD_HOSTS}}
405+
{{#MULTISITE_ETCD_USER}}
406+
username: {{MULTISITE_ETCD_USER}}
407+
{{/MULTISITE_ETCD_USER}}
408+
{{#MULTISITE_ETCD_PASSWORD}}
409+
password: {{MULTISITE_ETCD_PASSWORD}}
410+
{{/MULTISITE_ETCD_PASSWORD}}
411+
{{#MULTISITE_ETCD_PROTOCOL}}
412+
protocol: {{MULTISITE_ETCD_PROTOCOL}}
413+
{{/MULTISITE_ETCD_PROTOCOL}}
414+
host: {{EXTERNAL_HOST}}
415+
port: {{EXTERNAL_PORT}}
416+
ttl: {{MULTISITE_TTL}}
417+
retry_timeout: {{MULTISITE_RETRY_TIMEOUT}}
418+
{{#UPDATE_CRD}}
419+
update_crd: "{{UPDATE_CRD}}"
420+
crd_uid: {{CRD_UID}}
421+
crd_api: cpo.opensource.cybertec.at/v1
422+
{{/UPDATE_CRD}}
423+
{{/USE_MULTISITE}}
424+
425+
watchdog:
426+
mode: off
399427
'''
400428

401429

@@ -717,6 +745,20 @@ def get_placeholders(provider):
717745
if placeholders.get('SSL_RESTAPI_CA') and not placeholders['SSL_RESTAPI_CA_FILE']:
718746
placeholders['SSL_RESTAPI_CA_FILE'] = os.path.join(placeholders['RW_DIR'], 'certs', 'rest-api-ca.crt')
719747

748+
placeholders.setdefault('MULTISITE_SITE', '')
749+
placeholders.setdefault('MULTISITE_ETCD_HOSTS', '')
750+
placeholders.setdefault('MULTISITE_ETCD_USER', '')
751+
placeholders.setdefault('MULTISITE_ETCD_PASSWORD', '')
752+
placeholders.setdefault('MULTISITE_ETCD_PROTOCOL', 'http')
753+
placeholders.setdefault('MULTISITE_TTL', '90')
754+
placeholders.setdefault('MULTISITE_RETRY_TIMEOUT', '40')
755+
placeholders.setdefault('EXTERNAL_HOST', placeholders['instance_data']['ip'])
756+
placeholders.setdefault('EXTERNAL_PORT', placeholders['PGPORT'])
757+
placeholders.setdefault('MULTISITE_NAMESPACE', '/multisite/{}'.format(placeholders['NAMESPACE']))
758+
placeholders.setdefault('USE_MULTISITE', placeholders['MULTISITE_SITE'] != '')
759+
if placeholders['USE_MULTISITE'] and not placeholders['MULTISITE_ETCD_HOSTS']:
760+
logging.warning("etcd location not configured for multisite operation")
761+
720762
return placeholders
721763

722764

@@ -751,6 +793,10 @@ def get_dcs_config(config, placeholders):
751793
kubernetes_labels = json.loads(KUBERNETES_DEFAULT_LABELS)
752794
config['kubernetes']['labels'] = kubernetes_labels
753795

796+
# Patroni 4 compatibility
797+
config['kubernetes']['leader_label_value'] = 'master'
798+
config['kubernetes']['standby_leader_label_value'] = 'master'
799+
754800
if not config['kubernetes'].pop('use_configmaps'):
755801
config['kubernetes'].update({'use_endpoints': True,
756802
'pod_ip': placeholders['instance_data']['ip'],

scripts/on_role_change.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ shift
77

88

99
readonly dbname=postgres
10-
if [[ "${*: -3:1}" == "on_role_change" && "${*: -2:1}" == "master" ]]; then
10+
if [[ "${*: -3:1}" == "on_role_change" && ("${*: -2:1}" == "master" || "${*: -2:1}" == "primary") ]]; then
1111
num=30 # wait 30 seconds for end of recovery
1212
while [[ $((num--)) -gt 0 ]]; do
1313
if [[ "$(psql -d $dbname -tAc 'SELECT pg_is_in_recovery()')" == "f" ]]; then

scripts/patroni_wait.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22

3-
ROLE=master
3+
ROLE=primary
44
INTERVAL=60
55
TIMEOUT=""
66

scripts/post_init.sh

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,30 @@ cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
44

55
PGVER=$(psql -d "$2" -XtAc "SELECT pg_catalog.current_setting('server_version_num')::int/10000")
66
if [ "$PGVER" -ge 12 ]; then RESET_ARGS="oid, oid, bigint"; fi
7+
if [ "$PGVER" -ge 17 ]; then RESET_ARGS="oid, oid, bigint, boolean"; fi
78

89
(
9-
# echo "DO \$\$
10-
# BEGIN
11-
# PERFORM * FROM pg_catalog.pg_authid WHERE rolname = 'admin';
12-
# IF FOUND THEN
13-
# ALTER ROLE admin WITH CREATEDB NOLOGIN NOCREATEROLE NOSUPERUSER NOREPLICATION INHERIT;
14-
# ELSE
15-
# CREATE ROLE admin CREATEDB;
16-
# END IF;
17-
# END;\$\$;
18-
19-
# GRANT cron_admin TO admin;
20-
21-
# DO \$\$
22-
# BEGIN
23-
# PERFORM * FROM pg_catalog.pg_authid WHERE rolname = '$1';
24-
# IF FOUND THEN
25-
# ALTER ROLE $1 WITH NOCREATEDB NOLOGIN NOCREATEROLE NOSUPERUSER NOREPLICATION INHERIT;
26-
# ELSE
27-
# CREATE ROLE $1;
28-
# END IF;
29-
# END;\$\$;"
10+
cat - <<SQL
11+
DO \$\$
12+
BEGIN
13+
PERFORM * FROM pg_catalog.pg_authid WHERE rolname = 'admin';
14+
IF FOUND THEN
15+
ALTER ROLE admin WITH CREATEDB NOLOGIN NOCREATEROLE NOSUPERUSER NOREPLICATION INHERIT;
16+
ELSE
17+
CREATE ROLE admin CREATEDB;
18+
END IF;
19+
END;\$\$;
20+
21+
DO \$\$
22+
BEGIN
23+
PERFORM * FROM pg_catalog.pg_authid WHERE rolname = '$1';
24+
IF FOUND THEN
25+
ALTER ROLE $1 WITH NOCREATEDB NOLOGIN NOCREATEROLE NOSUPERUSER NOREPLICATION INHERIT;
26+
ELSE
27+
CREATE ROLE $1;
28+
END IF;
29+
END;\$\$;
30+
SQL
3031

3132
while IFS= read -r db_name; do
3233
echo "\c ${db_name}"
@@ -51,10 +52,8 @@ while IFS= read -r db_name; do
5152
fi
5253
sed "s/:HUMAN_ROLE/$1/" create_user_functions.sql
5354
echo "CREATE EXTENSION IF NOT EXISTS pg_stat_statements SCHEMA public;
54-
ALTER EXTENSION set_user UPDATE;
55-
# GRANT EXECUTE ON FUNCTION public.set_user(text) TO admin;
56-
# GRANT EXECUTE ON FUNCTION public.pg_stat_statements_reset($RESET_ARGS) TO admin;"
55+
GRANT EXECUTE ON FUNCTION public.pg_stat_statements_reset($RESET_ARGS) TO admin;"
5756

5857
done < <(psql -d "$2" -tAc 'select pg_catalog.quote_ident(datname) from pg_catalog.pg_database where datallowconn')
59-
) | PGOPTIONS="-c synchronous_commit=local" psql -Xd "$2"
58+
) | PGOPTIONS="-c synchronous_commit=local" psql -Xd "$2" -f -
6059

0 commit comments

Comments
 (0)