Postgresql(以下简称pg)+Postgis,作为开源方案中最为强大的地理数据存储与处理方案,也是Datamap强大的核心所在。

在2018年初我们就升级了PG10和Postgis2.4,通过分表,并发处理提升地理计算的速度。
在11月PG发布了最新的PG11,在分表功能上有了更强大的支持,以及早些时候发布的postgis2.5支持更多的地理并行计算,为了最大化提升用户体验,我们决定升级数据库(升级有风险,非专业人士以及强稳定业务慎重选择)。
由于最初PG采用host安装,数据库也不庞大,从PG9.6升级PG10的时候还是相对轻松,经过一年时间,我们的数据已经达到TB级别,并且全面实施了Docker化,因此升级过程也比年初升级PG10要复杂。
本文操作环境基于CentOS 7.4,Docker version 18.06.0-ce
01
—
升级前准备
需要先准备好相应的docker image,包括:
# 用于升级的包含新旧数据库的镜像, 以下提供脉策开源的包含postgis的版本
docker pull metrodatatech/postgis_upgrade:10-to-11
# 新版本的PG镜像, 以下提供脉策开源的基于PG11+Postgis2.5.1以及调整了db encoding的版本
docker pull metrodatatech/mdtdb:11
如果需要使用社区版本自行定制,可以参考:
升级镜像
https://github.com/tianon/docker-postgres-upgrade
PG+Postgis镜像
https://github.com/appropriate/docker-postgis
02
—
升级过程
如果原来的磁盘空间不足够(至少预留50%+, 因为新数据会被copy出来),需要挂载额外磁盘(如果机器本身带有多余存储空间可以忽略, 建议上SSD以加快升级, 效果显著)。
# 具体路径按需更替
mkdir -p /var/lib/pgsql/11
mount /dev/vdc /var/lib/pgsql/11
关闭旧版本PG,必须要完整顺利退出(虽然PG的非正常关闭不会影响数据的准确性, 但是无法启动升级程序)。
# 检查 exit code 为 0
docker kill -s SIGINT pg_old && docker ps -a | grep pg_old
然后我们执行升级程序
docker run --rm \
-v /var/lib/pgsql/10:/var/lib/postgresql/10/data \
-v /var/lib/pgsql/11:/var/lib/postgresql/11/data \
metrodatatech/postgis_upgrade:10-to-11
然后就是漫长的等待(取决于db的大小以及硬盘的读写能力),如果升级成功,会出现以下信息(可以忽略, 后面可以自行执行对应的命令)。
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster\'s data files:
./delete_old_cluster.sh
如果升级过程出现问题,错误信息会驻留在升级container的目录下,错误文件名会打印在terminal,可以通过以下方法查看错误日志。
按照经验可能出现的问题是原PG安装了某些插件,而升级镜像里没有,可以通过安装对应插件解决。
docker commit ${container_name} whatever_name
docker run --rm --entrypoint=sh whatever_name cat ${error_file_name_on_terminal}
升级成功后,需要手动迁移原来的PG server配置,简单粗暴的可以直接copy,推荐手动对照新版的配置模板手动更新。
cp /var/lib/pgsql/10/pg_hba.conf /var/lib/pgsql/11/pg_hba.conf
cp /var/lib/pgsql/10/postgresql.conf /var/lib/pgsql/11/postgresql.conf
然后就可以启动最新版本的镜像,拉起数据库。
docker run -d --name pg_new -v /var/lib/pgsql/11:/var/lib/postgresql/11/data metrodatatech/mdtdb:11
同时为了将DB带入尽快可用的状态,建议执行分析vacuum命令(不执行会导致新db最初非常的慢)。
vacuumdb --analyze-in-stages -d your_db -U your_user
03
—
升级成功
顺利的话, 经过若干小时折腾, 就可以用上最新版本的pg了, 最后提醒一下:
升级有风险, 注意备份!
升级有风险, 注意备份!
升级有风险, 注意备份!

