On 15/04/19 2:26 PM, Mark Kirkwood wrote:
>
> On 10/04/19 8:20 PM, Andreas Kretschmer wrote:
>>
>>
>> Am 10.04.19 um 07:40 schrieb Daulat Ram:
>>> We have two node postgresql database version 9.6 with streaming
>>> replication which is running on docker environment, os Linux
>>> (Ubuntu) and we have to migrate on PostgresQL11. I need your
>>> suggestions & steps to compete the upgrade process successfully.
>>
>> there are exists several ways to do that. You can take a normal dump
>> and replay it in the new version, you can use pg_upgrade, and you can
>> use a logical replication (using slony, londiste or pg_logical from
>> 2ndQuadrant). There is no 'standard way' to do that, all depends on
>> your requirements and knowledge how to work with that tools.
>>
>>
>>
>
> The docker environment makes using pg_upgrade more difficult, as you
> need to modify (or build a new) container with the old and new
> Postgres versions installed. I'm interested in seeing how hard that
> would be (will update this thread if I find anything useful).
>
>
>
It transpires that it is not too tricky to build a 'migration' container:
- get relevant Postgres Dockerfile from https://hub.docker.com/_/postgres
- Amend it to install 2 versions of Postgres
- Change ENTRYPOINT to run something non Postgres related (I used 'top')
- Build it
To use pg_upgrade the process is:
- stop your original Postgres container
- run the migration one, attaching volume from the Postgres container +
a new one
- enter the migration container and initialize the new version's datadir
- run pg_upgrade from old to new version
- tidy up config and pg_hba for the upgraded datadir
- exit and stop the migration container
(see attached for notes and Dockerfile diff)
You can then run a new Postgres container (of the new version) using the
new volume.
While the process is a bit fiddly, it is probably still way faster than
a dump and restore.
regards
Mark
Look At Upgrading Postgres In Docker
====================================
The standard Docker images for Postgres have the following issues wrt
in place upgrades:
- Only 1 version of Postgres binaries
- Cannot stop Postgres (stops container)
To get around this a custom image that has:
- 2 versions of Postgres binaries (e.g version 10 and 11)
- runs top (or tail -f etc) as its ENTRYPOINT so that Postgres is stopped
Run a container with this image using 2 volumes (one for the old install
one for the new);
$ docker run \
--detach \
--name=mig-postgres \
--volume=/srv/docker/volumes/test-postgres/datadir10:/var/lib/postgresql/data \
--volume=/srv/docker/volumes/test-postgres/datadir11:/var/lib/postgresql/data11
\
migpostgres
$ docker exec -it mig-postgres bash
# chown postgres:postgres /var/lib/postgresql/data11
# su - postgres
postgres $ /usr/lib/postgresql/11/bin/initdb -D /var/lib/postgresql/data11
postgres $ /usr/lib/postgresql/11/bin/pg_upgrade \
--old-bindir=/usr/lib/postgresql/10/bin \
--new-bindir=/usr/lib/postgresql/11/bin \
--old-datadir=/var/lib/postgresql/data \
--new-datadir=/var/lib/postgresql/data11 \
--old-port=5432 \
--new-port=5433 \
--check
(run again w/o --check if ok)
postgres $ echo "listen_addresses='*'" >>
/var/lib/postgresql/data11/postgresql.conf
postgres $ cp /var/lib/postgresql/data/pg_hba.conf \
/var/lib/postgresql/data11
postgres $ exit
# exit
$ docker container stop mig-postgres
$ docker run \
--detach \
--name=test-postgres11 \
--volume=/srv/docker/volumes/test-postgres/datadir11:/var/lib/postgresql/data \
--publish 5432:5432 \
postgres:11
--- Dockerfile.orig 2019-04-16 10:45:07.924000000 +1200
+++ Dockerfile 2019-04-16 12:38:32.556000000 +1200
@@ -28,7 +28,7 @@
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
- && gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
+ && gpg --batch --keyserver keyserver.ubuntu.com --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& { command -v gpgconf > /dev/null && gpgconf --kill all || :; } \
&& rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \
@@ -64,14 +64,16 @@
# uid PostgreSQL Debian Repository
key='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8'; \
export GNUPGHOME="$(mktemp -d)"; \
- gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
+ gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/postgres.gpg; \
command -v gpgconf > /dev/null && gpgconf --kill all; \
rm -rf "$GNUPGHOME"; \
apt-key list
ENV PG_MAJOR 10
+ENV PG_NEXT_MAJOR 11
ENV PG_VERSION 10.7-1.pgdg90+1
+ENV PG_NEXT_VERSION 11.2-1.pgdg90+1
RUN set -ex; \
\
@@ -83,12 +85,14 @@
amd64|i386|ppc64el) \
# arches officialy built by upstream
echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_MAJOR" > /etc/apt/sources.list.d/pgdg.list; \
+ echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_NEXT_MAJOR" >> /etc/apt/sources.list.d/pgdg.list; \
apt-get update; \
;; \
*) \
# we're on an architecture upstream doesn't officially build for
# let's build binaries from their published source packages
echo "deb-src http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_MAJOR" > /etc/apt/sources.list.d/pgdg.list; \
+ echo "deb-src http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_NEXT_MAJOR" >> /etc/apt/sources.list.d/pgdg.list; \
\
case "$PG_MAJOR" in \
9.* | 10 ) ;; \
@@ -115,6 +119,15 @@
postgresql-common pgdg-keyring \
"postgresql-$PG_MAJOR=$PG_VERSION" \
; \
+ apt-get build-dep -y \
+ postgresql-common pgdg-keyring \
+ "postgresql-$PG_NEXT_MAJOR=$PG_NEXT_VERSION" \
+ ; \
+ DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)" \
+ apt-get source --compile \
+ postgresql-common pgdg-keyring \
+ "postgresql-$PG_NEXT_MAJOR=$PG_NEXT_VERSION" \
+ ; \
# we don't remove APT lists here because they get re-downloaded and removed later
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
@@ -141,6 +154,10 @@
"postgresql-$PG_MAJOR=$PG_VERSION" \
; \
\
+ apt-get install -y \
+ "postgresql-$PG_NEXT_MAJOR=$PG_NEXT_VERSION" \
+ ; \
+ \
rm -rf /var/lib/apt/lists/*; \
\
if [ -n "$tempDir" ]; then \
@@ -167,9 +184,12 @@
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
-RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
-ENTRYPOINT ["docker-entrypoint.sh"]
+#COPY docker-entrypoint.sh /usr/local/bin/
+#RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
+#ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
-CMD ["postgres"]
+#CMD ["postgres"]
+
+ENTRYPOINT ["top", "-b"]
+CMD ["-c"]