DEV Community

Franck Pachot for YugabyteDB Distributed PostgreSQL Database

Posted on • Edited on

PostGIS on YugabyteDB Alma8 (workarounds)

PostgreSQL database supports spatial functions with PostGIS. This extension was tested on CentOS 7. Here is an attempt to install it on the docker image based on Alma8.

Install on Alma8

I'm running this on a YugabyteDB 2.19 container started with:

docker run -it yugabytedb/yugabyte:2.19.2.0-b121 bash
Enter fullscreen mode Exit fullscreen mode

As this version is PG11 compatible, I install postgresql11-devel and postgis33_11. I choose version 33 as the latest version (found with dnf search postgis | grep -E '^postgis[0-9]+_11[.]' | sort -n).

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf update -y
dnf install -y dnf-plugins-core
dnf config-manager --set-enabled powertools
dnf -qy module disable postgresql
dnf install -y postgresql11-devel

dnf install -y postgis31_11

Enter fullscreen mode Exit fullscreen mode

Once installed I copy the files to the YugabyteDB directory

alias pg_config=/usr/pgsql-11/bin/pg_config
alias yb_pg_config=$YB_HOME/postgres/bin/pg_config

cp "$(pg_config --pkglibdir)"/postgis* "$(yb_pg_config --pkglibdir)"
cp "$(pg_config --sharedir)"/extension/postgis* "$(yb_pg_config --sharedir)/extension"

$YB_HOME/bin/post_install.sh -e
Enter fullscreen mode Exit fullscreen mode

Start YugabyteDB and test

yugabyted start
export PGHOST=$(hostname)
until $YB_HOME/postgres/bin/pg_isready ; do sleep 1 ; done | uniq
$YB_HOME/bin/ysqlsh -ec "create extension postgis"

Enter fullscreen mode Exit fullscreen mode

Unfortunately, this fails with:

