レプリケーションとリカバリの実装

トランザクション処理アプリケーションは一連のデータベース更新を行います。GT.Mは、これらのアップデートをオンラインまたはデータ駆動ロジック(一般的に「バッチ」と呼ばれます)から実行します。

  1. オンライン・アップデート:オンラインアップデートは、クライアントからのメッセージとしてGT.Mに届きます。

  2. 一日の終わりでの残高などの内部情報、または、決済機関からの小切手のリストなどの外部情報によって駆動されます。

それぞれのケースの処理モデルは、クライアント入力により、1つのトランザクションまたは1つの開始作業単位があり、例えば、1つの口座から別口座へ資金を転送する要求のように、または、次の論理的な仕事単位としてあり、例えば、次の口座に利息を転記するようなものです。この一般的なモデルは、ユーザーが(おそらくワークステーションからのターミナルエミュレーションを使用して)ホストに直接ログインするアプリケーションと、クライアントがホストサーバープロセスと通信するアプリケーションの両方を保持します。このセクションでは、トランザクション処理アプリケーションのキーとなる考慮事項を示します:

アプリケーション アーキテクチャ

FISでは、LMSアプリケーションのアーキテクチャを設計する際に、データベースの整合性を事前に計画することをお勧めします。アプリケーションのアーキテクチャの計画パラメータには、次のものがあります:

  • TSTARTコマンドとTCOMMITコマンドを使用して、アプリケーション・ロジックのレベルで一貫性のあるトランザクションにすべてのデータベース更新を常にパッケージ化します。コマンドの詳細については、『GT.M Programmer 's Guide』の"コマンド"の章を参照してください。パッケージ化されていない更新については、データベースを更新するすべてのMステートメントの終わりにデータベースが論理的に一貫していることを確認してください; データベースがクラッシュした後に回復するときに、アプリケーション・レベルの整合性をチェックして復元するアプリケーション・ロジックがあることを確認します。

  • 内部駆動のバッチ処理が、最後にコミットされたトランザクションから再開するために中断されたバッチオペレーションを有効にするために、データベース内に十分な情報を保存することを、確認してください。バッチ処理の途中で元のインスタンスが失敗した場合、新しいオリジナルのインスタンス(以前は複製インスタンス)が通常は再開し、バッチ処理を完了する必要があります。

  • もしアプリケーションがデータベース内の情報からバッチプロセスを再起動できない場合、またはバッチが開始される直前にデータベースのスナップショットを複製インスタンスにコピーします。オリジナルのインスタンスが失敗した場合は、新しいオリジナルのインスタンスをバッチ処理の先頭に復元し、新しいオリジナルのインスタンスの先頭からバッチ処理を再開します。

  • 外部駆動のバッチ処理も再開していることを確認してください。バッチ処理を実行する外部ファイルは、オリジナルのインスタンスでバッチ処理を開始する前に、複製インスタンスで使用可能でなければなりません。これは、バッチ処理中にオリジナルのインスタンスの失敗を処理するために必要です。

  • GT.Mは、インスタンスファイルによって定義された一連のデータベースファイル以外の更新に対してエラーを生成します。外部参照はそのように禁止されていません。つまり、外部参照更新がインスタンス内に収まり、正しく動作するグローバルディレクトリとインスタンスの構成が存在する可能性があります。インスタンス外の読取り参照は、現在レプリケーションに関与していないため許可されています。

論理的なデュアルサイトアプリケーションのアーキテクチャを示します。

この図は、階層化された環境でバッチ更新とオンライン更新を確実に実行できるアプリケーション・アーキテクチャを示しています。これは、メッセージ・トランスポート(カットオーバ後に現在のオリジナル・インスタンスへの通信を再ルーティングできるようにする必要があります)経由でのオンライン更新と、外部ファイルを経由したバッチ更新(カットオーバー後に現在のオリジナル・インスタンスで使用可能にする必要があります) を扱います。

アプリケーション・サーバーは、メッセージ・トランスポートを通じて提供されるメッセージを受け入れ、処理し、応答するGT.Mプロセスです。それらは、ノードのサイズとアプリケーションのニーズによって決まる「クラウド」のサイズのアプリケーション・サーバーの束として存在する可能性があります。オリジナルのインスタンスでは、アプリケーション・サーバー・プロセスがメッセージを受信し、アプリケーション・トランザクションを処理します。アプリケーション・ロジックは、TSTARTコマンドと一連のSET(KILLおよびMERGEコマンド)を発行して、データベースを[潜在的に/暫定的に] 更新した後、TCOMMITコマンドを発行してトランザクションを終了します。プロセスは直接応答を書き込むかもしれませんが、別のプロセスがデータベースレコードからその応答を取り込んでそれを発信者に送るエージェントとして機能することがあります。

メッセージ配信システムの実装

このセクションでは、オリジナルのインスタンスがTCOMMITの後で失敗する例を使用して、システムが応答を生成してクライアントに送信する前に、うまく設計されたメッセージング・システムがアプリケーションのアーキテクチャーをより切り詰めにする方法を説明します。

前のセクションで説明したように、オリジナルのインスタンスのアプリケーション・サーバーは、階層環境でのオンライン操作のためにネットワーク経由で配信されたクライアントからのメッセージに応答します。各クライアントメッセージは、サーバー上でゼロ(照会)または更新トランザクションを発生します。ネットワーク配信メッセージは堅牢でなければならない。つまり、各メッセージは、オリジナルのインスタンスのアプリケーション・サーバーに正確に1回配信されるか、配信失敗のクライアント通知になります。メッセージング・システムは、クライアントがメッセージを送信した後、オリジナルのインスタンスがメッセージを受信する前に、オリジナルのインスタンスでの障害などの状況を処理する必要があります。インスタンスがオリジナルのインスタンスであるか、またはインスタンスを複製しているかをいつでも決定する論理にメッセージ配信システムを統合することにより、リスクが軽減され、時間の経過とともに切り替わります。

アプリケーションロジックは通常、トランザクションのTCOMMITの直後に生成された応答でクライアントメッセージに応答します。アプリケーションとメッセージアーキテクチャは、TCOMMITの後で、システムが応答を生成してクライアントに送信する前に、オリジナルのシステムが失敗するシナリオを処理する必要があります。このようなシナリオでは、クライアントは応答を待って最終的にタイムアウトし、メッセージを再試行します。

LMSアプリケーションは、メッセージ構造に一意のメッセージ識別子(MSGID)を設定し、アプリケーションがTCOMMITの一部としてデータベースにMSGIDを含めるように設計することで、この状況を処理できます。

もしオリジナルのインスタンスがトランザクションをコミットした後にクラッシュすると、オリジナルのレプリケートインスタンスが新しいオリジナルのインスタンスになります。この新しいオリジナルのインスタンスは、クライアントから同じMSGIDを持つ再試行されたメッセージを受け取ります。この場合、次のいずれかが発生する可能性があります:

  • データベースは、メッセージ内のMSGIDに対応するトランザクションが処理されたことを示します。サーバーは、その後、このトランザクションが処理されたことを応答することができました。より洗練されたアプローチでは、トランザクション内のクライアントへの応答を計算し、トランザクション・コミットの一部としてデータベースに格納します。以前に処理されたメッセージの再試行として識別されたメッセージを受信すると、サーバは記憶された応答をデータベースからクライアントに返します。

  • データベースは、未処理としてトランザクションを示します。この場合、新しいオリジナルのインスタンスがトランザクションを処理します。現時点では、以前のオリジナルのインスタンスがトランザクションを処理するかどうかは不明です。もし処理されなかったならば、問題は発生しません。もし処理されたが複製されなかった場合、GT.Mのロールバックロジックはオリジナルのインスタンスが複製インスタンスとして現れたときにロールバックし、手動または自動でロールバック・レポートから調停する必要があります(1回目の処理の結果が2回目の処理の結果と異なる場合があるため)。

システム要件

このセクションでは、LMS構成のアプリケーションを実装するために必要なシステム要件について説明します。

ルートプライマリステータスの識別

GT.Mは、インスタンスの生成操作または複製操作に関する決定を行いません。アプリケーションの起動時にインスタンスを現行のオリジナルのインスタンスとして識別するには、明示的に -ROOTPRIMARYを指定する必要があります。

継続的に利用可能な堅牢なアプリケーションを実装するには、各アプリケーション・インスタンスが正しい状態になる必要があります。具体的には、任意の時点で1つの発信インスタンス(-ROOTPRIMARY)が正確に存在する必要があります。レプリケートされたデータベースに対するすべてのデータベース更新操作は、オリジナルのインスタンスで行われなければなりません。LMSは、オリジナルのインスタンス以外のインスタンスで独立した論理データベースの更新を禁止します。

[注意] 注意

MUPIP BACKUP -ONLINE および MUPIP REORG -ONLINE は、論理データベースの内容ではなく、制御情報または物理的表現を更新し、複製インスタンスで自由に動作できます。

カットオーバー

カットオーバーは、複製インスタンスが現在のオリジナルのインスタンスとして引き継ぐように、LMSアプリケーションを再構成するプロセスです。これは、ハードウェア保守のためにオリジナルのインスタンスを停止するなどの計画されたアクティビティーである可能性があります。また、オリジナルのインスタンスまたはオリジナルのインスタンスへのネットワークがダウンしたときに、アプリケーションの可用性を維持するなど、計画外になる可能性があります。

カットオーバーの実装と管理はGT.Mの範囲外です。FISでは、カットオーバを設計する際に、次のルールを遵守することを推奨しています。

  1. すべてのデータベース更新が発生した時点で、オリジナルのインスタンスが1つしか存在しないようにしてください。もしオリジナルのインスタンスがない場合は、LMSアプリケーションも使用できません。

  2. カットオーバー中にクライアントから受信したメッセージが拒否されるようにして、クライアントがタイムアウトして再試行するか、バッファリングして新しいオリジナルのインスタンスに送信するようにします。

  3. 操作を再開するか、クラッシュ後にオンラインに戻るたびに、オリジナルのインスタンスが常に複製インスタンスとして動作するように設定します。

  4. これらの規則に従わないと、オリジナルのインスタンスとその複製インスタンスの間でデータベースの一貫性が失われる可能性があります。

[重要] 重要

