Tech Sketch Bucket of Technical Chips by TIS Inc.

Amandaを使ってバックアップ(自作スクリプト呼出編)

Pocket

前回の記事ではAmandaの概要と導入までをご紹介しました。
実際の運用では「バックアップ前にサービス停止させ、完了後は自動的に再開したい」といったバックアップに連動して追加で実行したい処理がいくつも出てきます。
一般的なサーバであれば、こうした前処理→バックアップ→後処理の一連の工程はジョブコントローラ側から制御するように構築します。Amandaは標準で特定のタイミングに自作の処理を呼び出す機能を備えており、ジョブコントローラなしで上記処理の実装が可能です。


Amandaから自作スクリプトの呼出設定

自作スクリプトをAmandaの処理に連動させて起動するためには、いくつか設定の追加が必要になります。
ここでは、基本設定は完了している前提で、設定追加/変更部分のみ紹介します。

バックアップ前後で実行したいスクリプト

1. stop_script (サービス停止)
2. start_script(サービス起動)

※サービス停止/起動&Apacheの設定変更(メンテナンス告知画面表示の切り替え)などやっています。

スクリプト本体は実行させる端末の/usr/libexec/amanda/application内に配置する必要があります。今回はクライアント側にスクリプトファイルを配置します。

1. amanda.conf
スクリプト名・実行タイミングなどを定義するscript-tool定義と、実行するscript-tool名を指定したdumptype定義を最終行に追加します。実行タイミングはamcheck、amdump、amrecoverの各コマンド実行中の 特定のタイミング(公式Wiki参照) となりますが、全部で17種類と細かい設定が可能です。

2. disklist
amanda.confに追加した新しい定義:comp-root-tar-scriptedをバックアップ方式に指定します。

以上でamdump実行時、自作のmyscriptが呼び出されるようになります。

実行時のハマリどころ色々

いざバックアップを実行してみると・・・見事色々ハマりました。途中、実験してみた結果も含め、紹介してみたいと思います。
flow.PNG

1) スクリプト実行中に「許可がありません」エラー

スクリプトの実行ユーザは「amandabackup」という一般ユーザなので、実行前に適切な権限設定をしていないと「mv: cannot move ~: 許可がありません」などのエラーになってしまいます。
単純にamandabackupの権限不足が原因なのでパーミッションやsudoersの設定等で直りました。なお、sudoを使っている場合はsudoers設定時の許可コマンド追加だけでは「sudo: sorry, you must have a tty to run sudo」エラーとなってしまったため、併せて「Defaults requiretty」をコメントアウトする必要がありました。

2) バックアップ処理中にエラーが発生すると後続のスクリプトが起動しない

バックアップ処理中にディスクフル等でエラーが発生すると、バックアップ後実行(post-dle-backup)のスクリプトが起動せず、サービスが停止したままになってしまいました。エラー発生時点でエラー処理に入ってしまうためにその後実行されるはずだったpost-系のスクリプト実行までたどりく前に処理終了となってしまうのが原因です。
残念ながらscript-tool設定では「エラー時に実行する」といった設定項目は存在せず、amdumpの起動スクリプト内でam終了ステータスを拾って対応することにしました。エラー発生時はクライアント側のスクリプトをSSH経由で呼び出しています。(上の処理フロー図点線で囲まれた部分参照)。

3) 終了ステータス:STRANGE

標準出力しているスクリプトを起動させると、処理そのものは正常終了しているにも関わらず、amcheckコマンドとamdumpコマンドが正常終了しないという事象が発生しました。下表のように特定の起動タイミングでクライアント側スクリプトを起動させた場合に起こるようです。

execute-on execute where
client server
pre-dle-amcheck, pre-host-amcheck,
post-dle-amcheck, post-host-amcheck
ERROR: app_sv: unknown response 正常終了
pre-dle-estimate, pre-host-estimate,
post-dle-estimate, post-host-estimate,
pre-dle-backup, post-dle-backup
ステータス:STRANGE
post-host-backup, pre-host-backup -(設定不可)

公式wiki の記述によると、pre-dle-amcheck、pre-dle-estimate、pre-dle-backupのタイミングにクライアント側で実行されたスクリプトの標準出力を後続の処理に引き渡す機能があり、それを使うためには「PROPERTY key_str value_str」という形式で出力する必要があります。この形式に当てはまらないメッセージが出力されていたのがエラー原因のようです。先述した3つのタイミング以外でもエラーとなるのは、共通のスクリプトAPIを使っているためでしょう。
対策としては単純に「PROPERTY key_str value_str」に当てはまらない出力をさせている部分を「>/dev/null 2>&1」なり、ログファイルにリダイレクトさせるなりで画面に出力しないようにすることです。原因となったメッセージはレポート内に表示されるため、アタリはつけやすいと思います。

まとめ

Amandaのスクリプト呼出は処理間の先行関係や例外処理といった複雑な定義は出来ないものの、クライアント毎に微妙に異なるバックアップ完了時点やリカバリ時テープ交換の間といったcronで実現するのは難しいタイミングの設定が可能という利点があります。標準機能だけでジョブのスケジューリングを実現可能なので、ジョブコントローラを利用するまでも無いような簡易的なシステムで使うにはちょうどいいお手軽さではないでしょうか。

次回はPostgreSQLのオンラインバックアップについてご紹介します。

エンジニア採用中!私たちと一緒に働いてみませんか?