大数跨境

容器化PG11升级手记

容器化PG11升级手记 脉策科技
2018-12-21
0
导读:Postgresql(以下简称pg)+Postgis,作为开源方案中最为强大的地理数据存储与处理方案,也是Datamap强大的核心所在。

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 serverconsider 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了, 最后提醒一下:


升级有风险, 注意备份!

升级有风险, 注意备份!

升级有风险, 注意备份!

【声明】内容源于网络
0
0
脉策科技
我们是致力于大数据和人工智能领域的科技公司,为政府和大型企业提供数据平台、数据研究、人工智能、算法服务及系统解决方案。
内容 132
粉丝 0
脉策科技 上海脉策数据科技有限公司 我们是致力于大数据和人工智能领域的科技公司,为政府和大型企业提供数据平台、数据研究、人工智能、算法服务及系统解决方案。
总阅读102
粉丝0
内容132