ARCserveのRHAとBackupを使用しているのだが、バックアップがスタートするとレプリケーションが自動で停止して、バックアップが終了すると自動で再開する機能があると聞いていたので、先日実際に試してみたのだが、見事に期待を裏切られることとなった。
この連携機能は、すべてのバージョンで有効なのではなく、最新版同士とか制限があるようで、ウチのように一方のバージョンが古いと連携してくれないそうだ。。。
というわけで、ならば無理くり連携させてやろうじゃないか!というワケで、PowerShellのスクリプトを使って、連携させてみた。
Contents
連携方法
環境としては以下通り。
サーバーA(バックアップ用)
サーバーB(レプリケーションのコントロール)
サーバーC(マスタ(ファイル)サーバー)
サーバーD(レプリカサーバー)
C→Dでレプリケーション
D→Aでバックアップ
サーバーDのバックアップは毎日同じ時間に開始されるので、その2分前にレプリケーションを停止するタスクをサーバーBに設定する。
RHA PowerShellをインストール
(サーバーBでの作業)
ARCserve RHA の管理用コマンドラインインターフェースとして、RHA PowerShellをインストールする必要がある。RHAを新規インストールするときに入れてなければインストールしよう。当然、Windows PowerShell 1.0 や 2.0の上で動くスナップインなので、Windows PowerShellがなければ意味はなさない。
パスワードファイルの作成
(サーバーBでの作業)
スクリプトの中に直接パスワードを書き込まないため、パスワードファイルを作成。
先ほどのRHA PowerShellを起動して、次のコマンドを打つ。
PS> read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
入力待ち状態になったら、RHAのコントロールサービスに接続するユーザーアカウントのパスワードを入力すると、エンター直後にCドライブ直下にsecurestring.txtというファイルが作成される。
レプリケーションを一時停止させるスクリプト
(サーバーBでの作業)
まずは、実行中のレプリケーションを一時停止させるスクリプトを作成。メモ帳などで下のスクリプトを入力し、拡張子ps1で保存する。
add-pssnapin XOPowerShell $pass = cat <パスワードを書き込んだファイルへのPath> | convertto-securestring $mycred = new-object -typename System.Management.Automation.PSCredential -Argumentlist "<ドメイン名>\<ユーザー名>",$pass Connect-XO -Host <bサーバー名かipアドレス> $mycred -protocol http suspend-scenario "<レプリケーションのシナリオ名>" <dサーバー名かipアドレス></dサーバー名かipアドレス></bサーバー名かipアドレス>
最後の行以外は、コントロールサービスに接続するための記述なので、他の操作を行うときにも流用できる。
なお、一時停止ではなく、停止の場合は、stop-scenarioとすれば停止となる。
タスク実行用のバッチスクリプトを作成する。
(サーバーBでの作業)
C:¥Windows¥SysWOW64¥WindowsPowerShell¥v1.0¥powershell.exe –Noninteractive –command set-executionpolicy RemoteSigned; <.ps1ファイルへのパス>
ちなみにSysWOW64の部分は、OSが64bitの場合。32bitではsystem32になる。
以上で、準備は完了。
Bサーバーのタスクマネージャーでバックアップが始まる2分ほど前にスクリプトが実行されるように設定すれば、バックアップ開始前にレプリケーションが停止する。
ここまでは、何の問題もない。考えなければいけないのは、バックアップが終了したときに、レプリケーションを再開させる方法。バックアップはいつ終わるのかは、毎回不定なので、時間で指定するのはあまりよろしくない。
ARCserve Backupのアラートマネージャでイベントを投げる
(サーバーAでの作業)
RHAのコントローラー側で、Backupのジョブ終了と検知できれば、レプリケーションを再稼働させることができるのだから、単純にサーバーBで、そのイベントを受け取ればよい。
幸いARCserve Backupには、アラートマネージャーが標準で入っており、他のサーバーのWindowsイベントログに投げてやることができる。そして、そのイベントログの内容から、レプリケーションを再稼働して良いかどうかを判断してやれば、バックアップ終了と共にレプリケーションが再開できるという寸法だ。
レプリケーションを再開させるスクリプトを作成
(サーバーBでの作業)
サーバーBのイベントビューアーで「Windows ログ」-「アプリケーション」をみると、ARCserveから送られたイベントは、「Alert Notification Server」というソースで表示される。
ただし、バックアップの完了だけでなく、失敗などのイベントも同じソースで飛んでくる。
そこで、イベントの内容を判断して、レプリケーションを再開するスクリプトを書いたps1ファイルを作成する。
add-pssnapin XOPowerShell $pass = cat <パスワードファイルへのパス> | convertto-securestring $mycred = new-object -typename System.Management.Automation.PSCredential -Argumentlist "<ドメイン名>\<ユーザー名>",$pass Connect-XO -Host <サーバー名> $mycred -protocol http $logArry = Get-EventLog -LogName "Application" -Source "Alert Notification Server" -Newest 1 | Select-Object Message if ($logArry.Message -LIKE "検索文字列 ※1"){ $stateArry = Get-State 192.168.0.10 $myState = $stateArry | Where {$_.Name -eq "<レプリケーション名>"} if ($myState.State -eq "実行中"){resume-scenario "<レプリケーション名>" <レプリカサーバー名かIPアドレス>} }
この方法がベストかどうかはわからないが、送られてきたイベントのメッセージ内容をみて、バックアップが完了したかどうかを判断する。
※1の部分は、バックアップジョブ名と「完了」という文字を検索できるようにする。送られてくるメッセージは [ジョブ ID:223 差分データ] バックアップ 処理が完了しました。]といったような文章なので、"*差分データ*完了*"などで良いと思う。
バックアップが完了したというメッセージを受け取ったら、今度はレプリケーションの状態を取得し、再開させたいレプリケーションが実行中であれば、レプリケーションを再開させる。
なぜ、状態をチェックするかというと、レプリケーションそのものが停止している場合は、resume-scenarioのコマンドを打ってもエラーで返ってくるからだ。
例えば、レプリケーションのレプリカでマスタの削除ファイルを保持するような場合、定期的に同期を行わないと保存容量が大きくなってしまう。
従って、週に1回フルバックアップを取った後に、マスタとレプリカの同期を行いたいような場合は、フルバックアップの前にレプリケーションを停止させ、フルバックアップが終了した時点で、レプリケーションをファイル同期で稼働させてやるという運用を行ったりする。
この場合、停止しているレプリケーションのステータスは「停止: Stopped by User」となっているので、ステータスチェックで場合分けをして対処しなければいけない。
レプリケーションの稼働と再開を使い分ける
上記理由から、スクリプトを次の様に変更した。
add-pssnapin XOPowerShell $pass = cat C:\securestring.txt | convertto-securestring $mycred = new-object -typename System.Management.Automation.PSCredential -Argumentlist "<ドメイン名>\<ユーザー名>",$pass Connect-XO -Host <サーバー名かIPアドレス> $mycred -protocol http $logArry = Get-EventLog -LogName "Application" -Source "Alert Notification Server" -Newest 1 | Select-Object Message if ($logArry.Message -LIKE "*バックアップジョブ名*完了*"){ $stateArry = Get-State <マスタホスト名かIPアドレス> $myState = $stateArry | Where {$_.Name -eq "<レプリケーション名>"} if ($myState.State -eq "実行中"){ resume-scenario "<レプリケーション名>" <レプリカホスト名かIPアドレス>} elseif($myState.State -Like "停止*"){ Run-scenario -Name "<レプリケーション名>" -Mode F -Ignore 1} }
あまり美しくはないが、こんな感じで上手くいく。