この章では、MongoDBハンドラについて説明し、その機能を理解できるように例を示します。
トピック:
MongoDBは、高パフォーマンス、高可用性および自動スケーリングを提供するオープン・ソースのドキュメント・データベースです。
詳細は、次に示すMongoDBのWebサイトを参照してください。
MongoDBハンドラを使用して、Oracle GoldenGate証跡からターゲットMongoDBデータベースにトランザクション・データを複製できます。
MongoDBハンドラは、ソース証跡ファイルから操作を取得し、対応するドキュメントをターゲットMongoDBデータベースに作成します。
MongoDBでは、レコードはバイナリJSON (BSON)ドキュメントで、フィールドと値のペアで構成されるデータ構造です。BSONデータ構造は、JSONドキュメントのバイナリ形式です。MongoDBドキュメントはJSONオブジェクトに似ています。フィールドの値には、他のドキュメント、配列、およびドキュメントの配列を含めることができます。
コレクションは、MongoDBドキュメントをグループ化したもので、RDBMSの表に相当します。MongoDBでは、データベースはドキュメントのコレクションを保持します。コレクションはスキーマを強制しません。コレクション内のMongoDBドキュメントは、異なるフィールドを持つことができます。
トピック:
MongoDBデータベースでは、すべてのドキュメント(行)に_id
という名前の列が必要で、この列の値はコレクション(表)内で一意である必要があります。これは、RDBMS表の主キーに似ています。挿入時に、ドキュメントに最上位の_id
列が含まれていない場合、MongoDBドライバによってこの列が追加されます。
MongoDBハンドラは、証跡レコードの主キー列値に基づいて、すべてのドキュメントのカスタム_id
フィールド値を構築します。このカスタム_id
は、:
(コロン)セパレータで連結されたすべてのキー列値を使用して構築されます。次に例を示します。
KeyColValue1:KeyColValue2:KeyColValue3
MongoDBハンドラは、このカスタム_id
値に基づいて、一意性を強制します。つまり、証跡のすべてのレコードが、主キー列値に基づいて一意である必要があります。同じ表に一意でないレコードが存在すると、MongoDBハンドラ障害が発生し、Replicatは重複キー・エラーで異常終了します。
_id
フィールドの動作は次のとおりです。
デフォルトでは、MongoDBは、コレクションの作成時に列の一意の索引を作成します。
これは常にドキュメントの最初の列になります。
配列を除く任意のBSONデータ型の値を使用できます。
_id
列の変更は許可されていません。つまり、証跡内の主キーの更新操作レコードには、特別な処理が必要です。MongoDBハンドラは、主キーの更新操作をDELETE
(古いキー)とINSERT
(新しいキー)の組合せに変換します。INSERT
を実行するには、証跡内の更新操作の完全な操作前イメージが推奨されます。Oracle GoldenGateのGETUPDATEBEFORES
およびNOCOMPRESSUPDATES
パラメータを有効にして、更新操作の完全な操作前イメージを移入する証跡を生成できます。『Oracle GoldenGateリファレンスfor Windows and UNIX』を参照してください。ここでは、MongoDBハンドラのコンポーネントの構成とハンドラの実行について説明します。
トピック:
MongoDB Java Driverは、Oracle GoldenGate for Big DataがデータからMongoDBに接続およびストリーミングするために必要です。MongoDB Java Driverの推奨バージョンは3.2.2です。MongoDB Java DriverはOracle GoldenGate for Big Dataのパッケージングに含まれていないため、次の場所からドライバをダウンロードする必要があります。
https://docs.mongodb.com/ecosystem/drivers/java/#download-upgrade
推奨されるドライバJARファイルをダウンロードするには、“mongo-java-driver"と、"3.2.2"バージョンを選択します。
実行時にMongoDB Java Driver JARをロードするには、gg.classpath
変数を構成する必要があります。例: gg.classpath=/home/mongodb/mongo-java-driver-3.2.2.jar
MongoDBハンドラの構成可能な値は次のとおりです。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
表12-1 MongoDBハンドラの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
|
なし |
Replicatで使用するMongoDBハンドラを選択します。 |
|
オプション |
|
|
|
|
オプション |
|
なし |
MongoDBハンドラで実行されるすべての操作に必要な書込み確認を設定します。 プロパティ値はJSON形式で、 書込み確認の詳細は、https://docs.mongodb.com/manual/reference/write-concern/を参照してください。 |
|
オプション |
有効なユーザー名の文字列。 |
なし |
使用する認証ユーザー名を設定します。 |
|
オプション |
有効なパスワードの文字列。 |
なし |
使用する認証パスワードを設定します。 |
|
オプション |
|
なし |
Replicatセット・メンバーのリストまたはMongoDBデータベースのリストへの接続を有効にします。 このプロパティは、 |
|
オプション |
認証メカニズムのカンマ区切りリスト |
なし |
クライアントのアイデンティティを検証するプロセスである認証メカニズムを設定します。入力内容は、様々な認証オプションのカンマ区切りリストになります。たとえば、 認証オプションの詳細は、http://api.mongodb.com/java/3.0/com/mongodb/MongoCredential.htmlを参照してください。 |
|
オプション |
有効な認証ソース |
なし |
ユーザー名のソース(通常はユーザーが定義されているデータベースの名前)を設定します。 |
|
オプション |
有効なMongoDBクライアントURI |
なし |
MongoDBクライアントURIを設定します。クライアントURIは、認証や クライアントURIの形式の詳細は、http://api.mongodb.com/java/3.0/com/mongodb/MongoClientURI.htmlを参照してください |
|
オプション |
有効なMongoDBのサーバー名またはIPアドレス |
なし |
(単一の) MongoDBノードに基づいて、接続先のMongoDBデータベース・ホスト名を設定します。http://api.mongodb.com/java/3.0/com/mongodb/MongoClient.html#MongoClient-java.lang.String-を参照してください。 |
|
オプション |
有効なMongoDBポート |
なし |
MongoDBデータベース・インスタンス・ポート番号を設定します。 |
|
オプション |
|
|
ドキュメントのサイズがMongoDBの制限を超えると、例外が発生し、Replicatが異常終了します。 |
ハンドラ・プロパティ・ファイルで構成される様々な接続プロパティまたは認証プロパティを使用できます。複数の接続プロパティが指定された場合、MongoDBハンドラは、次の優先順位に基づいてプロパティを選択します。
AuthentictionMechanism UserName Password Source Write Concern
ServerAddressList AuthentictionMechanism UserName Password Source
clientURI
Host Port
Host
接続プロパティと認証プロパティを何も指定しないと、ハンドラは、ポート27017
のlocalhost
への接続を試行します。
MongoDBハンドラでは、GROUPTRANSOPS
パラメータを使用して、バッチ・サイズを取得します。証跡レコードのバッチは、MongoDBドキュメントのバッチに変換され、データベースへの1つのリクエストに書き込まれます。
BulkWrite
ハンドラ・プロパティを使用して、適用スループットを向上させるために一括書込みを有効化できます。デフォルトでは、これは有効で、ハンドラの最適パフォーマンスのための推奨設定になっています。
gg.handler.handler.BulkWrite=true | false
プロパティを使用して、一括書込みを有効または無効にします。Oracle GoldenGate for Big Dataのデフォルト・プロパティgg.handler.handler.mode=
は、MongoDBハンドラで使用されません。op | tx
一括書込みを使用することをお薦めします。
書込み確認は、スタンドアロンMongoDB、レプリカ・セットおよびシャード・クラスタへの書込み操作に関してMongoDBからリクエストされた確認のレベルを説明します。シャード・クラスタを使用して、mongosインスタンスは書込み確認をシャードに渡します。
次の構成を使用します。
w: value wtimeout: number
Oracle GoldenGate証跡では、Catalog.Schema.Table
など、3部構成の表名をサポートするソースのデータが存在する場合があります。MongoDBは、DBName.Collection
など、2部構成の名前のみをサポートします。ソースの3部構成の名前からMongoDBの2部構成の名前へのマッピングをサポートするには、ソースのCatalog
とSchema
をアンダースコア区切り文字で連結して、MongoのDBName
を構成します。
たとえば、Catalog.Schema.Table
はcatalog1_schema1.table1
になります。
MongoDB Handlerハンドラは、軽量のundoエンジンを使用して、一括書込みエラーから回復できます。このエンジンは、通常のRDBMSのundoエンジンで提供される機能を提供するのではなく、どちらかといえばエラー・リカバリに役立つよう最善を尽くします。エラー・リカバリが正常に動作するのは、MongoDBデータベースがBulkWriteException
によって障害の場所に関する情報を提供できる主な違反や他の一括書込みエラーがある場合です。
表12-2では、この機能を最大限に利用するための要件を示します。
表12-2 Undo処理の要件
元に戻す処理 | 証跡に完全な操作前イメージが必要か。 |
---|---|
|
いいえ |
|
はい |
|
いいえ( |
undo操作中にエラーが発生した場合、MongoDBコレクションを一貫性のある状態にすることができない可能性があるため、手動でのデータの調整が必要になることがあります。
Javaアダプタ・プロパティ・ファイルからのMongoDBハンドラの構成例を次に示します。
gg.handlerlist=mongodb gg.handler.mongodb.type=mongodb #The following handler properties are optional. #Please refer to the Oracle GoldenGate for BigData documentation #for details about the configuration. #gg.handler.mongodb.clientURI=mongodb://localhost:27017/ #gg.handler.mongodb.Host=<MongoDBServer address> #gg.handler.mongodb.Port=<MongoDBServer port> #gg.handler.mongodb.WriteConcern={ w: <value>, wtimeout: <number> } #gg.handler.mongodb.AuthenticationMechanism=GSSAPI,MONGODB_CR,MONGODB_X509,PLAIN,SCRAM_SHA_1 #gg.handler.mongodb.UserName=<Authentication username> #gg.handler.mongodb.Password=<Authentication password> #gg.handler.mongodb.Source=<Authentication source> #gg.handler.mongodb.ServerAddressList=localhost1:27017,localhost2:27018,localhost3:27019,... #gg.handler.mongodb.BulkWrite=<false|true> #gg.handler.mongodb.CheckMaxRowSizeLimit=<true|false> goldengate.userexit.timestamp=utc goldengate.userexit.writers=javawriter javawriter.stats.display=TRUE javawriter.stats.full=TRUE gg.log=log4j gg.log.level=INFO gg.report.time=30sec #Path to MongoDB Java driver. # maven co-ordinates # <dependency> # <groupId>org.mongodb</groupId> # <artifactId>mongo-java-driver</artifactId> # <version>3.2.2</version> # </dependency> gg.classpath=/path/to/mongodb/java/driver/mongo-java-driver-3.2.2.jar javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm