CentOS7のLVMバックアップ作業をPythonで自動化してみた

シェアする

この記事は、下の2つの記事が前提となっておりますので、xfsdumpやLVMスナップショットをご存知ない方はぜひ読んでみてください。

長い間、面倒でなかなか踏み出せなかったバックアップの一歩. コピーするファイルを選んだり、いろいろ時間かかるだろうと思っていたが、意外と簡単なコマンドでフルバックアップを取ることができた.
前回はサーバーを止めてからすべてのバックアップを取る方法を紹介しました。しかし、毎日バックアップを取るなら、いちいちサーバーを止めてはいられないですよね。そこで、CentOS7の標準的な環境においてサーバーを止めずにバックアップを取る方法を紹介します。

さて、前回までの記事でサーバーを停止せずにフルバックアップを取る方法を学びましたが、スナップショット領域を作成したり削除したりといろいろ面倒です。面倒なことは自動化するのが鉄則ですよね。ということで、今回はこのバックアップ作業を自動化したいと思います。

スポンサーリンク

バックアップポリシー

いくらデータ消失が不安だからといって、毎日フルバックアップを行うのは、ストレージや負荷の面から現実的ではありません。xfsdumpでは差分バックアップを取れますので、私は次のような方針でバックアップを取りたいと思います。

  • 3月と9月の第一火曜日にフルバックアップ
  • 毎週水曜日にはフルバックアップとの差分バックアップ
  • それ以外の日には水曜日のバックアップとの差分バックアップ

なお、日付の判定は複雑になるのでPython側で行い、同じスクリプトを毎日一定の時刻にcronで呼び出すようにします。

コード

コードをいくつかの部分に分けて紹介します。結構前に書いたコードで命名規則がpythonっぽくないですが、ご容赦ください。なお、コピペで済ませたい人は、最後にまとめてコードと変更すべき箇所を書いているのでそちらをご覧ください。

import

使うのでimportします。subprocessはシェルを実行するために、datetimeは日付判定のために、sysはexitのために、osはファイル関係の操作のためにです。

バックアップレベルの判定

この部分ではdatetime型の変数dtを用いて「フルバックアップを行うか」「Lv1バックアップを行うか」を判定し、レベルの数字を返しています。フルバックアップは0です。

曜日判定を関数にすることで見通しが良くなります。自分好みに変えてみてください。

ファイルの命名

dumpファイルの名前に日付やレベルや場所の情報を入れて分かりやすくします。これらの情報を含めておかないと復元のときに面倒です。

各種コマンド

スナップショットを取ったり消したりなどのコマンドを、メソッドにして定義しておきます。

まず定数を宣言しておきます。

snap_path_prefixは、スナップショットのマウント先となるパスの前につくやつです。backup_devはバックアップを保存するディスクで、backup_pathにマウントされます。vg_nameはスナップショットのボリュームグループ名です。

基本的に変える必要がありそうなのは、backup_dev(とbackup_path)くらいですね。それ以外はそのままで大丈夫だと思います。

コードを見てもらえれば詳しい説明はいらないかと思いますが、ざっくり解説します。

各メソッドでは、subprocess.runを用いてシェルのコマンドを呼び出しています。snap_nameとはスナップショットの名前、snap_pathとはスナップショットへのパスです。

多分、これらのメソッドをどのように呼び出して使っているかを見てみたほうが早いと思うので次に進みます。

バックアップ

これまで用意してきたメソッドを用いて実際にバックアップの処理をしている部分です。

targetは、第1要素がバックアップ対象の領域の名前(自由)で、第2要素がその領域のパスとなるようなリストのリストになります。ここは、自分の環境に合わせて適宜変更してください。

バックアップファイルを保存するディスクをマウントして、スナップショットを撮ったあと、それをマウントして、xfsdumpでダンプをとった後、そのdumpファイルを圧縮するという流れです。これをバックアップ対象の領域の数だけ繰り返しています。すべて完了したら、バックアップファイルを保存するディスクをumountします。

まとめると…

下のスクリプトを適当な場所に配置して、cronで適当な時間(深夜か早朝あたり)に呼び出してください。あくまで一例ですが、普段は2時間くらいで完了します。(フルバックアップ時はかなり時間かかりますが)

こうなります。コピペで済ませたい人も多いので最低限変更するべき箇所をまとめると、

  • backup_dev
  • backup_path
  • vg_name
  • バックアップポリシーの箇所(何曜日にどのレベルのバックアップをするか)
  • target

あたりです。

おまけ

上のスクリプトには載せていませんが、バックアップの進行状況をPushoverなどで通知すると、失敗時にすぐ分かるので便利です。Mastodonとかに通知するのもいいかもしれませんね。

「通知」というと普通は、スマホのLINEやニュースアプリなどのプッシュ通知を指すかと思いますが、このPushoverというアプリは、スマホア...

最後に

お疲れ様でした。

バックアップは重要ですが、毎回マニュアルに沿って同じ作業を繰り返すのはミスを誘発しますし、エンジニアらしくありませんから、面倒な部分は自動化してより本質的な部分に集中できるようにしたいものですね。

(紹介したスクリプトは私の自宅サーバーで使用しているものですが、利用は自己責任でお願いします。)

スポンサーリンク

シェアする

フォローする