23 MongoDBハンドラの使用

MongoDBハンドラの使用方法について学習します。このハンドラにより、Oracle GoldenGateからターゲットMongoDBデータベースにトランザクション・データを複製できます。

23.1 概要

MongoDBは、高パフォーマンス、高可用性および自動スケーリングを提供するオープン・ソースのドキュメント・データベースです。https://www.mongodb.com/を参照してください。

23.2 詳細な機能

MongoDBハンドラは、ソース証跡ファイルから操作を取得し、対応するドキュメントをターゲットMongoDBデータベースに作成します。

MongoDBでは、レコードはバイナリJSON (BSON)ドキュメントで、フィールドと値のペアで構成されるデータ構造です。BSONデータ構造は、JSONドキュメントのバイナリ形式です。MongoDBドキュメントはJSONオブジェクトに似ています。フィールドの値には、他のドキュメント、配列、およびドキュメントの配列を含めることができます。

コレクションは、MongoDBドキュメントをグループ化したもので、RDBMSの表に相当します。MongoDBでは、データベースはドキュメントのコレクションを保持します。コレクションはスキーマを強制しません。コレクション内のMongoDBドキュメントは、異なるフィールドを持つことができます。

23.2.1 ドキュメント・キー列

MongoDBデータベースでは、すべてのドキュメント(行)に_idという名前の列が必要で、この列の値はコレクション(表)内で一意である必要があります。これは、RDBMS表の主キーに似ています。挿入時に、ドキュメントに最上位の_id列が含まれていない場合、MongoDBドライバによってこの列が追加されます。

MongoDBハンドラは、証跡レコードの主キー列値に基づいて、すべてのドキュメントのカスタム_idフィールド値を構築します。このカスタム_id は、: (コロン)セパレータで連結されたすべてのキー列値を使用して構築されます。たとえば:

KeyColValue1:KeyColValue2:KeyColValue3

MongoDBハンドラは、このカスタム_id値に基づいて、一意性を強制します。つまり、証跡のすべてのレコードが、主キー列値に基づいて一意である必要があります。同じ表に一意でないレコードが存在すると、MongoDBハンドラ障害が発生し、Replicatは重複キー・エラーで異常終了します。

_idフィールドの動作は次のとおりです。

  • デフォルトでは、MongoDBは、コレクションの作成時に列の一意の索引を作成します。

  • これは常にドキュメントの最初の列になります。

  • 配列を除く任意のBSONデータ型の値を使用できます。

23.2.2 主キーの更新操作

MongoDBデータベースでは、 _id列の変更は許可されていません。つまり、証跡内の主キーの更新操作レコードには、特別な処理が必要です。MongoDBハンドラは、主キーの更新操作をDELETE (古いキー)とINSERT (新しいキー)の組合せに変換します。INSERTを実行するには、証跡内の更新操作の完全な操作前イメージが推奨されます。Oracle GoldenGateのGETUPDATEBEFORESおよびNOCOMPRESSUPDATESパラメータを有効にして、更新操作の完全な操作前イメージを移入する証跡を生成できます。『Oracle GoldenGateリファレンス』を参照してください。

23.2.3 MongoDB証跡のデータ型

MongoDBハンドラは、次に示すBSONデータ型への配信をサポートします。

  • 32ビット整数

  • 64ビット整数

  • Double

  • 日付

  • 文字列

  • バイナリ・データ

23.3 MongoDBハンドラの設定および実行

次の各トピックでは、MongoDBハンドラのコンポーネントの構成およびこのハンドラの実行の手順について説明します。

23.3.1 クラスパス構成

MongoDB Java Driverは、Oracle GoldenGate for Big DataがMongoDBに接続してデータをストリーミングするために必要です。MongoDB Java Driverの最小の必須バージョンは3.4.3です。MongoDB Java Driverは、Oracle GoldenGate for Big Data製品には含まれていません。ドライバはmongo java driverからダウンロードする必要があります。

推奨されるドライバJARファイルをダウンロードするには、mongo-java-driver3.4.3バージョンを選択します。

実行時にMongoDB Java Driver JARをロードするには、gg.classpath変数を構成する必要があります。たとえば: gg.classpath=/home/mongodb/mongo-java-driver-3.4.3.jar

Oracle GoldenGate for Big Dataは、MongoDB 3.4に追加されたMongoDB Decimal 128データ型をサポートしています。3.4.3より前のMongoDB Java Driverを使用すると、ClassNotFound例外が発生します。Decimal128データ型の使用を無効にして、3.4より古いMongoDBサーバー・バージョンをサポートするには、次の構成パラメータを設定します。

gg.handler.name.enableDecimal128=false

23.3.2 MongoDBハンドラ構成

