閱讀581 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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裏麵. 

最後更新:2017-04-01 13:37:08

  上一篇:go PostgreSQL 的小玩具, async Notification as a chat group
  下一篇:go PostgreSQL 妙用explain Plan Rows快速估算結果集數量