【ゆるふわ勉強会報告】このバックアップには問題がある!

はじめまして。2016年4月に入社しました、新人エンジニアebiです。
今回は弊社で開催された第1回ゆるふわ勉強会より、yamasitaさんの発表内容を自分なりに再構成しつつ掲載します。
ゆるふわ解釈でまとめました。ごめんなさい。技術に詳しい方は本来の発表内容を汲み取ってください。

このバックアップには問題がある!

konobackup-thumbnail

バックアップに付きがちなネガティブなイメージ

・バックアップって不慮の事故・危険に備えるためのもの
 ⇒事故があった時にしかバックアップは使われない
・バックアップがちゃんと動くかどうかは検証しておく必要がある
 ⇒使わないかもしれないのに?め、めんどくさい……

そこで今回は、バックアップのイメージアップをご提案

問題なのはバックアップ作業が必ずしも必要ではない、と言うこと。寄り道みたいなイメージ。だから面倒臭いと感じてしまう。
そこで、バックアップをリハーサル作業の場として有効利用してみましょう。必要不可欠で頼れるものにイメージアップするはず!
konobackup

バックアップでリハーサルするとどうなる?

・バックアップが本当に動くかどうか?の検証ができる
・本番と同じ状態でリハーサルできる
・いつでも戻せる環境でリハーサルできて楽
・バックアップへの抵抗感を払拭

でもバックアップ作業って面倒だよね。どんな感じでやればいいの?

kono-backup-yaruo
今回の本題は良い感じにバックアップする方法を身に付けることです。
このコマンドを覚えて帰ってください。rsync

rsyncを使いこなそう

もしかしたら僕のように「rsync?なにそれ?おいしいの?」って人がいるかもしれません。本題に入る前に超基本を載せておきます。

rsyncとは?

ファイルやディレクトリの同期を行うアプリケーションソフトウェア。差分を調べるため動作が高速だったり、ミラーサイトとの転送が楽だったりするらしい。オプションも豊富。手持ちのUbuntu14.04でもすぐコマンドとして使えました。
この記事では、良い感じにバックアップをしていくために最低限覚えておくといいオプション等を紹介していきます。

rsyncの超基本

最初はどうやって使うのかも分かりませんよね。こんな感じで使います。

rsync -av ./source/ ./copy/

これでsourceディレクトリをcopyディレクトリとしてコピーしてくれます。
-avはよく使う超基本オプションです。-aと-vと言うオプションを重ねて指定してます。
-aはアーカイブモードと呼ばれます。-rlptgoDと言うオプションを付けたのと一緒です。コピー元のファイルと同条件でコピーしてくれます。
-vは処理の経過を表示してくれます。
以降、発表スライドに表記されたコマンドを大体コピペしてます。話に関係するもののみ少し解説していきます。その他オプション知らない方はググってください。

本番に影響ないように

バックアップをとるために本番のサーバに負荷をかけてしまっては良い迷惑です。適切なオプションを設定しておきましょう。
yamasitaさんの過去記事でも似た話してます。

rsync -av --rsync-path="ionice -c3 nice -n 19 rsync" --bwlimit=8192 --exclude-from=exc.txt ./source/ ./copy/

ioniceはディスクIOの使用状況に応じたそのプロセスの割り当て優先度を決めるオプション。
-c3はディスクIOが無い時だけそのコマンドを実行するというもの。最低優先度です。

niceはCPUの状況に応じたそのプロセスの割り当て優先度を決めるオプション。
-20~19の値があって、-20が最優先。つまりこちらも最低優先度の設定にしています。

bwlimitは帯域制限をするオプション。この場合、8192 KB/sとなっています。正直、一般的な基準を知りませんが、程々なんでしょう。

exclude-fromは不要ファイルを指定するオプション。カーネルインターフェース関連のものは要らないとのことです。

データベースには注意

例えばmysqlをコピーする時、コピーしている間にデータベースが書き換わって整合性が取れなくなるとヤバいです。気を付けましょう。