MongoDBハンドラの操作は、プロパティ・ファイルを使用して構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。

MongoDBハンドラの選択を有効にするには、まずgg.handler.name.type=mongodbを指定してハンドラ・タイプを構成してから、次に示す他のMongoDBプロパティを構成する必要があります。

表23-1 MongoDBハンドラの構成プロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明

gg.handler.name.type

必須

mongodb

なし

Replicatで使用するMongoDBハンドラを選択します。

gg.handler.name.bulkWrite

オプション

true | false

true

trueに設定すると、コミット・トランザクション・イベントを受信するまで、ハンドラは操作をキャッシュします。トランザクション・イベントのコミット時に、キャッシュされたすべての操作がターゲットMongoDBデータベースに書き出され、スループットが向上します。

falseに設定すると、ハンドラ内でキャッシュは行われず、操作はただちにMongoDBデータベースに書き込まれます。

gg.handler.name.WriteConcern

オプション

{"w": "value" , "wtimeout": "number" }

なし

MongoDBハンドラで実行されるすべての操作に必要な書込み確認を設定します。

プロパティ値はJSON形式で、wおよびwtimeoutのキーのみを受け入れることができます。https://docs.name.com/manual/reference/write-concern/を参照してください。

gg.handler.name.username

オプション

有効なユーザー名の文字列。

なし

使用する認証ユーザー名を設定します。AuthenticationMechanismプロパティとともに使用します。

gg.handler.name.password

オプション

有効なパスワードの文字列。

なし

使用する認証パスワードを設定します。AuthenticationMechanismプロパティとともに使用します。

gg.handler.name.ServerAddressList

オプション

IP:PORT (複数のポート値はカンマで区切る)

なし

Replicatセット・メンバーのリストまたはMongoDBデータベースのリストへの接続を有効にします。

このプロパティは、[hostnames:port]のカンマ区切りリストを受け入れます。たとえば、localhost1:27017,localhost2:27018,localhost3:27019です。

gg.handler.name.AuthenticationMechanism

オプション

認証メカニズムのカンマ区切りリスト

なし

クライアントのアイデンティティを検証するプロセスである認証メカニズムを設定します。入力内容は、様々な認証オプションのカンマ区切りリストになります。たとえば、GSSAPI,MONGODB_CR,MONGODB_X509,PLAIN,SCRAM_SHA_1です。

gg.handler.name.source

オプション

有効な認証ソース

なし

ユーザー名のソース(通常はユーザーが定義されているデータベースの名前)を設定します。AuthenticationMechanismプロパティとともに使用します。

gg.handler.name.clientURI

オプション

有効なMongoDBクライアントURI

なし

MongoDBクライアントURIを設定します。クライアントURIは、認証やWriteConcernなど、他のMongoDB接続プロパティの設定にも使用できます。たとえば、mongodb://localhost:27017/https://mongodb.github.io/mongo-java-driver/3.7/javadoc/com/mongodb/MongoClientURI.htmlを参照。

gg.handler.name.Host

オプション

有効なMongoDBのサーバー名またはIPアドレス

なし

(単一の) MongoDBノードに基づいて、接続先のMongoDBデータベース・ホスト名を設定します。https://mongodb.github.io/mongo-java-driver/3.6/javadoc/com/mongodb/MongoClient.htmlを参照してください。

gg.handler.name.Port

オプション

有効なMongoDBポート

なし

MongoDBデータベース・インスタンス・ポート番号を設定します。Hostプロパティとともに使用します。

gg.handler.name.CheckMaxRowSizeLimit

オプション

true | false

false

trueに設定すると、ハンドラは、挿入または変更されるBSONドキュメントのサイズが、MongoDBデータベースで定義された制限内であることを確認します。サイズの計算は、RawBsonDocument,を生成するデフォルト・コーデックの使用を伴い、これによりMongoDBハンドラのスループットが少し低下します。

ドキュメントのサイズがMongoDBの制限を超えると、例外が発生し、Replicatが異常終了します。

gg.handler.name.upsert

オプション

true | false

false

trueに設定します。UPDATE操作の実行時に問合せフィルタに一致するものがない場合は、新しいMongoドキュメントが挿入されます。

gg.handler.name.enableDecimal128

オプション

true | false

true

MongoDBバージョン3.4には、Decimal128という128ビットの10進データ型のサポートが追加されました。このデータ型は、64ビットのLongまたはDoubleに適合しない整数データ型と10進データ型の両方をOracle GoldenGate for Big Dataがサポートするため必要でした。このプロパティをtrueに設定すると、これを必要とするソース・データ型のDouble128データ型へのマッピングが有効になります。falseに設定すると、これらのソース・データ型を64ビットのDoubleとして処理します。

gg.handler.name.enableTransactions

