バックアップサーバをrsyncとGlusterFSで用意する。
「やっちまった」。。。DBサーバのファイルシステムが飛んでしまった。
いろいろ反省会をした後、「やっぱりバックアップって必要だよね」「DNSとか飛んだらおしまいじゃね、どうする?」なんて話が出て、LAN上の重要データについては定期バックアップを取ることになった。
バックアップ要件としては簡単に以下の3を挙げた。
- 一日一回。夜中に実施。
- 一世代だけでいい。
- バックアップが飛ぶことも考慮する。
1.rsyncを使った定期バックアップ
このうち定期実施についてはrsyncを使用する。コピー先とコピー元にそれぞれrsyncを入れる。
[root@ns ~]# yum -y install rsync
[root@backup1 ~]# yum -y install rsync
コピー元にはバックアップ用のシェルスクリプトを用意してcronで動かす。
[root@ns ~]# vi /usr/local/sbin/backup.sh
#!/bin/bash
cp -pafr /etc/named.conf /var/named/.
rsync -avz /var/named backup.example.jp::named
[root@ns ~]# chmod +x /usr/local/sbin/backup.sh
[root@ns ~]# crontab -e
0 2 * * * /usr/local/sbin/backup.sh
BackupServerのファイアーウォールを開け、rsyncdを設定して起動する。
[root@bakcup1 ~]# firewall-cmd --add-service=rsyncd --permanent --zone=public
[root@bakcup1 ~]# firewall-cmd --reload
[root@bakcup1 ~]# vi /etc/rsyncd.conf
[named]
# path to copy destination
path = /srv/backup/named
hosts allow = 172.16.10.2
hosts deny = *
list = true
uid = root
gid = root
read only = false
[root@backup1 ~]# mkdir -p /srv/backup/named
[root@backup1 ~]# systemctl start rsyncd
[root@backup1 ~]# systemctl enable rsyncd
2.GlusterFSの構成
次にバックアップが飛んだ場合の考慮について。
LAN上のサーバはほぼ全部がVMWARE vSphere上で動いているので、バックアップ用に空いている物理マシンはない。仮想マシン上に構築する必要がある。
考えた方法は以下の3つ。
- バックアップマシンを2台用意して、それぞれにバックアップを取る
- バックアップマシンの対象ボリュームをDRBDで二重化する
- バックアップマシンの対象ボリュームを分散ファイルシステムで二重化する。
この中で検討を行い、やり方としては新しい分散ファイルシステムに挑戦してみることになった。分散ファイルシステムにもいくつか方法があるが、比較的管理が容易なGlusterFSで組んでみた。
構成的にはこんな感じ。この3台は用心のため別々のvSphereにインスタンスを生成する。
BackupServerはrsyncdだけ動かしておいて、GlusterFSで組んだ分散ボリュームをfuseを使ってマウントする。GlusterFSはレプリケーションを組んでおいて、一台が落ちたらもう一台に切り替えてマウントする(ここはノウハウがないので手動で対応する)。
172.16.10.50 +----------------------+ | [Backup Server] | | backup1.example.jp | | CentOS 7.4 | +----------------------+ | +----------------------+ | +----------------------+ | [GlusterFS Server#1] |172.16.10.51 | 1172.16.10.52| [GlusterFS Server#2] | | gluster1.example.jp +-------------+--------------+ gluster2.example.jp | | CentOS 7.4 | | CentOS 7.4 | +----------------------+ +----------------------+
GlusterFS Server側はOSのボリュームとは別に、ノード用のボリュームを用意する。LAN上のデータは20GiBにも満たないし、1世代しかバックアップしないのでノード用のボリュームは100GiBも用意すれば十分だろう。
3.GlusterFSのインストール
とりあえずインストール。1号機、2号機にそれぞれ同じ作業を行なう。
[root@gluster1 ~]# yum install -y centos-release-gluster
[root@gluster1 ~]# yum install -y glusterfs-server
[root@gluster1 ~]# systemctl start glusterd
[root@gluster1 ~]# systemctl status glusterd
[root@gluster1 ~]# systemctl enable glusterd
firewallを開けます。上からglasterd、brick(ノード)のポート、portmapper。
[root@gluster1 ~]# firewall-cmd --add-port=24007-24008/tcp --permanent --zone=public
[root@gluster1 ~]# firewall-cmd --add-port=49152-49153/tcp --permanent --zone=public
[root@gluster1 ~]# firewall-cmd --add-service=rpc-bind --permanent --zone=public
[root@gluster1 ~]# firewall-cmd --reload
DNSが飛ぶことを考慮し、/etc/hostsにそれぞれのノードを記載する
[root@gluster1 ~]# vi /etc/hosts
172.16.50.2 gluster1
172.16.50.3 gluster2
4.ストレージプールの作成
ここからボリュームをため込む器に当たるストレージプールを作成する。そのためにはそれぞれのノードを認識させる必要がある。
GlusterFSではそれぞれのノードがメタデータサーバに当たる機能を持っている。作業はgluster1からのみ行えばOk。statusサブコマンドえ自分以外のノードが見えれば作業は完了。
[root@gluster1 ~]# gluster peer probe gluster2
[root@gluster1 ~]# gluster peer status
5.Glusterボリュームの用意
それぞれのノードで最初に用意した別ボリュームをフォーマットする。CentOS7なのでxfsで作成する。
[root@gluster1 ~]# fdisk /dev/sdb
[root@gluster1 ~]# mkfs.xfs -i size=512 /dev/sdb1
[root@gluster1 ~]# mkdir -p /export/sdb1
[root@gluster1 ~]# monut -t xfs /dev/sdb1 /export/sdb/1
[root@gluster1 ~]# mkdir -P /export/sdb1/brick
[root@gluster1 ~]# echo "/dev/sdb1 /export/sdb1 xfs defaults 0 0" >> /etc/fstab
[root@gluster1 ~]# mount -a
次にレプリケーションボリュームを作成して起動する。gluster1のみでの作業となる。これによって「gv0」というレプリケーションされたglusterボリュームが作成される。
[root@gluster1 ~]# gluster volume create gv0 replica 2 gluster1:/export/sdb1/brick/gv0/ gluster2:/export/sdb1/brick/gv0/
[root@gluster1 ~]# gluster vol info
[root@gluster1 ~]# gluster volume start gv0
6.ボリュームのマウント
ボリュームはfuseを使ってマウントする。backup1にGlusterFS用のfuseドライバーを入れる。
[root@gluster1 ~]# yum install -y glusterfs-fuse
[root@backup1 ~]# mount -t glusterfs gluster1:/gv0 /srv/backup
7.ボリュームの追加
容量が足りなくなった場合は、ストレージプールにbrickを追加する。ただし、レプリケーション数の倍数になるように追加する必要がある。
[root@gluster1 ~]# gluster vol add-brick gv0 gluster3:/export/sdb1/brick/gv0 gluster4:/export/sdb1/brick/gv0
8.シャットダウン
一応どのノードが落ちても、レプリカの構成の1つが生きていれば大丈夫なはず。。。
backup1からマウントを外す(もしくはシャットダウン)してから、GlusterFSサーバを落とす順番になる。
一応これでDNS->backup1->glusterfs1/2の順でバックアップが作成される。最悪、必要なデータが取り出せる態勢にはなったので、一安心である。