14 MongoDBハンドラの使用
MongoDBハンドラの使用方法について説明します。このハンドラにより、Oracle GoldenGateからターゲットMongoDBデータベースにトランザクション・データを複製できます。
トピック:
14.1 概要
MongoDBは、高パフォーマンス、高可用性および自動スケーリングを提供するオープン・ソースのドキュメント・データベースです。https://www.mongodb.com/を参照してください。
親トピック: MongoDBハンドラの使用
14.2 詳細な機能
MongoDBハンドラは、ソース証跡ファイルから操作を取得し、対応するドキュメントをターゲットMongoDBデータベースに作成します。
MongoDBでは、レコードはバイナリJSON (BSON)ドキュメントで、フィールドと値のペアで構成されるデータ構造です。BSONデータ構造は、JSONドキュメントのバイナリ形式です。MongoDBドキュメントはJSONオブジェクトに似ています。フィールドの値には、他のドキュメント、配列、およびドキュメントの配列を含めることができます。
コレクションは、MongoDBドキュメントをグループ化したもので、RDBMSの表に相当します。MongoDBでは、データベースはドキュメントのコレクションを保持します。コレクションはスキーマを強制しません。コレクション内のMongoDBドキュメントは、異なるフィールドを持つことができます。
トピック:
14.2.1 ドキュメント・キー列
MongoDBデータベースでは、すべてのドキュメント(行)に_id
という名前の列が必要で、この列の値はコレクション(表)内で一意である必要があります。これは、RDBMS表の主キーに似ています。挿入時に、ドキュメントに最上位の_id
列が含まれていない場合、MongoDBドライバによってこの列が追加されます。
MongoDBハンドラは、証跡レコードの主キー列値に基づいて、すべてのドキュメントのカスタム_id
フィールド値を構築します。このカスタム_id
は、:
(コロン)セパレータで連結されたすべてのキー列値を使用して構築されます。次に例を示します。
KeyColValue1:KeyColValue2:KeyColValue3
MongoDBハンドラは、このカスタム_id
値に基づいて、一意性を強制します。つまり、証跡のすべてのレコードが、主キー列値に基づいて一意である必要があります。同じ表に一意でないレコードが存在すると、MongoDBハンドラ障害が発生し、Replicatは重複キー・エラーで異常終了します。
_id
フィールドの動作は次のとおりです。
-
デフォルトでは、MongoDBは、コレクションの作成時に列の一意の索引を作成します。
-
これは常にドキュメントの最初の列になります。
-
配列を除く任意のBSONデータ型の値を使用できます。
親トピック: 詳細な機能
14.2.2 主キーの更新操作
_id
列の変更は許可されていません。つまり、証跡内の主キーの更新操作レコードには、特別な処理が必要です。MongoDBハンドラは、主キーの更新操作をDELETE
(古いキー)とINSERT
(新しいキー)の組合せに変換します。INSERT
を実行するには、証跡内の更新操作の完全な操作前イメージが推奨されます。Oracle GoldenGateのGETUPDATEBEFORES
およびNOCOMPRESSUPDATES
パラメータを有効にして、更新操作の完全な操作前イメージを移入する証跡を生成できます。『Oracle GoldenGateリファレンス』を参照してください。
親トピック: 詳細な機能
14.2.3 MongoDB証跡のデータ型
MongoDBハンドラは、次に示すBSONデータ型への配信をサポートします。
-
32ビット整数
-
64ビット整数
-
Double
-
日付
-
文字列
-
バイナリ・データ
親トピック: 詳細な機能
14.3 MongoDBハンドラの設定および実行
次の各項では、MongoDBハンドラのコンポーネントの構成およびこのハンドラの実行の手順について説明します。
トピック:
14.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製品には含まれていません。ドライバは次の場所からダウンロードする必要があります。
https://docs.mongodb.com/ecosystem/drivers/java/#download-upgrade
推奨されるドライバJARファイルをダウンロードするには、mongo-java-driverと3.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
親トピック: MongoDBハンドラの設定および実行
14.3.2 MongoDBハンドラ構成
MongoDBハンドラの操作は、プロパティ・ファイルを使用して構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
MongoDBハンドラの選択を有効にするには、まずgg.handler.name.type=mongodb
を指定してハンドラ・タイプを構成してから、次に示す他のMongoDBプロパティを構成する必要があります。
表14-1 MongoDBハンドラの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
|
なし |
Replicatで使用するMongoDBハンドラを選択します。 |
|
オプション |
|
|
|
|
オプション |
|
なし |
MongoDBハンドラで実行されるすべての操作に必要な書込み確認を設定します。 プロパティ値はJSON形式で、 |
|
オプション |
有効なユーザー名の文字列。 |
なし |
使用する認証ユーザー名を設定します。 |
|
オプション |
有効なパスワードの文字列。 |
なし |
使用する認証パスワードを設定します。 |
|
オプション |
|
なし |
Replicatセット・メンバーのリストまたはMongoDBデータベースのリストへの接続を有効にします。 このプロパティは、 |
|
オプション |
認証メカニズムのカンマ区切りリスト |
なし |
クライアントのアイデンティティを検証するプロセスである認証メカニズムを設定します。入力内容は、様々な認証オプションのカンマ区切りリストになります。たとえば、 |
|
オプション |
有効な認証ソース |
なし |
ユーザー名のソース(通常はユーザーが定義されているデータベースの名前)を設定します。 |
|
オプション |
有効なMongoDBクライアントURI |
なし |
MongoDBクライアントURIを設定します。クライアントURIは、認証や |
|
オプション |
有効なMongoDBのサーバー名またはIPアドレス |
なし |
(単一の) MongoDBノードに基づいて、接続先のMongoDBデータベース・ホスト名を設定します。http://api.name.com/java/3.0/com/mongodb/MongoClient.html#MongoClient-java.lang.String-を参照してください。 |
|
オプション |
有効なMongoDBポート |
なし |
MongoDBデータベース・インスタンス・ポート番号を設定します。 |
|
オプション |
|
|
ドキュメントのサイズがMongoDBの制限を超えると、例外が発生し、Replicatが異常終了します。 |
|
オプション |
|
|
|
|
オプション |
|
|
MongoDBバージョン3.4には、Decimal128という128ビットの10進データ型のサポートが追加されました。このデータ型は、64ビットのLongまたはDoubleに適合しない整数データ型と10進データ型の両方をOracle GoldenGate for Big Dataがサポートするため必要でした。このプロパティを |
親トピック: MongoDBハンドラの設定および実行
14.3.3 接続および認証
ハンドラ・プロパティ・ファイルでは、様々な接続および認証プロパティを構成できます。複数の接続プロパティが指定された場合、MongoDBハンドラは、次の優先順位に従ってプロパティを選択します。
- 優先度1:
ServerAddressList AuthentictionMechanism UserName Password Source Write Concern
- 優先度2:
ServerAddressList AuthentictionMechanism UserName Password Source
- 優先度3:
clientURI
- 優先度4:
Host Port
- 優先度5:
Host
接続プロパティと認証プロパティを何も指定しないと、ハンドラは、ポート27017
のlocalhost
への接続を試行します。
親トピック: MongoDBハンドラの設定および実行
14.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つのリクエストでデータベースに書き込まれます。
親トピック: MongoDBハンドラの設定および実行
14.3.5 書込み確認の使用
書込み確認は、スタンドアロンMongoDB、レプリカ・セットおよびシャード・クラスタへの書込み操作に関してMongoDBからリクエストされた確認のレベルを説明します。シャード・クラスタを使用して、Mongoインスタンスは書込み確認をシャードに渡します。https://docs.mongodb.com/manual/reference/write-concern/を参照してください。
次の構成を使用します。
w: value
wtimeout: number
親トピック: MongoDBハンドラの設定および実行
14.3.6 3部構成の表名の使用
Oracle GoldenGate証跡では、Catalog.Schema.Table
など、3部構成の表名をサポートするソースのデータが存在する場合があります。MongoDBは、DBName.Collection
など、2部構成の名前のみをサポートします。ソースの3部構成の名前からMongoDBの2部構成の名前へのマッピングをサポートするには、ソースのCatalog
とSchema
をアンダースコア区切り文字で連結して、MongoのDBName
を構成します。
たとえば、Catalog.Schema.Table
はcatalog1_schema1.table1
になります。
親トピック: MongoDBハンドラの設定および実行
14.3.7 Undo処理の使用
MongoDB Handlerハンドラは、軽量のundoエンジンを使用して、一括書込みエラーから回復できます。このエンジンは、通常のRDBMSのundoエンジンとは機能が異なり、どちらかといえばエラー・リカバリに役立つよう最善を尽くします。エラー・リカバリが正常に動作するのは、MongoDBデータベースがBulkWriteException
によって障害の場所に関する情報を提供する主な違反や他の一括書込みエラーがある場合です。
表14-2では、この機能を最大限に利用するための要件を示します。
表14-2 Undo処理の要件
元に戻す処理 | 証跡に完全な操作前イメージが必要か。 |
---|---|
|
いいえ |
|
はい |
|
いいえ( |
undo操作中にエラーが発生すると、MongoDBコレクションを一貫性のある状態にすることができない可能性があります。この場合、データを手動で調整する必要があります。
親トピック: MongoDBハンドラの設定および実行
14.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つあります。
親トピック: MongoDBハンドラの使用