カットオーバーは、ビジネスの継続性を最大限に高めるための健全な慣習です。FISは、基盤となるプラットフォームのエラーに起因する混乱に直面してGT.Mアプリケーションを維持するためのカットオーバーメカニズムを設定することを強く推奨します。運用上の制約のためにカットオーバが実行可能でない環境では、アプリケーションのインスタンスフリーズメカニズムを設定することを検討してください。詳細については、“インスタンスフリーズ”を参照してください。

インスタンス・フリーズ(Instance Freeze)

空のディスクスペース、I / O問題、ディスク構造の損傷などのような実行時の状況では、GT.Mアプリケーションの機能を危険にさらさない限り、いくつかの運用方針ではメンテナンスを都合のよい時間に延期することを推奨します。たとえば、ジャーナル・ファイル・システムのディスク領域が不足すると、GT.Mはジャーナリングをオフにしたまま操作を継続し、ジャーナリングが復元されるまでレプリケーションWAS_ON状態に移行します。もしあるデータベースファイルまたはジャーナルファイルに問題がある場合、他のデータベース領域を更新するプロセスは正常に動作します。

いくつかの運用方針では、そのようなイベントでGT.Mアプリケーションを停止して、迅速にメンテナンスを実行する方が望ましいです。このような環境では、GT.Mには「インスタンスフリーズ」というメカニズムがあります。

インスタンス・フリーズ・メカニズムは、プロセスがジャーナルまたはデータベースファイルへの書き込み中にエラーを検出するとすぐに、インスタンスの領域(Region)上のすべての更新を停止するオプションを提供します。このメカニズムは、このようなエラーが発生した後に起こりうるシステム・クラッシュからアプリケーションデータを保護します。

環境変数 gtm_custom_errors は、インスタンスの領域上のすべての更新を自動的に停止する必要があるエラーのリストを含むファイルへの完全なパスを指定します。エラーリストには、GT.M メッセージとリカバリーガイドのエラー・ニーモニック(1行に1文字と大文字)が含まれています。GT.Mディストリビューションキットには、gtm_customer_errors環境変数のターゲットとして使用できるcustom_errors_sample.txtファイルが含まれています。

[注意] 注意

インスタンスのフリーズ動作用に構成されたプロセスの一部であるプロセスがジャーナリングでエラーを検出すると、インスタンスがフリーズし、gtm_custom_errors環境変数が設定されていなくても独自のエラートラップが呼び出されます。

インスタンス・フリーズのメカニズムは、インスタンスの任意の領域(Region)で選択的に有効にすることができます。例えば、患者または財務記録を表す領域(Region)は、インスタンス・フリーズに適しているが、それに反して、容易に再構築された相互参照インデックスを有する領域はそうではない可能性があります。インスタントフリーズが有効になっている領域(Region)があるかどうかにかかわらず、インスタンスを即座にフリーズすることもできます。

MUPIP SET - [NO]INST[_FREEZE_ON_ERROR] [-REGION | -FILE] は、領域(Region)内のカスタムエラーを自動的にインスタンス・フリーズさせるものです。MUPIP REPLICATE -SOURCE -FREEZE={ON | OFF} -[NO] COMMENT[= '"string"'] は、領域(Region)がインスタンス・フリーズを有効にしているかどうかにかかわらず、インスタンス上のインスタンス・フリーズを即座に設定または解除します( MUPIP SET - INST_FREEZE_ON_ERROR)。

複製された環境にないプロセスは、$gtm_custom_errorsを無視します。カスタムエラー・ファイルのエラーは、複製された領域(Region)の1つにコンテキストを持っていなければならず、エラーを認識するプロセスはレプリケーション・ジャーナル・プールを開いている必要があります。たとえば、UNDEFのようなエラーはインスタンスに関連していないため、インスタンス・フリーズを引き起こすことはできません。また、スタンドアロンのMUPIP操作では、インスタンスがレプリケーション・ジャーナル・プールにアクセスできないためインスタンス・フリーズを引き起こすことも尊重することもできないことも意味します。レプリケーション・ジャーナル・プールにアクセスできるプロセスは、カスタム・エラー・ファイルがなくてもインスタンス・フリーズを開始できない場合でも、インスタンス・フリーズを守る必要があります。

エラーに応じて、インスタンス・フリーズを削除するのはオペレータ駆動型または自動型です。GT.Mは、ディスク容量がないために配置されたインスタンス・フリーズを自動的に削除します; 他のすべてのエラーについては、オペレータの介入によってインスタンス・フリーズを手動でクリアする必要があります。たとえば、GT.MはオペレータログにDSKNOSPCAVAILメッセージを検出すると、自動的にインスタンスフリーズを行います。オペレーターの介入によりディスク空き容量がなくなった場合、インスタンスフリーズが自動的にクリアされます。インスタンスフリーズ中に、GT.MはNOSPACEEXTメッセージをエラー(-E-)から警告(-W-)に変更して、使用可能なスペースが指定された拡張量よりも小さい場合でも拡張を実行していることを示します。次のエラーは、custom_errors_sample.txtファイルにリストされています。ディスクスペースが利用可能になると、GT.MはDSKNOSPCAVAILで設定されたインスタンス・フリーズを自動的にクリアすることに注意してください。他のすべてのエラーはオペレータの介入を必要とします。

  • I / Oの問題または構造的な損傷の疑いのあるデータベースファイルに関連するエラー: DBBMLCORRUPT, DBDANGER, DBFSYNCERR, DSKNOSPCAVAIL, GBLOFLOW, GVDATAFAIL, GVDATAGETFAIL, GVGETFAIL, GVINCRFAIL, GVKILLFAIL, GVORDERFAIL, GVPUTFAIL, GVQUERYFAIL, GVQUERYGETFAIL, GVZTRIGFAIL, OUTOFSPACE, TRIGDEFBAD

  • I / Oの問題または構造的に損傷が疑われるジャーナル・ファイルに関連するエラー: JNLACCESS, JNLCLOSE, JNLCLOSED, JNLEXTEND, JNLFILECLOSERR, JNLFILEXTERR, JNLFILOPN, JNLFLUSH, JNLFSYNCERR, JRTNULLFAIL, JNLRDERR, JNLREAD, JNLVSIZE, JNLWRERR

