十一回目の投稿です。今回の内容は、データの同期とバックアップに関するものです。
参画中の案件におけるシステムでは、突発的な障害に備え、様々なソフトウェアによる
データ同期とバックアップがリアルタイム/日次で行われています。直近の業務にて、
現状の同期とバックアップ設定で問題ないか(障害発生時に同期データとバックアップ
データを用いて障害発生前の時点に戻せるか否か)を調査する機会がありましたので、
その際に整理したデータ同期とバックアップに対する考え方を共有します。
◆ データの同期とリカバリ
データの同期について簡単に説明します。データの同期とは、あるサーバのデータを別の
サーバ上でも保持し、サーバ間において、それらの状態に差分がないように保つことを
指します。データの同期が行われる場面としては、例えば次のようなものがあります。
・2台のサーバAとサーバBで冗長化されたシステムにおいて、リアルタイムでAとBに同じ
状態(どちらも最新)のデータを保持させたいとき
→ クライアントからAとBのどちらにリクエストをしても、同じ状態のデータを用いた
処理が保証される
・本番環境にあるサーバから、別環境(他セグメントなど)にある同じ役割のサーバに同じ
状態のデータをコピーしたいとき
→ 本番環境のサーバがダウンしても、その時点で同期を外せば、別環境のサーバにて
サービスを継続できる
上述の例のように、データの同期はデータを複製するというニュアンスをもつため、データの
バックアップも兼ねると認識しがちです。しかし、「データを同期しているからデータの
バックアップは不要である」という考え方には注意が必要です。それが分かる例として、
次の状況を考えてみます。
・誤操作やファイルシステム破損などにより、あるディレクトリのデータが消えてしまった。
そのディレクトリが同期またはバックアップ対象だったとすると、その後の状況はそれぞれ
次のようになる。
【同期】: 消えた状態で同期されてしまうため、同期元と同期先からデータが消える
【バックアップ】: バックアップ元のデータは消えても、バックアップ先のデータは消えない
この例を考えると、データの同期とバックアップの差は明らかだと思います。データの同期とは、
「データが削除された状態を複製する」場合も含むため、「同期はしているがバックアップは
取得していない」環境だと、データがリカバリできない状況が起こりうることが分かります。
システムのリカバリ手順を整理する際などは、「有事の際にリカバリできるのだろうか」、
「同期対象のデータがあるが、これのバックアップは取得して いるのだろうか」といったことを
念頭に置くとよいと思います。
今回のメインの内容は以上ですが、補足として、簡単なデータ同期とバックアップの実現方法に
ついて紹介します。
◆ データ同期とバックアップの例
一般に、データの同期やバックアップには専用のツールを用いることが多いですが、ある程度の
ことはOSに標準的に備わっているユーティリティにて実現できます。本節では、あるサーバから
別のサーバに対し、データを同期/バックアップするユーティリティならびにそれらの使い方を
紹介します。なお、同期/バックアップ先のサーバにssh接続できることが前提です。
【データ同期の概要】
まずは、ファイルやディレクトリを同期するユーティリティであるrsyncについて記載します。
同期ツールではありますが、大容量ファイルのバックアップに使われることが 多いです。その
理由としては、後述するscpコマンドとは異なり、データの差分のみを同期するといった特徴が
あるためです。rsyncの代表的なオプションを記載します。
・-a: 同期元データのパーミッションを保持するオプションなど、複数の便利なオプションを
まとめて指定するためのオプションです。
・-u: 同期先データが同期元データより新しい場合は同期を行わないようにするための
オプションです。
・-v: データ同期の際に、同期状態の詳細を表示するためのオプションです。
・-z: データ同期の際に、データを圧縮して転送するためのオプションです。
より詳細な説明は、参考1が分かりやすいです。
【データバックアップの概要】
次に、データバックアップに用いるscpコマンドについて記載します。cpコマンドと併せて、
業務ではお馴染みのコマンドの一つかと思います(使用を非推奨とする案件/現場もある)。
scpコマンドを用いる理由としては、今回はネットワーク経由で別のサーバにバックアップを
取得する例を考えるためです。scpコマンドの代表的なオプションを記載します。
・-r: コピー元ディレクトリを再帰的にコピーするためのオプションです。
・-p: コピー元データのタイムスタンプなどを保持するためのオプションです。
このオプションをつけない場合、コピー先のデータのタイムスタンプは、
scpコマンドが実行された時刻となります。
・-C: データを圧縮してコピーするためのオプションです。
・-P: コピー先サーバのsshサービスが稼働しているポート番号を指定するための
オプションです。22番ポートを利用していれば指定する必要はありません。
実際の運用では、コピー先のファイル名の末尾に日付やホスト名、「.bk」などの識別子を加える
ことが多いです。
【実行例】
概要だけでは分かりづらいため、rsyncとscpコマンドの実行例を記載します。rsyncに関しては、
ssh接続またはrsyncデーモンによるデータの同期が実現できますが、今回は ssh接続を利用した
同期を例に挙げます。
※ 同期先のサーバには「alice」というユーザが存在し、このユーザを介した同期/バックアップを
行うものとする。また、同期先ディレクトリでは、ユーザ「alice」によるパーミッション変更
などの操作が許可されている必要がある。
・ローカルの/home/parallels/test_dir/内(同期元ディレクトリ)のデータを別のサーバの
/tmp/test(同期先ディレクトリ)に同期したいとき
# rsync -av /home/parallels/test_dir/ alice@<同期先サーバのIPアドレス>:/tmp/test
・ローカルの/home/parallels/test_dir/内(同期元ディレクトリ)のデータを別のサーバの
/tmp/test(同期先ディレクトリ)にコピーしたいとき
# scp /home/parallels/test_dir/* alice@<同期先サーバのIPアドレス>:/tmp/test/
(この場合はほぼコピーといったところですが)データの同期とバックアップについて、その
動作を確認しました。定期的な同期/バックアップといった実用的な処理については、ジョブ
管理ソフトや cronなどと組み合わせることで実現できます。
◆ 感想など
データの同期とバックアップとの間には、その目的に違いがあることを改めて確認しました。
また、考え方を整理するにあたり、「同期とバックアップの違い」といった文言でweb 検索
しましたが、意外にも日本語記事のヒット数が少なかったことは印象に残りました。
◆参考