ERROR:  could not load library "/home/yugabyte/postgres/lib/postgis-3.so": /home/yugabyte/linuxbrew/lib/libc.so.6: version `GLIBC_2.28' not found (required by /home/yugabyte/postgres/../lib/yb-thirdparty/libxml2.so.2)
Enter fullscreen mode Exit fullscreen mode

The problem here is that YugabyteDB uses GLIBC 2.23:

sh-4.4# ls $YB_HOME/linuxbrew/lib/libc*so
/home/yugabyte/linuxbrew/lib/libc-2.23.so
sh-4.4#
Enter fullscreen mode Exit fullscreen mode

But when running post_install.sh to link the new PostGIS libraries, some dependencies were taken from the system with higher GLIBC:

objdump -T $YB_HOME/lib/yb-thirdparty/* | awk '/^[/]/{f=$1} $0 ~ re{print gensub(re,"\\1 "f" \\2",1)}' re="^.* GLIBC_([0-9.]+) (.*)$" | sort -uV

...
2.23 /home/yugabyte/lib/yb-thirdparty/libquadmath.so.0:  __signgam
2.25 /home/yugabyte/lib/yb-thirdparty/libbsd.so.0:  __explicit_bzero_chk
2.25 /home/yugabyte/lib/yb-thirdparty/libcrypt.so.1:  getentropy
2.25 /home/yugabyte/lib/yb-thirdparty/libcrypt.so.1:  getrandom
2.25 /home/yugabyte/lib/yb-thirdparty/libcrypt.so.1:  __explicit_bzero_chk
2.25 /home/yugabyte/lib/yb-thirdparty/libexpat.so.1:  getrandom
2.26 /home/yugabyte/lib/yb-thirdparty/liburiparser.so.1:  reallocarray
2.27 /home/yugabyte/lib/yb-thirdparty/libIlmImf-2_2.so.22:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libarpack.so.2:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/libgdal.so.30:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libgfortran.so.5:  expf
2.27 /home/yugabyte/lib/yb-thirdparty/libgfortran.so.5:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libhdf5.so.103:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/liblapack.so.3:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/liblapack.so.3:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblaso.so.0:  expf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblaso.so.0:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblaso.so.0:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblasp.so.0:  expf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblasp.so.0:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libopenblasp.so.0:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/libsatlas.so.3:  logf
2.27 /home/yugabyte/lib/yb-thirdparty/libsatlas.so.3:  powf
2.27 /home/yugabyte/lib/yb-thirdparty/libxerces-c-3.2.so:  logf
2.28 /home/yugabyte/lib/yb-thirdparty/libcfitsio.so.7:  fcntl64
2.28 /home/yugabyte/lib/yb-thirdparty/libsqlite3.so.0:  fcntl64
2.28 /home/yugabyte/lib/yb-thirdparty/libxml2.so.2:  fcntl64
Enter fullscreen mode Exit fullscreen mode

Workaround1 add libraries from Centos7

This has been already troubleshooted by Giovanni Candido da Silva who shared how to build an image with YugabyteDB and PostGIS by adding the libraries libsqlite3.so.0 and libxml2.so.2 taken from Centos7:
https://github.com/giovannicandido/yugabytedb-postgis

I'm using a similar workaround here by taking them from the Centos7 image:

docker run -i centos:7 bash -c "tar -C /usr/lib64 -h -cf - libsqlite3.so.0 libxml2.so.2.9.1" |
  docker exec -i 597b5077f0b2 bash -c "tar -C /home/yugabyte/postgres/../lib/yb-thirdparty -xvf -"
Enter fullscreen mode Exit fullscreen mode

Now, I can load the PostGIS extension:

[root@597b5077f0b2 yugabyte]# $YB_HOME/bin/ysqlsh -ec "create extension postgis"
create extension postgis
WARNING:  'analyze' is a beta feature!
HINT:  Set 'ysql_beta_features' yb-tserver gflag to true to suppress the warning for all beta features.
CREATE EXTENSION
[root@597b5077f0b2 yugabyte]#
Enter fullscreen mode Exit fullscreen mode

This is a workaround, not supported. I've opened the following issue to get it solve in the YugabyteDB deployment:
https://github.com/yugabyte/yugabyte-db/issues/19389

Workaround 2: Install on Centos7 and copy to Alma8

Here is a Dockerfile that installs PostGIS on Centos7 (the YugabyteDB 2.15.3 image was the last one on this OS) and copies the files and dependent libraries to the Alma8 (the latest YugabyteDB image) image:

# get the latest YugabyteDB image that was deployed on Centos7
FROM yugabytedb/yugabyte:2.15.3.2-b1 as postgis-on-centos7
RUN yum update -y
# install PostGIS into PostgreSQL directory
RUN yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
RUN yum -y install postgresql11-server postgis31_11 postgis31_11-client
# store the names of existing files in YugabyteDB directory
RUN find /home/yugabyte -type f > /tmp/files-before.txt
# install PostGIS into YugabyteDB directory and relink with GLIBC
RUN cp /usr/pgsql-11/lib/postgis* /home/yugabyte/postgres/lib
RUN cp /usr/pgsql-11/share/extension/postgis* /home/yugabyte/postgres/share/extension
RUN /home/yugabyte/bin/post_install.sh -e
# keep only files added by PostGIS and dependencies and tar them
RUN rm $(cat /tmp/files-before.txt)
RUN tar -cvf /tmp/postgis.tar /home/yugabyte
# get the latest YugabyteDB image (on Alma8)
FROM yugabytedb/yugabyte:latest
# get PostGIS files without overriding anything
COPY --from=postgis-on-centos7 /tmp/postgis.tar /tmp/postgis.tar
RUN tar --skip-old-files -C / -xvf /tmp/postgis.tar
RUN /home/yugabyte/bin/post_install.sh -e
Enter fullscreen mode Exit fullscreen mode

Again, this is a workaround, not supported, until #19389 is fixed.

Top comments (0)