# 部分バックアップ
cat <<EOF > exc.txt
+ /var/
+ /var/lib/
+ /var/lib/mysql/
+ /var/lib/mysql/**

- *
EOF

rsync -av --exclude-from=exc.txt ./bkup/var/lib/mysql/ /var/lib/mysql/

前半のような感じでmysqlを指定しておくと、整合性が取れたデータがコピーできるまで繰り返してくれるとのことです。
頻繁にアクセスがあるようなサイトの場合は、dumpで別途バックアップを取って復元してください。

余計なことはせず、丸ごとコピー

一部をtarで固めたりしないで、ディレクトリツリーのまま持ってきてください。これも先ほどと同じ過去記事で似た話が出てます。

rsync -avz --numeric-ids --delete --exclude-from=exc.txt --rsync-path="ionice -c3 nice -n 19 rsync" root@bps_hoge:/ ./bkup/

ちょっとオプションが増えてごちゃごちゃしてきました。ここで重要なのは–numeric-idsです。ユーザID(UID)やグループID(GID)を保ってくれます。
また、rootで実行するowner情報も変更しないようにしてください。

差分で持ってこよう

丸ごとコピーするとは言え、いつも膨大なデータ量をそのままコピーしては大変です。差分だけ持ってきましょう。
kono-backup2

rsync -av --link-dest=$(pwd)/2016-06-26/ root@10.0.10.198:/data/ $(date +%F)/

–link-destで以前のバックアップを参照させます。すると、変更がないものはハードリンクとして保存し、変更のあるものだけ実体ごとコピーしてきます。
ハードリンクとして保存すると、中身は以前作成したものを参照するようなファイルになります。

因みにハードリンクであるか否かはlsコマンドですぐ分かります。-lを付けるとハードリンクの数を表示してくれます。2以上なら中身をハードリンクとして共有しているファイルです。-i1を付けるとinode番号が表示されます。inode番号が同じものはハードリンクで繋がっているファイルです。

以上がrsyncの基本オプションでした。良い感じにバックアップが取れそうな気がしてきましたね。

リハーサル作業をする前に

さぁ、バックアップも取ったしリハーサル作業するか……。ちょっと待ってください。
確かにハードリンクも活用して最低限の変更を持ってこれるようになったりして良い感じにバックアップできてます。でも、このままだとハードリンクを共有しているファイルを編集した時に、過去のバックアップも含めて変更が反映されてしまいます。それは困りますね。

Copy On Write使いませう

実はハードリンクとしてコピーしてくる時点で目的は半分達成しています。
後は書き換えが必要になった時にだけ、新しいデータとして作成していく態勢ができれば問題ありません。

overlayfsを使う

mount -t overlay overlay \
-o lowerdir=/mnt/servers/git/old/,upperdir=/mnt/servers/git/overlayfs/, \
workdir=/mnt/overlayfswork/ ./overlay

overlayfsとは、union filesystemの実装の一つで、ディレクトリを重ね合わせて1つのディレクトリツリーが構成できると言うものです。
lowerdirで重ね合わせ下層側のディレクトリを、upperdirで重ね合わせ上層側のディレクトリを、workdirで重ね合わせてマウントするためのディレクトリを指定しています。
ファイルを足す動作はupperdirにだけに反映されることになります。

vimなどの編集ソフト側で切る。

vimの場合

set bkc=auto,breakhardlink,breaksymlink

yamasitaさんも愛用するエディタ、vimでは上記のオプションで対処できます。
bkcはbackupcopyの略ですね。書き込み時に常にシンボリックリンクやハードリンクを切る設定になるとのことです。

Perlの場合

perl -i オプション

Perlスクリプトのiオプションは、ファイルの編集やバックアップに使用するものです。
-iの後に拡張子となる文字列を指定することで、新しいバックアップファイルの作成を、文字列を指定しなければそのファイルの編集が行えます。
この時にハードリンクが切られる、と言うことなのでしょう。

面倒ならcp

dockerに吸い上げてもよし。

tar -c . | docker import - hoge

ただ、これまで紹介してきた方法、実はファイルシステムで全部できるらしいです。zfs、btrfs等。
今回の勉強会では、この後ファイルシステムの話を他の発表者が行いました。そのうち別の記事で紹介されますよ。

まとめ

・バックアップは余計な作業じゃないよ!
 ⇒本番のリハーサルが気軽にできれば精神衛生上とても良いこと。
・バックアップの対象は全てファイルです
 ⇒ファイルの扱いに慣れるともっと楽になる。慣れれば数秒で戻したり進めたりできるはず。
とりあえずバックアップとっておこーってくらいになるといいね

発表者(yamasita)コメント

バックアップについて発表させていただきました。
最近はコンテナ管理ツールが発達していて、単純なバックアップをコンテナとして利用するのが簡単になったと思っています。
なので、「バックアップはするのも面倒、戻すのも面倒」という認識から
「いつでもコンテナとして起動できるイメージ」という認識へ変わってくれるとバックアップへのモチベーションが上がるのではないでしょうか?

本記事についてはebi君に作成して頂きました。
取り留めの無い発表でしたが、分かりやすくまとめて頂きありがとうございます。

後半、僕の力不足で段々と説明が雑になってきましたが、以上になります。
サムネイルには少し拘りましたが、そこまで時間はかけてません。許してください。
またそのうち記事書きます。精進しときます。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

ebi

1993年生まれ。宮崎出身。2016年に新卒のWEBエンジニアとして入社。慶應SFCの関係者が多い弊社ですが、僕は早稲田卒です。大学時代は情報系も混じった学科でしたが、結局専攻にはせず。エンジニア経験値不足のため、日々修行中です。趣味はダーツ・ビリヤード等。

ebiの書いた記事

インフラ
Docker入門日誌-その3- Rails開発編

2017年05月25日

インフラ
Docker入門日誌-その1- Hello World編

2017年05月22日

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