2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ZFS 重複排除 を使用して節約バックアップ (CentOS7)

Posted at

某バックアップソフトウェアで取得していたCentOS サーバーのバックアップがある日突然エラーになり取得できなくなった。

・メーカーサポートではRedhatしかサポートしてくれない。
・上司もお金は出したくない(とは言わないがなんとかしろとしか言わない)
・取得するサイズはトータル 180GB。
・社内規則により世代バックアップは欲しい(日次 7日)

某バックアップソフトウェアでは重複排除により容量を25% ほどに抑えていた。
最後の要件が普通のNASではだめだったので、ZFS環境で重複排除を試してみることに。

環境:CentOS7

1.ZFS インストール
rpm -ivh http://download.zfsonlinux.org/epel/zfs-release.el7_3.noarch.rpm
yum install -y kernel-devel zfs
reboot

2.zfs module をロードし、filesystem に zfs が追加されたことを確認

/sbin/modprobe zfs
cat /proc/filesystems

nodev zfs

3.再起動時に zfs module をロード
vi /etc/modules-load.d/zfs.conf

zfs

4.zfs デーモン起動
systemctl start zfs-zed.service # ZFS イベントデーモン
systemctl start zfs-share.service # ZFS 共有デーモン
systemctl start zfs.target # ZFS ターゲットデーモン
systemctl start zfs-import-cache.service
systemctl start zfs-import-scan.service

5.rootpool "disk" を作成し /root/nfs にマウントする
zpool create -m /root/nfs/ disk /dev/sdd

6.zfs の dedup機能をオン
zfs set dedup=on disk
zfs set atime=off disk
zfs set compression=lz4 disk
zpool set cachefile=/etc/zfs/zpool.cache disk

systemctl enable zfs-zed.service # ZFS イベントデーモン
systemctl enable zfs-share.service # ZFS 共有デーモン
systemctl enable zfs.target # ZFS ターゲットデーモン
systemctl enable zfs-import-cache.service
systemctl enable zfs-import-scan.service

7.バックアップ
BACURAなるソフトを意気込んで試したもののイメージファイルの重複が利かなかった。ブロックレベルとはなんぞや。
まっとうなスクリプトを書こうとするも3秒ほどで頓挫。

rsyncで放り込んで cp で世代送りする力業で解決することにしました。

/etc/cron.daily/zz02_rsync
#!/bin/sh
rsync -4 -avz --bwlimit=4096 --exclude-from=/root/nfs/conf/getdir.conf --exclude="*" --delete root@<バックアップ先ホスト名>:/ /root/nfs/<ホスト名>/current/
/root/nfs/conf/getdir.conf
+ /home/***
+ /usr/
+ /usr/local/
+ /usr/local/app/***
+ /usr/local/projects/***
+ /usr/local/svnroot/***
+ /usr/local/trac-backup/***
- *
/etc/cron.daily/zz01_lifecycle
#!/bin/sh
# 昨日の日付のディレクトリ作成し、/root/nfs/<バックアップ先ホスト名>/current を放り込む
mkdir "/root/nfs/<バックアップ先ホスト名>/`date '+%Y%m%d' -d yesterday`" 
cp -a /root/nfs/<バックアップ先ホスト名>/current/ /root/nfs/<バックアップ先ホスト名>/`date '+%Y%m%d' -d yesterday`/
#↓外部取込用
#rsync -a --bwlimit=20000 /root/nfs/<バックアップ先ホスト名>/current/ /root/nfs/<バックアップ先ホスト名>/`date '+%Y%m%d' -d yesterday`/
# 作成されたディレクトリ名(日付)を対象に、本日からcurrentを除く6日分を残し、残りのディレクトリを削除
find  /root/nfs/<バックアップ先ホスト名>/ -maxdepth 1 -name current -prune -o -daystart -mtime +6 -type d -print | xargs rm -rf

Cronに放り込んで完成。

8.出来上がり
一週間経過した状況。

[root@hostname]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    28G  3.5G   25G   13% /
devtmpfs                  3.9G     0  3.9G    0% /dev
tmpfs                     3.9G     0  3.9G    0% /dev/shm
tmpfs                     3.9G   57M  3.9G    2% /run
tmpfs                     3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/sda1                 494M  278M  217M   57% /boot
disk                      1.7T  1.5T  296G   83% /root/nfs  バックアップディレクトリ
[root@hostname]# du -h --max-depth=1 /root/nfs/<バックアップ先ホスト名>/
181G    /root/nfs/<バックアップ先ホスト名>/current
181G    /root/nfs/<バックアップ先ホスト名>/20171127
180G    /root/nfs/<バックアップ先ホスト名>/20171130
180G    /root/nfs/<バックアップ先ホスト名>/20171129
180G    /root/nfs/<バックアップ先ホスト名>/20171124
181G    /root/nfs/<バックアップ先ホスト名>/20171126
181G    /root/nfs/<バックアップ先ホスト名>/20171125
180G    /root/nfs/<バックアップ先ホスト名>/20171128
1.5T    /root/nfs/<バックアップ先ホスト名>/
[root@hostname]# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
disk   696G   345G   351G         -    78%    49%  4.24x  ONLINE  -

7日分 1.7TB相当が 345GB (ALLOCが実使用量) に収まっている。

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?