开发者社区> 德哥> 正文

PostgreSQL 大实例的备份方案之一

简介:
+关注继续查看
基于流复制的HA, 采样如下方案.
https://github.com/digoal/PostgreSQL_HA_with_primary_standby_2vip
本文介绍一下, 在没有其他主机的情况下, 如何实施块级别的增量备份.
(假设主机为了性能, 未直接使用ZFS作为文件系统)

主要用到的是chroot, zfs. 当前, 现在btrfs 也支持snapshot, 所以随便你的选择了. 

实现方法也比较多, 我们可以用容器, 例如docker, 也可用虚拟机.

本文采用KVM虚拟机, 在虚拟机中使用ZFS文件系统, 在虚拟机中创建以宿主机数据库为primary的standby.
然后在zfs上做快照.

那么问题来了, 宿主机的归档如何传递给虚拟机呢, 我这里虚拟机和宿主机用的不同网段, 虚拟机出外网使用NAT转发通讯.
# iptables -L -v -n -t nat
Chain PREROUTING (policy ACCEPT 22449 packets, 1310K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 25464 packets, 1325K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  116  6960 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-65535 
  337 23214 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-65535 
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    

Chain OUTPUT (policy ACCEPT 25464 packets, 1325K bytes)
 pkts bytes target     prot opt in     out     source               destination 
这种通讯方式, 要直接挂载远端的NFS是有问题的, 所以需要用其他方式来获取远端归档.

我这里选择的方法是scp, 将虚拟机的postgres 用户下的key拷贝到2台宿主机, 使用scp来拷贝归档.
假设宿主机的物理IP分别为172.16.18.25,172.16.18.26. 
restore_command = 'ping -c 1 -W 1 172.16.18.25 && scp root@172.16.18.25:/data04/pgdata/arch/*/%f %p; ping -c 1 -W 1 172.16.18.26 && scp root@172.16.18.26:/data04/pgdata/arch/*/%f %p'
primary_conninfo = 'host=192.168.122.1 port=1921 user=replica keepalives_idle=60'
好了, 有人要问, 为什么不直接使用primary VIP呢? 假设primary VIP是172.16.18.27.
因为VIP会漂移, 一旦漂移, 虚拟机的~/.ssh/known_hosts里面的条目就会失效, 需要重新编写, 比较麻烦.

最后要配置宿主机
自动启动虚拟机
# cat /etc/rc.local
# kvm
/usr/bin/virsh start centos6_6_x64

配置虚拟机自动启动数据库
# cat /etc/rc.local
su - postgres -c "pg_ctl start"

配置虚拟机自动快照
# crontab -l
8 * * * * /usr/sbin/ntpdate asia.pool.ntp.org && /sbin/hwclock --systohc
1 4 * * * /root/script/zfs_snap.sh

# cat /root/script/zfs_snap.sh 
#!/bin/bash

DATE="`date +%Y%m%d`"
# 注意, 第一个快照的位置是$PGDATA所在的zfs
/sbin/zfs snapshot zp1/data02@$DATE
/sbin/zfs snapshot zp1/data01@$DATE
/sbin/zfs snapshot zp1/data03@$DATE
/sbin/zfs snapshot zp1/data04@$DATE

现在快照有了, 加上宿主机上的归档也在, 完全可以实现基于时间点的恢复 . 
最后, 强烈建议pg_xlog不要放在zfs文件系统中. 宁愿放在虚拟机的系统盘里面也不要放在ZFS里面. 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24794 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17986 0
mySQL 增量备份方案
1.在 /etc/my.cnf 下面设置开启bin-log          编辑          vim /etc/my.cnf          [mysqld]          binlog_format       = MIXED                 //binlog日志格式          log_bin             =目录/mysql-bin.
705 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14681 0
+关注
德哥
公益是一辈子的事, I'm digoal, just do it.
2153
文章
245
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载