データの紛失
このページはROMAのデータの紛失を説明します。
データの紛失とは何か?
ROMAには何百あるいは何千ものbucketを持ち、これにデータを格納します。そして、ROMAはデータを分割し、bucketによって冗長性を持ちます。
幾つかのサーバがダウンすると、それらのサーバに格納されていたbucketはROMAクラスタから紛失されます。一度に幾つかのサーバがダウンする可能性は低いです。しかし、もし適切に冗長性を回復しなかった場合、データの紛失に繋がる可能性があります。
つまり、操作のために冗長性の回復は重要です。
データ紛失の場合のROMAの挙動
起動オプションの設定によってデータ紛失に対するROMAの挙動を選択します。
参照 : 設定 - DEFAULT_LOST_ACTION
データ紛失の場合のプロセスのコピー
紛失されたデータの回復
データストレージとしてtcファイルを選択した場合、たびたびデータを復活することがあるかも知れません。
幾つかのマシーンがダウンしデータが紛失した場合、このデータはROMAから消去され、アクセスできません。
しかしtcファイルからデータを回復することができます。データの紛失が起きた時にどうやってデータを回復するかを説明します。
紛失状況の確認。
データの紛失状況は stat コマンドによって表示されます。
参照 : FAQ - Q. 紛失したvnodeとは何か?
> stat routing.lost_vnodes
データが紛失した時にデータを回復する方法
注意: もしauto_assignモードを設定し、"roma-ruby-client"をインストールしていない場合は、データ紛失のリカバリコマンドを実行する前に"roma-ruby-client" をインストールしてください
(クライアントのルートディレクトリ名は"roma-ruby-client"にし、ROMAディレクトリの中に配置しなければなりません。)
リカバリのメソッドはROMAの設定によって異なります(DEFAULT_LOST_ACTION)。
- auto_assign mode(デフォルト)
[no_action], [shutdown] および [auto_assign]で異なるポイント
-
no_actionとauto_assignとの違いはデータが紛失したbucketへのアクセスが可能かどうかです。no_actionの場合、アクセスは拒否されます。
一方で auto_assignはデータ紛失した場合に空のbucketが紛失したbucketに割り当てられるため、紛失したbucketにアクセスすることができます。 -
紛失したbucketが以前のデータと異なる可能性があります。この理由により、auto_assignのデータリカバリはデータのエラーが起きた後で既存のデータの上書きをしません。
ステップ
- 幾つかのダウンしたサーバのデータを集める。
- それらのデータをマージする(新しい更新データを生成する)。
- この更新したデータをROMAにアップロードする。
- (必要であればダウンしたインスタンをjoinする)
1. 幾つかのダウンしたサーバのデータを集める。
2. tcファイルのデータをマージする(新しい更新データを生成する)。
-
一つのマシーンにデータをコピーした後で、以下のコマンドで更新データを作成します。
引数は、[digest bit count], [bucket bit count], [tc file count of each instance], [TC directory' s path 1], [TC directory' s path 2], [output path]$ bin/mkrecent [digest bit counts] [bucket bit counts] [tc file count] [directory path which include data file(1)] [directory path which include data file(2)] [directory path which will make for new data directory]
注意: TCディレクトリのパスに関して、そのディレクトリのちょうど下にromaディレクトリ(./roma/*.tc)が含まれていなければなりません。
3. この更新したデータをROMAにアップロードする。
-
マージされたデータファイルを動作中のROMAサーバにアップロードする。そして、以下のコマンドを実行します。
$ bin/recoverlost [host name] [port No.] [merged data path] [time which error occured]
auto_assignモードの場合、データを紛失しても、ルーティングテーブルは自動的に更新されます。つまり紛失したbucketが存在しないように見えます。
もし紛失が起きた時間を特定できる場合、ROMAは変更履歴を検索し、紛失したbucketを特定することができます。
一方で auto_assignはデータ紛失した場合に空のbucketが紛失したbucketに割り当てられるため、紛失したbucketにアクセスすることができます。
So this time must not set remiss time. もし過去にデータの紛失の履歴がある場合、関係の無いbucketがアップロードされる可能性があります。 4. (Join down instance, If you need).
参照 : Roma の再構築 & 再起動
stat commandコマンドを使って全ての引数を調査することができます。
> stat routing.dgst_bits # digest bit counts
> stat routing.div_bits # bucket bit counts
> stat storages[roma].storage.divnum # tc file count
注意: このコマンドは二つのディレクトリだけをサポートします。
マージしなければならない3つ以上のディレクトリがある場合は、このステップを1つになるまで続ける必要があります。
- no_action あるいは シャットダウン モード
[no_action] と [shutdown]で異なるポイント
- no_actionの場合、ROMAは動き続けます。
- shutdownの場合、ROMAは全てのプロセスをシャットダウンします。
注意: それにより、幾つかのROMAのデータが(エラーが起きる前の)以前の状態にロールバックするかも知れません。
ですので、そうしたくない場合は、no_assignモードを使ってください。
ステップ
- "balse"を使うことで、既存のROMAプロセスを Killします。(シャットダウン モードでは必要ありません。)
- ルーティング ファイルをロールバックします。
- 全てのインスタンスを再起動します。
1. "balse"を使って生き残っているROMAプロセスをkillします。(シャットダウンモードでは必要ありません。)
2. ルーティング ファイルをロールバックします。
-
なぜロールバックが必要か?
- エラーが起きた直後にもしルーティング テーブルにエラー情報があると、ROMAは制限なしのbucketを使って再起動します。
- 初期状態の起動にはインスタンスがダウンした時点のルーティングファイルをロールバックする必要があります。
オペレーション
-
ROMAのルーティングデータは *.routeに格納されています。
もしルーティングテーブルがROMAが動作中に変更されると、ルーティングの差分は新しい *.routing ファイルに格納されます。
例*.routing *.routing.1 # new file will be created after error occured.
-
ルーティングのロールバックは最初のエラーが起きた後で生成されたファイルを削除することで完了するでしょう。
注意: この操作は全てのインスタンス上で実行される必要があります。
3. 全てのインスタンスを再起動します。
-
全てのインスタンスを再起動します。
もし "routing.lost_vnodes" が 0 になれば、回復は成功です!