前段时间负责一个政务云项目的升级,从单机容器环境,升级到kubernetes集群环境。考虑到现场环境以及稳定性等因素,决定采取冷备份的方式。
实际生产环境中,使用的是posgres数据库,数据库运行在一个docker容器中,运行七个数据库,有web,coreapi,以及openstack相关的五个组件:keystone,nova,glance,cinder,neutron。
Postgres数据库已经提供了备份还原工具,因此只需要执行简单的导入导出数据库文件操作即可。数据库文件的移动,可使用scp命令来下载或上传。
可以不用进入容器,而直接进入数据库中操作:
#psql –U postgres –h 127.0.0.1
进入之后,就可以查看相应的数据库,以及进行备份恢复等操作了
Postgres=#\? 使用”\?”来查看可以执行的操作
Postgres=#\c 使用”\c”来切换数据库
Postgres=#select * from nova 查看nova数据库中所有表数据
Postgres=#create database mydb 使用create database命令来创建数据库
Postgres=#drop database mydb 使用drop database命令来删除数据库
-----------------------------------------------------------------------------------------------------------------------
假设现场的单机版环境为10.10.10.10,集群版环境为10.10.10.20
此处备份数据库用自带工具pg_dump来完成,详细参数直接执行pg_dump查看。
备份数据库的操作,在单机上操作(备份还原操作可以不用进入容器中):
Postgres=#pg_dump –h 127.0.0.1 –U postgres nova > /tmp/nova.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres cinder > /tmp/cinder.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres glance > /tmp/glance.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres keystone > /tmp/keystone.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres neutron > /tmp/neutron.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres core_api > /tmp/core_api.sql
Postgres=#pg_dump –h 127.0.0.1 –U postgres core_web > /tmp/core_web.sql
把备份的数据库文件都放进了tmp文件夹中,然后使用scp命令把此文件夹上传到集群环境中:
#cd /
#scp –r /tmp [email protected]:/tmp/
Scp命令的格式为: scp + 参数(-r为传输文件夹)+源文件路径 + 目的文件路径
此处需要输入连接目的路径所在主机的root密码。
备份文件上传成功后,在集群环境中,使用该数据库文件进行还原操作。
还原数据库用自带工具psql来完成:
Postgres=# psql –h 127.0.0.1 –U postgres nova < /tmp/nova.sql
Postgres=# psql –h 127.0.0.1 –U postgres cinder < /tmp/cinder.sql
Postgres=# psql –h 127.0.0.1 –U postgres glance < /tmp/glance.sql
Postgres=# psql –h 127.0.0.1 –U postgres keystone < /tmp/keystone.sql
Postgres=# psql –h 127.0.0.1 –U postgres neutron < /tmp/neutron.sql
Postgres=# psql –h 127.0.0.1 –U postgres core_api < /tmp/core_api.sql
Postgres=# psql –h 127.0.0.1 –U postgres core_web < /tmp/core_web.sql
现场环境中,由于数据库的表结构有变化,需要升级,因此要把原服务全部停掉。由于kubernetes集群环境监测到某个服务终止时,会立即自动拉起对应的新服务,所以在此的方案是:暂时把所有rc都删除,停止所有服务。待数据库恢复之后,再从新创建rc。
之后,在新环境中验证数据是否和旧环境中一致,至此,数据恢复完成。
也可以根据实际情况,使用整体备份的方法工具:pg_dumpall