インスタンス・フリーズ中に、データベースとジャーナル・ファイルを更新しようとするとハングアップしますが、データベースファイルを更新する必要のないジャーナルファイル抽出などの操作は正常に続行されます。インスタンス・フリーズがクリアされると、プロセスは自動的に補助的な操作やプログラムによる介入なしで継続します。インスタンス・フリーズ・メカニズムは、フリーズとアンフリーズの両方をオペレータログに記録します。

[注意] 注意

V6.0-000では、インスタンス・フリーズ機能はフィールド・テスト・グレードの実装です。GT.Mが認識できる多数のエラーがあり、GT.Mがいくつかの動作状態があるため、GT.Mチームはcustom_errors_sample.txtのエラーをテストしました。これは一般的な使用方法と一致しています。もし他のエラーを追加する際に問題が発生したり、その他のエラーを追加する計画がある場合は、GT.Mサポートチャネルにご相談ください。

TLS / SSLレプリケーション

GT.Mには、トランスポート・レイヤー・セキュリティ(Transport Layer Security)(TLS; 以前はSSL)を使用してインスタンス間のレプリケーション接続を保護する機能を提供するプラグイン参照実装が含まれています。データベース暗号化は、ディスクファイル(休止中のデータ)にアクセスできる権限のないプロセスによってデータベースへの不正アクセスから保護するのと同様に、プラグイン参照実装は、インスタンス間のレプリケーション接続を保護し、転送中のデータへの不正アクセスを防止します。FISは、OpenSSL(http://www.openssl.org)を使用してTLSプラグイン・リファレンス実装のGT.Mのレプリケーション操作をテストしました。将来のGT.Mのリリースには、広く普及しているOpenSSL以外のTLS実装/暗号化パッケージのサポートが含まれるかもしれません。プラグイン・アーキテクチャでは、TLS実装と暗号化パッケージを選択できます。FISでは、特定のTLS実装または暗号化パッケージを推奨することもサポートしていないため、本番(プロダクション)環境で使用することを意図するパッケージを確実にサポートする必要があります。

[注意] 注意

データベース暗号化とTLS / SSLレプリケーションは、包括的なセキュリティ計画の多くのコンポーネントのうちの2つに過ぎません。データベースの暗号化とTLSレプリケーションの使用は、優れたセキュリティ計画に従っている必要があります。このセクションでは、暗号化されたGT.Mインスタンスの複製と、TLS / SSLを使用したインスタンス間の複製接続の保護について説明します; セキュリティ計画については言及していません。

[重要] 重要

GT.Mデータベース暗号化を使用せずにインスタンス間でTLSレプリケーションを設定できます。GT.Mデータベース暗号化は、TLSレプリケーションを使用するための前提条件ではありません。

TLSレプリケーションセットアップを作成する一般的な手順には、次のタスクが含まれます:

  1.  新しいデータベースを作成するか、既存のデータベースを使用します。

  2. 「ルートレベルの証明機関の作成」

  3. 「リーフレベル証明書の作成」

  4. 「構成ファイルの作成」

  5. 複製を有効にし、TLSID修飾子を使用してソース・サーバーとレシーバー・サーバーを開始する。

ルートレベルの証明機関の作成

TLSを使用するには、通信相手が互いに認証する必要があります。もし認証が成功すると、通信相手相互は後続の通信を暗号化する。TLS認証は、認証局(CA)によって署名された証明書を使用します。認証局の証明書自体は、最終的に自身の証明書に自己署名するルートCAにつながる他のCAによって署名(および信頼)されます。OpenSSLなどの証明書のトピックやソフトウェアの使用は、GT.Mのドキュメントの範囲をはるかに超えていますが、以下の手順では、自己署名付きルートCA証明書を使用したソースとレシーバーの証明書を使用したテスト環境のクイックスタート作成を示します。

ルート認証局を作成するには、3つの手順が必要です。

  1. OpenSSLコマンドを使用して秘密鍵を生成します: openssl genrsa -des3 -out ca.key 4096 。このコマンドは、秘密鍵を保護するためのパスワードの入力を求めます。

  2. OpenSSLコマンドを使用して自己署名証明書を生成します: openssl req -new -x509 -days 365 -key ca.key -out ca.crt 。このコマンドは、まず秘密鍵のパスワードと、証明書の属性に関する一連の対話式照会の入力を要求します。以下はサンプル出力です:

    Enter pass phrase for ca.key:
    You are about to be asked to enter information that will be incorporated into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    

    -----

    Country Name (2 letter code) [AU]:US
    State or Province Name (full name) [Some-State]:PA
    Locality Name (eg, city) []:Malvern
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Pvt. Ltd
    Organizational Unit Name (eg, section) []:Certificate Authority
    Common Name (e.g. server FQDN or YOUR name) []:www.example.com
    Email Address []:example@example.com
    

この時点で、ca.crt は、他の証明書(中間の証明機関を含む)に署名するために使用できるルート証明書です。ルート証明書の秘密鍵は、不正アクセスから保護する必要があります。

リーフレベル証明書の作成

ルート証明書は、通常のリーフレベルの証明書に署名するために使用されます。以下は、GT.Mレシーバ・サーバでGT.Mソース・サーバを認証するために使用される証明書の作成(およびその逆)を示す手順です。

  1. 秘密鍵を生成する。これは、ルート証明書生成のステップ(a)と同じです。

  2. OpenSSLコマンド openssl req -new -key client.key -out client.csr を使用して証明書署名要求を生成します。このコマンドは、まず秘密鍵のパスワードと、証明書の属性に関する一連の対話式照会の入力を要求します。以下はサンプル出力です:

    Enter pass phrase for client.key:
    You are about to be asked to enter information that will be incorporated into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.

    -----

    Country Name (2 letter code) [AU]:US
    State or Province Name (full name) [Some-State]:PA
    Locality Name (eg, city) []:Malvern
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:XYZQ International
    Organizational Unit Name (eg, section) []: OurSourceServer
    Common Name (e.g. server FQDN or YOUR name) []:www.xyzq.com
    Email Address []:xyzq@xyzq.com
    Please enter the following 'extra' attributes to be sent with your certificate request
    A challenge password []:challenge
    An optional company name []:XYZQ Pvt. Ltd
    

    通常、証明書の署名を生成する組織は、認証局(またはルート認証局)にその証明書を送信し、要求を監査し、その秘密鍵で証明書に署名し、認証局が署名を要求しました。この例では、上記で生成されたルート証明書で証明書署名要求に署名します。

  3. 次のようなOpenSSLコマンドで証明書署名要求に署名します:

    openssl ca -config $PWD/openssl.cnf -in client.ccr -out client.crt

    このコマンドの出力は次のようになります:

    >You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    Country Name (2 letter code) [US]: US
    State or Province Name (full name) [Philadelphia]:Illinois
    City (e.g., Malvern) [Malvern]:Chicago"
    Organization Name (eg, company) [FIS]:FIS
    Organizational Unit Name (eg, section) [GT.M]:GT.M
    Common Name (e.g. server FQDN or YOUR name) [localhost]:fisglobal.com
    Ename Address (e.g. helen@gt.m) []:root@gt.m
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./certs/ca.key:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
     Serial Number: 14 (0xe)
     Validity
     Not Before: Jun 11 14:06:53 2014 GMT
     Not After : Jun 12 14:06:53 2014 GMT
     Subject:
     countryName = US
     stateOrProvinceName = Illinois
     organizationName = FIS
     organizationalUnitName = GT.M
     commonName = fisglobal.com
     emailAddress = helen@gt.m
     X509v3 extensions:
     X509v3 Basic Constraints:
     CA:FALSE
     Netscape Comment:
     OpenSSL Generated Certificate
     X509v3 Subject Key Identifier:
     96:FD:43:0D:0A:C1:AA:6A:BB:F3:F4:02:D6:1F:0A:49:48:F4:68:52
     X509v3 Authority Key Identifier:
     keyid:DA:78:3F:28:8F:BC:51:78:0C:5F:27:30:6C:C5:FE:B3:65:65:85:C9
    Certificate is to be certified until Jun 12 14:06:53 2014 GMT (1 days)
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
[重要] 重要

自己署名入りのルート証明機関とリーフレベルの証明書は安全な場所に保管してください。許可されていないユーザーがアクセスできないように、0500のパーミッションと0400のパーミッションを持つ個々のファイルでディレクトリを保護します。

中間CA、Diffie-Hellmanパラメータ、証明書失効リストなどを作成する方法については、OpenSSLドキュメント http://www.openssl.org/docs/ を参照してください。

構成ファイルの作成

構成ファイルは、データベース暗号化セクションとTLSセクションの2つのセクションに分かれています。データベース暗号化セクションには、データベースファイルと対応するキーファイルのリストが含まれ、TLSセクションには、PEM形式のルート証明機関証明書と対応する秘密キーファイルを含むリーフレベル証明書の場所を示すTLSIDラベルが含まれます。gtmcrypt_config 環境変数を使用するには、libconfigライブラリをインストールする必要があります。

自己署名付きルート証明書によって署名されたリーフレベル証明書を作成した後、以下の形式で構成ファイル(ソース用とレシーバー用)を作成します。

tls: {
     verify-depth: 7;
     CAfile: "/path/to/ca.crt";
     tls : {
           format: "PEM";
           cert: "/path/to/client.crt";
           key: "/path/to/client.key";
     };
};

tls は、ソース / レシーバー・サーバーの起動に使用されるTLSIDを指定し、 CAfile はルート証明機関へのパスを指定し、 cert はリーフレベル証明書へのパスを指定し、 key は秘密キーファイルへのパスを指定します。

環境変数 gtmcrypt_config を設定ファイルへのパスを指すように設定します。環境変数 gtmtls_passwd_ <tlsid> は、クライアントの秘密鍵の難読化されたバージョンのパスワードを指定する必要があります。GT.Mディストリビューションで提供されている maskpassユーティリティを使用して、難読化されたパスワードを作成します。

サンプル構成ファイルは次のとおりです:

/* Database encryption section */
 
database: {
      keys: (
            {
                  dat: "/tmp/mumps.dat";  /* Encrypted database file. */
                  key: "/tmp/mumps.key";  /* Encrypted symmetric key. */
            },
            {
                  dat: "/tmp/a.dat";
                  key: "/tmp/a.key";
            },
            ...
      );
}
 
/* TLS section */
 
tls: {
      /* Certificate Authority (CA) verify depth provides an upper limit on the number of CAs to look up for verifying a given
       * certificate. The depth count is described as ''level 0:peer certificate'', ''level 1: CA certificate'',
       * ''level 2: higher level CA certificate'', and so on. The default verification depth is 9.
       */
      verify-depth: 7;
 
      /* CAfile: points to a file, in PEM format, describing the trusted CAs. The file can contain several CA certificates identified by:
       * -----BEGIN CERTIFICATE-----
       * ... (CA certificate in base64 encoding) ...
       * -----END CERTIFICATE-----
       * sequences.
       */
      CAfile: "/home/jdoe/current/tls/certs/CA/gtmCA.crt";
 
      /* CApath: points to a directory containing CA certificates in PEM format. The files each contain one CA certificate. The files are
       * looked up by the CA subject name hash value, which must hence be available. If more than once certificate with the same
       * name hash value exists, the extension must be different (e.g. 9d66eef0.0, 9d66eef0.1 etc). The directory is typically
       * created by the OpenSSL tool 'c_rehash'.
       */
      CApath: "/home/jdoe/current/tls/certs/CA/";
      
      /* Diffie-Hellman parameters used for key-exchange. Either none or both have to be specified. If neither is specified, then
       * then the data is encrypted with the same keys that are used for authentication.
       */
      dh512: "/home/jdoe/current/tls/dh512.pem";
      dh1024: "/home/jdoe/current/tls/dh1024.pem";
 
      /* crl: points to a file containing list of revoked certificates. This file is created by the openssl utility. */
      crl: "/home/jdoe/current/tls/revocation.crl";
 
      /* Timeout (in seconds) for a given session. If a connection disconnects and resumes within this time interval, the session
       * is reused to speed up the TLS handshake. A value of 0 forces sessions to not be reused. The default value is 1 hour.
       */
      session-timeout: 600;
 
      /* List of certificate/key pairs specified by identifiers. */
      PRODUCTION: {
            /* Format of the certificate and private key pair. Currently, the GT.M TLS plug-in only supports PEM format. */
            format: "PEM";
            /* Path to the certificate. */
            cert: "/home/jdoe/current/tls/certs/Malvern.crt";
            /* Path to the private key. If the private key is protected by a passphrase, an obfuscated version of the password
             * should be specified in the environment variable which takes the form gtmtls_passwd_<identifier>. For instance,
             * for the below key, the environment variable should be 'gtmtls_passwd_PRODUCTION'.
             * Currently, the GT.M TLS plug-in only supports RSA private keys.
             */
            key: "/home/jdoe/current/tls/certs/Malvern.key";
      };
 
      DEVELOPMENT: {
            format: "PEM";
            cert: "/home/jdoe/current/tls/certs/BrynMawr.crt";
            key: "/home/jdoe/current/tls/certs/BrynMawr.key";
      };
};

もし 環境変数 gtm_dbkeys を使用してデータベース暗号化用のマスター・キー・ファイルを指している場合は、できるだけ早く$gtmcrypt_config 環境変数が指すように libconfig 設定ファイル形式に変換してください。効果的なV6.1-000では、gtm_dbkeys環境変数とそれが指すマスター・キー・ファイルは、gtmencrypt_config環境変数を使用して非推奨になりました。V6.1-000はデータベースの暗号化に $gtm_dbkeysの使用をサポートしていますが、FISは近い将来にサポートを中止する予定です。マスター・キー・ファイルを libconfig 形式の設定ファイルに変換するには、CONVDBKEYS.mのダウンロードをクリック  CONVDBKEYS.m をダウンロード して、CONVDBKEYS.mプログラムをダウンロードし、プログラムファイルの先頭にあるコメントの指示に従ってください。http://tinco.pair.com/bhaskar/gtm/doc/articles/downloadables/CONVDBKEYS.m からCONVDBKEYS.mをダウンロードすることもできます。

システム間のネットワークリンク

GT.Mレプリケーションには、すべてのインスタンス間に耐久性のあるネットワークリンクが必要です。データベースのレプリケーション・サーバは、シンプルなTCP/IP接続経由でネットワークリンクを使用することができます。基本的なトランスポートは、メッセージの配信を強化することができます(たとえば、保証された配信、自動切り取りと復元、メッセージの分割と再アセンブリ機能を提供); ただし、これらの機能はレプリケーション・サーバーには透過的です。単純にメッセージの配信とメッセージの受信に依存します。

BEFORE_IMAGE と NOBEFORE_IMAGE ジャーナリングのどちらかを選択

BEFORE_IMAGE ジャーナリングとNOBEFORE_IMAGE ジャーナリングの間には、クラッシュ後に回復されるデータベース/インスタンスの最終状態に違いはありません。before image とnobefore journaling の違いは次のとおりです:

  • インスタンスを回復するための一連の手順と、それらを実行するのに必要な時間。

  • 関連するストレージ・コストとIO帯域幅の要件

Recovery

インスタンスが停止すると、その回復は少なくとも2つのステップから構成されます: インスタンス自体のリカバリ:ハードウェア、OS、ファイルシステムなど - tsys と呼ぶ。 tsys はGT.Mジャーナリングのタイプとはほぼ完全に独立しています[4]

データベース回復の場合:

  • BEFORE_IMAGEジャーナリングを使用すると、mupip journal recover backward "*" コマンドを実行するのに必要な時間だけでなく、レプリケーションを使用しているときに mupip journal recover -rollback コマンドも実行できます。これは、ジャーナル・ファイルの before image レコードを使用してデータベースファイルを最後のエポックにロールバックし、最新の更新にフォワードします。もしこれが tbck を要する場合、総回復時間は tsys+tbck です。

  • NOBEFORE_IMAGEジャーナリングでは、最後のバックアップを復元するのに必要な時間 = trest と mupip journal -recover -forward "*" コマンドの実行時間 = tfwd の合計時間で、つまり、 tsys+trest+tfwd が合計のリカバリ時間です。 もし最後のバックアップがオンラインで利用可能な場合、 "バックアップの復元" は、環境変数の値を設定するだけです。 trest=0 と 復旧時間 tsys+tfwd です。

tbck は tfwd よりも小さいため、 tsys+tbck は tsys+tfwd より小さいです。だいたいの概数で、tsys は数分から数十分で、tfwdは数十分で、tbckは数秒から数分です。したがって、BEFORE_IMAGEジャーナリングでNOBEFORE_IMAGEジャーナリングよりもインスタンスAを回復することは(粗い最初の近似に)半分程度速くなる可能性があります。2つの展開構成を検討してください。

  1. A がアプリケーションの唯一のプロダクション・インスタンスである場合、インスタンスの復旧時間を半減または4分の1にすることは重要です。これは、インスタンスが停止しているときにエンタープライズがビジネスに参加していないためです。10分の回復時間と30分の回復時間の違いは重要です。したがって、唯一の本番インスタンスまたは単独の本番インスタンスを実行しているときに、低パワーまたは容易にアクセスできない「災害復旧サイト」によってバックアップされた場合、 バックワード・リカバリを使用した before image ジャーナリングは、本番(プロダクション)環境サイトにより適した構成です。さらに、この状況では、エンタープライズが人的ミスの可能性を高めるビジネス圧力にないため、A をすぐにバックアップするというプレッシャーがあります。

  2. Bに複製するオリジナルのインスタンスとして実行されているAがクラッシュした時点でLMS構成に配置された2つの機能的でアクセス可能なインスタンス AとBを使用して、 Bは複製インスタンスからオリジナルのインスタンスに数秒以内に切り替えることができます。適切に構成されたネットワークは、1秒から数十秒で、あるインスタンスから別のインスタンスへの着信アクセスのルーティングを変更することができます。エンタープライズでは、Aが実際にダウンしていることを確認し、B - おそらく1〜2分で切り替えることを決定するために必要な時間だけダウンしています。さらに、Bは「既知の良い(known good)」状態にあるため、「疑わしい場合はスイッチオーバー」という戦略がまったく適切です。今回のtswchは、AとBがBEFORE_IMAGEジャーナリングまたはNOBEFORE_IMAGEジャーナリングを実行しているかどうかとは無関係です。BEFORE IMAGEジャーナリングとNOBEFORE_IMAGEジャーナリングの違いは、Aを後で回復するのにかかる時間の差です。そのため、Bへの複製インスタンスとして作成することができます。もしNOBEFORE_IMAGEジャーナリングが使用され、最後のバックアップがオンラインの場合、ジャーナル・ファイルを使用して、Aのフォワード・リカバリを最初に実行する必要はありません。 A がリブートされると:

    • クラッシュした環境から複製されていないトランザクションを抽出する

    • バックアップを複製インスタンスとしてBに接続し、それに追いつくことを許可します。

[注意] 注意

今後のLMX機能を利用できるアプリケーションは、適切なフロント・エンド・ネットワークで使用すると、基本的に tswch をゼロにします。

リカバリ以外の比較

コスト

LMS構成を使用するコストは、少なくとも1つの余分なインスタンスにレプリケーションのネットワーク帯域幅を加えたものです。トレードオフがあります: 2つのインスタンスでは、エンタープライズ・アプリケーションの可用性を大幅に損なうことなく安価なサーバーとストレージを使用することが適切な場合があります。実際、GT.Mは16個までのインスタンスに複製することが可能なので、コモディティ・ハードウェア [a] を使用して総コストを節約することは不合理ではありません。

ストレージ

余分なインスタンスはもちろん、データベースとジャーナル・ファイル用に独自のストレージが必要です。Nobefore ジャーナル・ファイルは、before image ジャーナリングによって作成されたジャーナル・ファイルよりも小さく、最後のバックアップのオンラインコピーを保持することが決定された場合、潜在的にオフセットがセーブされます(これが節約かコストになるかどうかは、アプリケーションの動作とジャーナル・ファイル保持の運用上の要件によって異なります)。

パフォーマンス

nobefore ジャーナリングのI / O帯域幅の要件は、GT.Mが、before imageジャーナリング・レコードに書き込むことも、データベースをフラッシュすることもないため、before image ジャーナリングのI / O帯域幅の要件よりも小さくなります。

  • before image ジャーナリングで、エポック後に初めてデータベース・ブロックが更新されたとき、GT.Mは before imageジャーナル・レコードを書き込みます。これは、エポックの直後に一定の更新率が与えられると、before image レコードに増加があることを意味します(すべての更新が少なくとも1つのデータベースブロックを変更し、少なくとも1つのイメージジャーナルレコードを生成するため)。エポックが続行につれて、before imageレコードの書き込み頻度は、次のエポックまで定常レベル [b] に戻ります。before image ジャーナル・レコードは、更新を記述するジャーナル・レコードよりも大きくなります。

  • エポックでは、before image ジャーナルとnobefore ジャーナルの両方がジャーナル・ブロックをフラッシュし、ジャーナル・ファイル [c] に対して fsync() を実行します。before image ジャーナリングを使用すると、GT.Mは、すべてのダーティなデータベース・ブロックが書き込まれていることを保証し、fsync() [d] を実行しますが、これらの手順は実行しません。

IOサブシステムはピークIOレートに対応できるようなサイズになっていることが多いため、NOBEFORE_IMAGEジャーナリングを選択すると、アプリケーションのスループットや応答性を損なうことなく、より経済的なハードウェアが可能になります。

[a] GT.Mは、基礎となるコンピュータ・システムが常時正しく動作することを絶対に要求します。したがって、実稼動(プロダクション)インスタンスの場合は、エラー訂正RAMとミラーディスクの使用をお勧めします。しかし、冗長電源やホットスワップ可能なコンポーネントを使用せずにサーバーを使用したり、ストレージのためにSANではなくRAIDなどを使用したりすることは、コスト効果が高いでしょう。

[b] 定常レベルがどれくらい低いかは、アプリケーションと作業負荷によって異なります。

[c] ほとんどのアプリケーションより多くのジャーナル・バッファを20,000個もフラッシングしても、わずか10MBのデータしかありません。さらに、GT.M の SYNC_IOジャーナル・フラグが指定されている場合、fsync() 操作には物理IOは必要ありません。

[d] フラッシュされるダーティー・データベース・ブロックのボリュームが大きくなる可能性があります。たとえば、4,000個の4KBデータベース・ブロックの80%が汚れていると、128MBのデータを書き込んでフラッシュする必要があります。

データベースの修復

システム・クラッシュは、データベース・ファイルに損傷を与えることがありますが、しばしばそれが構造的に一貫性がありません。before image ジャーナリングに、通常の MUPIPリカバリ/ロールバックは、そのようなダメージを自動的に修復し、アプリケーションによってデータベースにコミットされた最後のトランザクションの終了時にデータベースを論理的に一貫した状態に戻します。確かな良性エラーが発生した可能性もあります("データベースの整合性を維持する"の章を参照してください)。これらは適切な時点で複製されたインスタンスで修復されなければならず、この議論の目的では「損傷」とはみなされません。イメージ・ジャーナリングを使用していなくても、複製インスタンス(特に複数サイトのインスタンス)はインスタンスの集約に十分な耐久性を持つため、損傷していないインスタンスからのバックアップ(またはコピー)は、常に破損インスタンスを修復できます。

[注意] 注意

もしデータベースおよび/またはジャーナルファイルの磁気媒体が損傷を受けたならば(例えば、ミラーされていないディスク上のヘッドクラッシュ)自動修復は問題があります。このため、組織で利用する場合は磁気媒体はハードウェアミラーリングを使うことを強く推奨します。

注意 注意

kill -9 や ipcrm ような、root権限で実行するプロセスによる、UNIXコマンドの誤用は、データベース破損を引き起こす可能性があります。

レプリケーションが高いレベルで動作していることを考慮すると、GT.Mデータベース・レプリケーションの論理的なデュアルサイトの性質により、オリジナルのインスタンスと複製インスタンスの両方で関連するデータベースの損傷が発生することは事実上不可能です。

アプリケーションの整合性を維持するために、DSEを使用して、オリジナルのインスタンス上の複製された領域の論理的な内容を修復または変更しないでください。

[注意] 注意

手動によるデータベースの修復を試みる前に、データベース全体(すべての領域)をバックアップすることを、F.I.S.は強く推奨します。

データベースを修復した後、複製インスタンスを起動し、新しいジャーナル・ファイルでデータベースをバックアップします。MUPIPバックアップ・オンラインでは、バックアップ中に複製を続行できます。「ジャーナリング」の章で述べたように、バックアップ以前のジャーナル・ファイルは通常のリカバリには役立ちません。



[4] 「ほぼ完全に」認定された理由は、古いファイル・システムを回復する時間が、使用されるスペースの量に依存することがあるためです。

inserted by FC2 system