オプション

true | false

false

MongoDB 4.0以上でトランザクション処理を有効にする場合は、trueに設定します。

ノート:

MongoDBは、MongoDBバージョン4.0でトランザクションのサポートが追加されました。また、MongoDBクライアント・ドライバの最低限のバージョンは3.8.0です。

23.3.3 接続および認証

ハンドラ・プロパティ・ファイルでは、様々な接続および認証プロパティを構成できます。複数の接続プロパティが指定された場合、MongoDBハンドラは、次の優先順位に従ってプロパティを選択します。

優先度1:
ServerAddressList
AuthentictionMechanism
UserName
Password
Source
Write Concern
優先度2:
ServerAddressList
AuthentictionMechanism
UserName
Password
Source
優先度3:
clientURI
優先度4:
Host
Port
優先度5:
Host

接続プロパティと認証プロパティを何も指定しないと、ハンドラは、ポート27017localhostへの接続を試行します。

23.3.4 一括書込みの使用

一括書込みはデフォルトで有効になっています。スループットを向上させるために、一括書込みを使用することをお薦めします。

また、BulkWriteハンドラ・プロパティを使用して、一括書込みを有効にすることもできます。一括書込みを有効または無効にするには、gg.handler.handler.BulkWrite=true | falseを使用します。MongoDBハンドラは、Oracle GoldenGate for Big Dataで使用されるgg.handler.handler.mode=op | txプロパティは使用しません

一括書込みでは、MongoDBハンドラは、GROUPTRANSOPSパラメータを使用して、バッチ・サイズを取得します。ハンドラは、証跡レコードのバッチをMongoDBドキュメントに変換し、このドキュメントは1つのリクエストでデータベースに書き込まれます。

23.3.5 書込み確認の使用

書込み確認は、スタンドアロンMongoDB、レプリカ・セットおよびシャード・クラスタへの書込み操作に関してMongoDBからリクエストされた確認のレベルを説明します。シャード・クラスタを使用して、Mongoインスタンスは書込み確認をシャードに渡します。https://docs.mongodb.com/manual/reference/write-concern/を参照してください。

次の構成を使用します。

w: value
wtimeout: number

23.3.6 3部構成の表名の使用

Oracle GoldenGate証跡では、Catalog.Schema.Tableなど、3部構成の表名をサポートするソースのデータが存在する場合があります。MongoDBは、DBName.Collectionなど、2部構成の名前のみをサポートします。ソースの3部構成の名前からMongoDBの2部構成の名前へのマッピングをサポートするには、ソースのCatalogSchemaをアンダースコア区切り文字で連結して、MongoのDBNameを構成します。

たとえば、Catalog.Schema.Tablecatalog1_schema1.table1になります。

23.3.7 元に戻す処理の使用

MongoDB Handlerハンドラは、軽量のundoエンジンを使用して、一括書込みエラーから回復できます。このエンジンは、通常のRDBMSのundoエンジンとは機能が異なり、どちらかといえばエラー・リカバリに役立つよう最善を尽くします。エラー・リカバリが正常に動作するのは、MongoDBデータベースがBulkWriteExceptionによって障害の場所に関する情報を提供する主な違反や他の一括書込みエラーがある場合です。

表23-2では、この機能を最大限に利用するための要件を示します。

表23-2 Undo処理の要件

元に戻す処理 証跡に完全な操作前イメージが必要か。

INSERT

いいえ

DELETE

はい

UPDATE

いいえ(SET句のフィールドの操作前イメージ。)

undo操作中にエラーが発生すると、MongoDBコレクションを一貫性のある状態にすることができない可能性があります。この場合、データを手動で調整する必要があります。

23.4 サンプル構成の確認

基本構成

Javaアダプタ・プロパティ・ファイルからのMongoDBハンドラのサンプル構成を次に示します。

gg.handlerlist=mongodb
gg.handler.mongodb.type=mongodb

#The following handler properties are optional.
#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
#gg.handler.mongodb.CheckMaxRowSizeLimit=true

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

Oracle DatabaseソースからMongoDBターゲット

Oracle Databaseの大文字のソース表名を、MongoDBの小文字の表にマップできます。これは表名とスキーマの両方に適用されます。使用できる方法は2つあります。

データ・ポンプの作成

Replicatの前にデータ・ポンプを作成して、名前を小文字に変換できます。次に、ポンプからの出力を使用するようにMongoDB Replicatを構成します。

extract pmp 
exttrail ./dirdat/le 
map RAMOWER.EKKN, target "ram"."ekkn"; 
複製時の変換

このパラメータをMongoDBプロパティ・ファイルに追加することにより、MongoDB表に複製する場合に表の列名を小文字に変換できます。

gg.schema.normalize=lowercase