基于K8S进行postgresql数据备份&恢复
1.前置说明
本文基于K8S进行postgres数据库进行备份和数据还原,数据库采用及集群HA的模式进行搭建,可参考前文Rancher+K8S+Docker集群搭建。其中涉及到psql、kubectl、crontab、pg_dumpall的基本操作。不熟悉的可以自行百度了解。
2.进行备份和恢复的前置操作
-
获取数据库所在命名空间
$ kubectl get namespace
查看该集群中数据库所在空间名
选取所在空间名进行集群节点的获取 -
获取数据库所在节点
$ kubectl get pod -n qsc-psql
3. 进入对接节点容器
本操作可以在执行备份或恢复相关脚本cp操作后查看是否操作成功。
$ kubectl exec -it stolon-proxy-5c775776ff-77rfk -n qsc-psql -- bash
3.进行数据备份操作
备份操作使用基本流程为:设置数据库连接信息系统变了、采用pg_dumpall进行数据备份、给生成的脚本执行权限、拷贝备份脚本到对应容器、执行该脚本、拷贝备份文件到指定位置。
我将以上备份操作整理为了如下脚本,可自行修改后使用:
#!/bin/bash
#必须加这一句不然kubectl的相关操作不会执行
source /etc/profile
filename="`date +%F`_bak.sql"
#备份数据脚本
cat > /home/ubuntu/hip/bak/exportPG.sh <<EOF
#!/bin/bash
export PGUSER=postgres
export PGPASSWORD='daship123'
export PGHOST=127.0.0.1
export PGPORT=5432
#备份整个集群库中的数据
pg_dumpall -a > ${filename}
#备份整个集群库包含建库建表操作
#pg_dumpall > ${filename}
EOF
#给执行权限
chmod +x /home/ubuntu/hip/bak/exportPG.sh
#将服务器上的备份脚本复制到对应容器中去
kubectl cp /home/ubuntu/hip/bak/exportPG.sh qsc-psql/stolon-proxy-5c775776ff-77rfk:/exportPG.sh
#在容器外执行该脚本
kubectl exec -it stolon-proxy-5c775776ff-77rfk -n qsc-psql -- /exportPG.sh
#将备份后的数据文件复制到容器外
kubectl cp qsc-psql/stolon-proxy-5c775776ff-77rfk:${filename} /home/ubuntu/hip/bak/${filename}
使用时须替换为实际情况的值!
脚本说明:
因为实际的备份操作需在容器内才可进行,所有该脚本执行后会生成备份脚本并将其复制到容器中,在通过kubectl exec 来自行复制进去的脚本。备份完成后该备份文件存在于容器内,使用kubectl cp将备份文件从容器内复制到容器外。
以下为操作截图:
其中bak_postgres.sh为自行备份的脚本,对应上面的脚本内容。restore_datas.sh为数据恢复的脚本,数据恢复在下面进行讲述。
自行bak_postgres.sh脚本,将会生成一个容器内备份数据的脚本和一个本分的sql文件。
$ ./bak_postgres.sh
运行效果如图:
其中2021-04-07_bak.sql为数据备份文件,exportPG.sh为容器内数据备份脚本。对应的内容分别为:
exportPG.sh的内容:
$ cat exportPG.sh
#!/bin/bash
export PGUSER=postgres
export PGPASSWORD='daship123'
export PGHOST=127.0.0.1
export PGPORT=5432
pg_dumpall -a > 2021-04-07_bak.sql
2021-04-07_bak.sql的内容:
该文件的内容较大,只截图显示部分内容,其中主要是postgresql的copy语句。为方便后面的数据恢复,我们这里选取其中的一个表来进行效果呈现(备份的是整改数据库的数据),选取的这个表我们后面将其数据删除,再执行备份的恢复语句看数据是否可以还原。此处选取“das_resource”这个表进行操作。
$ cat 2021-04-07_bak.sql
选取备份的表和数据对照,数据备份完整。本次数据备份完成。
以上操作涉及到pg_dumpall 、kubectl 、linux常规操作,此处不再细述。
4.恢复备份数据
系统服务运行过程中可能会出现部分数据丢失,所以才会采用数据备份的方式来进行数据还原,减小数据丢失的风险。本文演示时将上述“das_resource”表的数据删除,使用备份脚本来进行数据恢复。
情空数据如图:
数据恢复基本流程为:复制备份文件到指定容器、打开psql、使用psql -f 备份文件、生成数据恢复脚本并复制到容器中、运行改恢复脚本。具体脚本内容如下:
#!/bin/bash
#必须加这一句不然kubectl的相关操作不会执行
source /etc/profile
filename="`date +%F`_bak.sql"
#复制备份文件到对应容器
kubectl cp /home/ubuntu/hip/bak/${filename} qsc-psql/stolon-proxy-5c775776ff-77rfk:/${filename}
#写入脚本执行指令让psql运行本分文件
cat > /home/ubuntu/hip/bak/bakpgdb.sh <<EOF
#!/bin/bash
export PGUSER=postgres
export PGPASSWORD='daship123'
export PGHOST=127.0.0.1
export PGPORT=5432
psql -h localhost -U postgres -f ${filename}
EOF
#授权bakpgdb.sh
chmod +x /home/ubuntu/hip/bak/bakpgdb.sh
#将脚本复制到容器节点
kubectl cp /home/ubuntu/hip/bak/bakpgdb.sh qsc-psql/stolon-proxy-5c775776ff-77rfk:/bakpgdb.sh
#执行该脚本完成数据恢复
kubectl exec -it stolon-proxy-5c775776ff-77rfk -n qsc-psql -- /bakpgdb.sh
使用时须替换为实际情况的值!
脚本说明:
运行改脚本后会生成一个恢复数据的脚本。讲该脚本复制到指定容器,使用kubectl exec 在容器外执行容器内的脚本,刷新数据表查看是否恢复数据。操作效果如下:
运行restore_datas.sh脚本
./restore_datas.sh
运行后会生成bakpgdb.sh脚本,和输出备份的日志。该脚本为容器内执行恢复数据文件的脚本。
脚本内容为:
cat bakpgdb.sh
#!/bin/bash
export PGUSER=postgres
export PGPASSWORD='daship123'
export PGHOST=127.0.0.1
export PGPORT=5432
psql -h localhost -U postgres -f 2021-04-07_bak.sql
其中的错误信息是因为库和表都是存在的,我们只删除了表中的数据,所有在执行CREATE DATABASE或者CREATE TABLE时提示已经存在了,不影响数据恢复。这个地方有一点需要注意,若恢复的表中存在数据,且该数据已经备份了,那么将不会去恢复该条记录,因为数据已经存在,后续该表中的新数据也不会恢复,所有出现这种情况,在确保备份的数据文件中都存在该表的数据,可以先将表清空再恢复。
刷新数据库表如图:
数据以成功恢复到该表中。至此数据的备份和恢复就已经完成了!
5.如何进行数据的定时备份
进行数据的定时备份也就是如何让系统定时的执行我们的备份脚本,本文中系统采用ubuntu,使用crontab来进行脚本定时执行的设定。
1.编辑定时任务 该操作需要有root权限
$ vi /etc/crontab
2.指定自定义时间执行脚本
在改内容中加入如下指令执行我们的备份脚本
其中的m h dom mon dow user command
分别对应如下取值:
m分钟 0-59
h小时 0-23
dow天1-31
mon月 1-12
dow 星期 1-6 0表示星期天
command就是要执行的命令
50 23 * * * root /home/ubuntu/hip/bak/bak_postgres.sh
操作截图:
本设定为每天晚上11点50执行备份操作
3.保存后重新加载配置文件
service cron reload
4.重启定时任务
service cron restart
这样就实现了定时的数据备份了,如图:
该备份的数据文件就是昨晚11点50备份后的。
以上操作均通过实践,希望对大家有所帮助!