8.2.16 Elasticsearch

8.2.16.1 Elasticsearch 7xおよび6xを使用したElasticsearch

Elasticsearchハンドラを使用すると、大量のデータをすばやく、ほぼリアルタイムで保存、検索および分析できます。

ここでは、Elasticsearchハンドラの使用方法について説明します。

ノート:

Elasticsearchハンドラに関するこの項は、Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)バージョン21.9.0.0.0以前に関連しています。Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA) 21.10.0.0.0以降では、Elasticsearch 8.xをサポートするためにElasticsearchクライアントが変更されています。

8.2.16.1.1 概要

Elasticsearchは、拡張性の高い、オープン・ソースのフルテキスト検索および分析エンジンです。Elasticsearchを使用すると、大量のデータをすばやく、ほぼリアルタイムで保存、検索および分析できます。通常、複雑な検索機能を備えたアプリケーションを駆動する基盤となるエンジンやテクノロジとして使用されます。

Elasticsearchハンドラでは、Elasticsearch Javaクライアントを使用してElasticsearchノードに接続し、データを受信します。https://www.elastic.coを参照してください。

ノート:

Elasticsearchハンドラに関するこの項は、Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)バージョン21.9.0.0.0以前に関連しています。GG for DAA 21.10.0.0.0以降では、Elasticsearch 8.xをサポートするためにElasticsearchクライアントが変更されています。

8.2.16.1.2 機能の詳細

このトピックでは、Elasticsearchハンドラの機能について詳しく説明します。
8.2.16.1.2.1 Elasticsearchバージョン・プロパティについて

Elasticsearchハンドラは、Elasticsearchクラスタと通信するために、Elasticsearchトランスポート・クライアントとElasticsearch High Level RESTクライアントの2つの異なるクライアントをサポートしています。

Elasticsearchハンドラは、適切なバージョンのElasticsearchハンドラ・プロパティ・ファイルを指定することで、サポートされている2つのクライアント用に構成することもできます。以前のバージョンのElasticsearch (6.x)ではトランスポート・クライアントのみがサポートされており、構成可能なプロパティ・バージョン値を6.xに設定することでElasticsearchハンドラを構成できます。Elasticsearchの最新バージョン(7.x)では、トランスポート・クライアントとHigh Level RESTクライアントの両方がサポートされています。そのため、最新バージョンでは、Elasticsearchハンドラは、構成可能なプロパティ・バージョンの値を7.xに設定することでトランスポート・クライアント用に構成でき、High Level RESTクライアントは値をRest7.xに設定することで構成できます。

それぞれの構成可能なパラメータは次のとおりです。

  1. 6.xまたは7.xのバージョンを使用するトランスポート・クライアントを使用してElasticsearchクラスタに接続するには、gg.handler.name.version構成値をそれぞれ6.xまたは7.xに設定します。
  2. Elasticsearch High Level RESTクライアントを使用してElasticseachクラスタに接続するには、gg.handler.name.version構成値をREST7.0に設定します。RESTクライアントはElasticsearchバージョン7.xをサポートしています。
8.2.16.1.2.2 インデックスとタイプについて

Elasticsearchのインデックスは、類似した特性を持つドキュメントの集まりです。インデックスは小文字でのみ作成できます。Elasticsearchのタイプは、インデックス内の論理グループです。インデックスまたはタイプ内のすべてのドキュメントは、同じ番号およびタイプのフィールドを持つ必要があります。

Elasticsearchハンドラでは、ソース証跡スキーマをソース証跡表名と連結してインデックスが構築されます。ソース証跡の3つの部分からなる表名の場合、インデックスはソース・カタログ、スキーマおよび表名を連結して構成されます。

Elasticsearchハンドラでは、ソース表名がElasticsearchのタイプにマッピングされます。タイプ名は大文字と小文字を区別します。

ノート:

Elasticsearchフィールド名では、大/小文字が区別されます。更新または挿入するデータのフィールド名が大文字で、Elasticsearchサーバーの既存のフィールドが小文字の場合、それらは新しいフィールドとして扱われ、既存のフィールドとして更新されません。これを回避するには、パラメータgg.schema.normalize=lowercaseを使用します。これにより、フィールド名が小文字に更新され、問題が解決されます。

表8-13 Elasticsearchのマッピング

ソース証跡 Elasticsearchのインデックス Elasticsearchのタイプ

schema.tablename

schema_tablename

tablename

catalog.schema.tablename

catalog_schema_tablename

tablename

Elasticsearchクラスタにまだインデックスが存在しない場合は、Elasticsearchハンドラがデータを受信すると(ソース証跡でのINSERTまたはUPDATE操作)、新しいインデックスが作成されます。

8.2.16.1.2.3 ドキュメントについて

Elasticsearchのドキュメントは、インデックス付けのできる情報の基本単位です。インデックスまたはタイプ内に、必要な数のドキュメントを格納できます。各ドキュメントには_idフィールドに基づく一意の識別子があります。

Elasticsearchハンドラでは、ソース証跡の主キー列の値がドキュメント識別子としてマッピングされます。

8.2.16.1.2.4 主キーの更新について

Elasticsearchのドキュメント識別子はソース表の主キー列の値に基づいて作成されます。ドキュメント識別子は変更できません。Elasticsearchハンドラでは、DELETEに続いてINSERTを実行することによってソース主キーの更新操作が処理されます。INSERTの実行中、新しいドキュメントのフィールドが必要なフィールド数よりも少ないことがあります。ソース表内のすべてのフィールドをINSERT操作に含めるには、更新操作用にデータ全体のビフォア・イメージをキャプチャするように証跡のExtractを有効にするか、GETBEFORECOLSを使用して必要な列のビフォア・イメージを書き込みます。

8.2.16.1.2.5 データ型について

Elasticsearchでは次のデータ型がサポートされています。

  • 32ビット整数

  • 64ビット整数

  • Double

  • Date

  • String

  • Binary

8.2.16.1.2.6 操作モード

Elasticsearchハンドラでは、パフォーマンスを向上させるために操作モードが使用されます。gg.handler.name.modeプロパティはハンドラでは使用されません。

8.2.16.1.2.7 操作処理のサポート

Elasticsearchハンドラでは、ソース表名がElasticsearchのタイプにマッピングされます。タイプ名は大文字と小文字を区別します。

ソース証跡の3つの部分からなる表名の場合、インデックスはソース・カタログ、スキーマおよび表名を連結して構成されます。

INSERT

Elasticsearchハンドラでは、インデックスが存在しない場合、新規インデックスが作成されて新規ドキュメントが挿入されます。

UPDATE

Elasticsearchのインデックスやドキュメントが存在する場合は、そのドキュメントが更新されます。Elasticsearchのインデックスやドキュメントが存在しない場合は、新規インデックスが作成され、UPDATE操作の列の値が新規ドキュメントとして挿入されます。

DELETE

Elasticsearchのインデックスやドキュメントが存在する場合は、そのドキュメントが削除されます。Elasticsearchのインデックスやドキュメントが存在しない場合は、フィールドがゼロの新規インデックスが作成されます。

TRUNCATE操作はサポートされていません。

8.2.16.1.2.8 接続について

クラスタは、データ全体を保持する1つまたは複数のノード(サーバー)の集合です。すべてのノードにわたるフェデレーテッド索引付けおよび検索機能が提供されます。

ノードはクラスタの一部であり、データを格納し、クラスタの索引付けおよび検索に参加する単一のサーバーです。

Elasticsearchハンドラのプロパティgg.handler.name.ServerAddressListは、クラスタで使用可能なノードを指すように設定できます。

8.2.16.1.3 Elasticsearchハンドラの設定および実行

Elasticsearchクラスタが正しく設定され、そのクラスタが稼働していることを確認する必要があります(https://www.elastic.co/guide/en/elasticsearch/reference/current/index.htmlを参照)。また、Kibanaを使用して設定を確認することもできます。

クラスパスの設定

プロパティgg.classpathには、Javaのトランスポート・クライアントに必要なすべてのjarが含まれている必要があります。必要なクライアントJARファイルのバージョン別リストは、Elasticsearchハンドラ・トランスポート・クライアント依存性を参照してください。Elatisticsearch High Level RESTクライアントに必要なクライアントJARファイルのリストは、Elasticsearch High Level RESTクライアント依存性を参照してください。

パス内のワイルドカード(*)は、(*)のワイルドカード文字により、そのディレクトリ内のすべてのJARファイルを関連するクラスパスに含めることができます。*.jarは使用しないでください

正しく構成されたクラスパスの例を次に示します。

gg.classpath=Elasticsearch_Home/lib/*
8.2.16.1.3.1 Elasticsearchハンドラの構成

Elasticsearchハンドラは、異なるバージョンのElasticsearchに対して構成できます。最新バージョン(7.x)では、トランスポート・クライアントとHigh-level RESTクライアントの2つのタイプのクライアントがサポートされています。構成可能なプロパティ・バージョンが6.xまたは7.xの値に設定されている場合、Elasticsearchトランスポート・クライアントを使用して、ハンドラの他のすべての操作をElasticsearchクラスタに接続して実行します。構成可能なプロパティ・バージョンがrest7.xに設定されている場合、Elasticsearch High Level RESTクライアントを使用して、他のハンドラの操作をElasticsearch 7.xクラスタに接続して実行します。それぞれの構成可能なパラメータを、次に個別に説明します。

表8-14 共通の構成可能なプロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.handlerlist 必須 名前(ハンドラに選択した任意の名前) なし 使用するハンドラのリスト。
gg.handler.<name>.type 必須 elasticsearch なし 使用するハンドラのタイプ。たとえば、Elasticsearch、KafkaまたはFlume。
gg.handler.name.ServerAddressList オプション

Server:Port[, Server:Port …]

  • localhost:9300 (トランスポート・クライアント用)
  • localhost:9200 (High-Level RESTクライアント用)

ノードの連絡ポイントのカンマ区切りのリスト。バージョンREST7.xで使用できるポートは9200です。他のバージョンの場合は9300です。

gg.handler.name.version 必須

5.x|6.x|7.x|REST7.x

7.x

バージョン値5.x、6.xおよび7.xは、Elasticsearchトランスポート・クライアントを使用してそれぞれElasticsearchバージョン5.x、6.xおよび7.xと通信することを示します。バージョンREST7.xは、Elasticsearch High Level RESTクライアントを使用してElasticsearchバージョン7.xと通信することを示します。

gg.handler.name.version gg.handler.name.bulkWrite オプション true | false false このプロパティがtrueの場合、Elasticsearchハンドラでは、一括書込みAPIを使用してElasticsearchクラスタにデータが収集されます。一括書込みのバッチ・サイズは、ReplicatパラメータのMAXTRANSOPSを使用して制御できます。
gg.handler.name.numberAsString オプション true | false false このプロパティがtrueの場合、Elasticsearchハンドラは、ソース証跡内のすべての数値列の値(Long、IntegerまたはDouble)を文字列としてElasticsearchクラスタに受信します。
gg.handler.elasticsearch.upsert オプション true | false true このプロパティがtrueの場合、UPDATE操作の実行時にドキュメントが存在しないとき、新規ドキュメントが挿入されます。

例8-1 サンプルのハンドラ・プロパティ・ファイル:

サンプルのReplicat構成およびJavaアダプタのプロパティ・ファイルは、次のディレクトリにあります。

GoldenGate_install_directory/AdapterExamples/big-data/elasticsearch

Elasticsearch RESTハンドラの場合

gg.handlerlist=elasticsearch
gg.handler.elasticsearch.type=elasticsearch
gg.handler.elasticsearch.ServerAddressList=localhost:9300
gg.handler.elasticsearch.version=rest7.x
gg.classpath=/path/to/elasticsearch/lib/*:/path/to/elasticsearch/modules/reindex/*:/path/to/elasticsearch/modules/lang-mustache/*:/path/to/elasticsearch/modules/rank-eval/*
8.2.16.1.3.1.1 共通の構成可能なプロパティ
次の表に、すべてのバージョンのElasticsearchに適用可能で、トランスポート・クライアントとHigh Level RESTクライアントの両方のElasticsearchハンドラに適用可能な共通の構成可能なプロパティを示します。

表8-15 共通の構成可能なプロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.handlerlist 必須 名前(ハンドラに選択した任意の名前) なし 使用するハンドラのリスト。
gg.handler.<name>.type 必須 elasticsearch なし 使用するハンドラのタイプ。たとえば、Elasticsearch、KafkaまたはFlume。
gg.handler.name.ServerAddressList オプション

Server:Port[, Server:Port …]

  • localhost:9300 (トランスポート・クライアント用)
  • localhost:9200 (High-Level RESTクライアント用)

ノードの連絡ポイントのカンマ区切りのリスト。バージョンREST7.xで使用できるポートは9200です。他のバージョンの場合は9300です。

gg.handler.name.version 必須

6.x|7.x|REST7.x

7.x

バージョン値6.xおよび7.xは、Elasticsearchトランスポート・クライアントを使用してそれぞれElasticsearchバージョン6.xおよび7.xと通信することを示します。バージョンREST7.xは、Elasticsearch High Level RESTクライアントを使用してElasticsearchバージョン7.xと通信することを示します。

gg.handler.name.version gg.handler.name.bulkWrite オプション true | false false このプロパティがtrueの場合、Elasticsearchハンドラでは、一括書込みAPIを使用してElasticsearchクラスタにデータが収集されます。一括書込みのバッチ・サイズは、ReplicatパラメータのMAXTRANSOPSを使用して制御できます。
gg.handler.name.numberAsString オプション true | false false このプロパティがtrueの場合、Elasticsearchハンドラは、ソース証跡内のすべての数値列の値(Long、IntegerまたはDouble)を文字列としてElasticsearchクラスタに受信します。
gg.handler.elasticsearch.upsert オプション true | false true このプロパティがtrueの場合、UPDATE操作の実行時にドキュメントが存在しないとき、新規ドキュメントが挿入されます。
8.2.16.1.3.1.2 トランスポート・クライアントの 構成可能なプロパティ

構成可能なプロパティ・バージョンが値6.xまたは7.xに設定されている場合、トランスポート・クライアントを使用して、対応するバージョンのElasticsearchクラスタと通信します。トランスポート・クライアントのみを使用する場合に適用される構成可能なプロパティは次のとおりです。

表8-16 トランスポート・クライアントの構成可能なプロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.handler.name.clientSettingsFile 必須 トランスポート・クライアントのプロパティ・ファイル。 なし Elasticsearchハンドラで使用されるElasticsearchトランスポート・クライアントのプロパティを保持するクラスパスのファイル名。
トランスポート・クライアントを使用するElasticsearchハンドラのサンプル・プロパティ・ファイル(xパック・プラグインを使用)
Copygg.handlerlist=elasticsearch
gg.handler.elasticsearch.type=elasticsearch
gg.handler.elasticsearch.ServerAddressList=localhost:9300
gg.handler.elasticsearch.clientSettingsFile=client.properties
gg.handler.elasticsearch.version=[6.x | 7.x]
gg.classpath=/path/to/elastic/lib/*:/path/to/elastic/modules/transport-netty4/*:/path/to/elastic/modules/reindex/*: /path/to/elastic/plugins/x-pack/*: 
8.2.16.1.3.1.3 トランスポート・クライアントの設定プロパティ・ファイル

Elasticsearchハンドラは、JavaのTransportクライアントを使用してElasticsearchクラスタとやりとりします。Elasticsearchクラスタには、shieldやx-packのような追加のプラグインがあり、追加の構成が必要な場合があります。

gg.handler.name.clientSettingsFile propertyは、Elasticsearchクラスタのバージョンに基づく追加のクライアント設定のあるファイルを指している必要があります。

Elasticsearchハンドラは、Javaクラスパスを使用してクライアント設定ファイルの検索とロードを試みます。Javaクラスパスには、プロパティ・ファイルを含むディレクトリが含まれている必要があります。Elasticsearchのクライアント・プロパティ・ファイル(プラグインなし)は、cluster.name=Elasticsearch_cluster_nameです。

Shieldプラグインは、SSLやIPフィルタリングなどの追加機能もサポートしています。プロパティは、client.properties ファイルで設定できます。https://www.elastic.co/guide/en/shield/current/_using_elasticsearch_java_clients_with_shield.htmlを参照してください。

X-Packプラグインを使用したElasticsearchハンドラのclient.propertiesファイルの例:

Copycluster.name=Elasticsearch_cluster_name
xpack.security.user=x-pack_username:x-pack-password

X-Packプラグインも追加の機能をサポートしています。プロパティは、client.propertiesファイルで設定できます。次を参照

https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.1/transport-client.htmlおよびhttps://www.elastic.co/guide/en/x-pack/current/java-clients.html

8.2.16.1.3.1.4 トランスポート・クライアントのクラスパス設定

トランスポート・クライアントを使用するElasticsearchハンドラのgg.classpath設定には、ライブラリ(lib)からjarへのパスと、Elasticsearchインストール・ディレクトリ内のモジュール(transport-netty4およびreindex module)フォルダが含まれている必要があります。認証のためにxパック・プラグインを使用する場合、クラスパスには、Elasticsearchインストール・ディレクトリ内のプラグイン(x-pack)フォルダ内にjarを含む必要もあります。次のように、jarのパスを参照してください。

.

1.	[path/to/elastic/lib/*]
2.	[/path/to/elastic/modules/transport-netty4/*]
3.	[/path/to/elastic/modules/reindex/*]
4.	[/path/to/elastic/plugins/x-pack/*]  This needs to be added only if x-pack plugin is configured in Elasticsearch 
8.2.16.1.3.1.5 RESTクライアントの構成可能なプロパティ

構成可能なプロパティ・バージョンが値rest7.xに設定されている場合、ハンドラはElasticsearch High Level RESTクライアントを使用してElasticsearchの7.xクラスタに接続します。RESTクライアントでのみサポートされている構成可能なプロパティは、次のとおりです。

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

gg.handler.elasticsearch.routingTemplate

オプション

${columnValue[table1=column1,table2=column2,…]

なし ルーティング・アルゴリズムの決定に使用されるテンプレート。
gg.handler.name.authType オプション none | basic | ssl なし Elasticsearch RESTクライアントの認証タイプを制御します。
  • none - 認証なし
  • basic - メッセージの暗号化なしでユーザー名とパスワードを使用するクライアント認証。
  • ssl - 相互認証。クライアントはトラストストアを使用してサーバーを認証します。ユーザー名とパスワードを使用するサーバー認証クライアント。メッセージは暗号化されます。
gg.handler.name.authType gg.handler.name.basicAuthUsername 必須(認証タイプがbasicの場合) 有効なユーザー名 なし Elasticsearch RESTクライアントを認証するサーバーのユーザー名。認証タイプbasicの場合に指定する必要があります。
gg.handler.name.basicAuthPassword 必須(認証タイプがbasicの場合) 有効なパスワード なし Elasticsearch RESTクライアントを認証するサーバーのパスワード。認証タイプbasicの場合に指定する必要があります。
gg.handler.name.trustStore 必須(認証タイプがSSLの場合) トラストストア・ファイルの完全修飾名(パス+名前) なし Elasticsearchサーバーから受信した証明書を検証するElasticsearchクライアントのトラストストア。認証タイプがsslに設定されている場合は指定する必要があります。Elasticsearch RESTクライアントに対してのみ有効です
gg.handler.name.trustStorePassword 必須(認証タイプがSSLの場合) 有効なトラストストア・パスワード なし Elasticsearchサーバーから受信した証明書を検証するElasticsearch RESTクライアントのトラストストアのパスワード。認証タイプがsslに設定されている場合は指定する必要があります。
gg.handler.name.maxConnectTimeout オプション 正の整数 Apache HTTPコンポーネント・フレームワークのデフォルト値。 Elasticsearch RESTクライアントからElasticsearchサーバーへの接続が確立されるまでの最大待機時間を設定します。Elasticsearch RESTクライアントに対してのみ有効です。
gg.handler.name.maxSocketTimeout オプション 正の整数 Apache HTTPコンポーネント・フレームワークのデフォルト値。 リクエストの発行後にサービスからのレスポンスを待機する最大待機期間(ミリ秒)を設定します。大量のデータをプッシュする場合は、増やす必要がある場合があります。Elasticsearch RESTクライアントに対してのみ有効です。
gg.handler.name.proxyUsername オプション プロキシ・サーバーのユーザー名 なし Elasticsearchへの接続でRESTクライアントおよびプロキシ・サーバー経由のルーティングを使用する場合、このプロパティはプロキシ・サーバーのユーザー名を設定します。ほとんどのプロキシ・サーバーでは、資格証明は必要ありません。
gg.handler.name.proxyPassword オプション プロキシ・サーバーのパスワード なし Elasticsearchへの接続でRESTクライアントおよびプロキシ・サーバー経由のルーティングを使用する場合、このプロパティはプロキシ・サーバーのパスワードを設定します。ほとんどのプロキシ・サーバーでは、資格証明は必要ありません。
gg.handler.name.proxyProtocol オプション http | https なし Elasticsearchへの接続でRESTクライアントおよびプロキシ・サーバー経由のルーティングを使用する場合、このプロパティはプロキシ・サーバーのプロトコルを設定します。
gg.handler.name.proxyPort オプション プロキシ・サーバーのポート番号。 なし Elasticsearchへの接続でRESTクライアントおよびプロキシ・サーバー経由のルーティングを使用する場合、このプロパティはプロキシ・サーバーのポート番号を設定します。
gg.handler.name.proxyServer オプション プロキシ・サーバーのホスト名。 なし Elasticsearchへの接続でRESTクライアントおよびプロキシ・サーバー経由のルーティングを使用する場合、このプロパティはプロキシ・サーバーのホスト名を設定します。

RESTクライアントを使用したElasticsearchハンドラのサンプル・プロパティ

gg.handlerlist=elasticsearch
gg.handler.elasticsearch.type=elasticsearch
gg.handler.elasticsearch.ServerAddressList=localhost:9200
gg.handler.elasticsearch.version=rest7.x
gg.classpath=/path/to/elasticsearch/lib/*:/path/to/elasticsearch/modules/reindex/*:/path/to/elasticsearch/modules/lang-mustache/*:/path/to/elasticsearch/modules/rank-eval/*
8.2.16.1.3.1.6 RESTクライアントの認証

構成可能なプロパティauth-type値SSLを使用して、Elasticsearchクラスタと通信するためのSSL認証メカニズムを構成できます。このプロパティは、構成可能なプロパティの基本ユーザー名/パスワードをトラストストアのプロパティとともに指定することによって、SSLを使用した基本認証を構成するためにも使用できます。

8.2.16.1.3.1.7 RESTクライアントのクラスパス設定

High Level RESTクライアントのクラスパスには、ライブラリ(lib)フォルダからのjarと、Elasticsearchインストール・ディレクトリ内のモジュール・フォルダ(reindex、lang-mustacheおよびran-eval)が含まれている必要があります。RESTクライアントはこれらのライブラリに依存するため、ハンドラが機能するにはgg.classpathに含まれている必要があります。依存性のリストを次に示します。

1.	[/path/to/elasticsearch/lib/*]
2.	[/path/to/elasticsearch/modules/reindex/*]
3.	[/path/to/elasticsearch/modules/lang-mustache/*]
4.	[/path/to/elasticsearch/modules/rank-eval/*]

8.2.16.1.4 トラブルシューティング

この項では、様々な問題のトラブルシューティングに役立つ情報を示します。

トランスポート・クライアントのプロパティ・ファイルが見つからない

これは、プロパティ・バージョンが6.xまたは7.xに設定されている場合にのみトランスポート・クライアントに適用されます。

エラー:
ERROR 2017-01-30 22:33:10,058 [main] Unable to establish connection. Check handler properties
      and client settings configuration.

この例外を解決するには、gg.handler.name.clientSettingsFile構成プロパティに、Elasticsearchトランスポート・クライアントの設定ファイル名が正しく設定されていることを確認します。gg.classpath変数に正しいファイル名へのパスが含まれ、プロパティ・ファイルへのパスの最後にアスタリスク(*)のワイルドカードが含まれていないことを確認します。

8.2.16.1.4.1 不適切なJavaクラスパス

最も一般的な初期エラーは、必要なすべてのクライアント・ライブラリを含めるクラスパスが正しくないことす。log4jログ・ファイルにClassNotFound例外が作成されます。

また、gg.classpath変数に表記上の誤りがある場合、クラスパス解決エラーの原因となる可能性があります。

Elasticsearchトランスポート・クライアント・ライブラリは、Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)製品には付属していません。クライアント・ライブラリを正しく解決するには、Javaアダプタのプロパティ・ファイルでgg.classpathプロパティを正しく構成する必要があります(「Elasticsearchハンドラの設定および実行」を参照)。

8.2.16.1.4.2 Elasticsearchのバージョン不一致

Elasticsearchクラスタのメジャー・バージョン番号と一致させるには、Elasticsearchハンドラのgg.handler.name.versionプロパティを6.x7.xまたはREST7.xに設定する必要があります。たとえば、gg.handler.name.version=7.xです。

バージョン構成に誤りがあると、次のエラーが発生することがあります。

Error: NoNodeAvailableException[None of the configured nodes are available:]

ERROR 2017-01-30 22:35:07,240 [main] Unable to establish connection. Check handler properties and client settings configuration.

java.lang.IllegalArgumentException: unknown setting [shield.user] 

必要なすべてのプラグインがインストールされていることを確認し、削除されたすべての設定に関するドキュメントの変更点を確認します。

8.2.16.1.4.3 トランスポート・クライアントのプロパティ・ファイルが見つからない

この例外を解決するには:

ERROR 2017-01-30 22:33:10,058 [main] Unable to establish connection. Check handler properties and client settings configuration.

gg.handler.name.clientSettingsFile構成プロパティに、Elasticsearchトランスポート・クライアントの設定ファイル名が正しく設定されていることを確認します。gg.classpath変数に正しいファイル名へのパスが含まれ、プロパティ・ファイルへのパスの最後にアスタリスク(*)のワイルドカードが含まれていないことを確認します。

8.2.16.1.4.4 クラスタ接続の問題

このエラーは、ElasticsearchハンドラがElasticsearchクラスタに接続できない場合に発生します。

Error: NoNodeAvailableException[None of the configured nodes are available:]

この問題をデバッグするには、次のステップを実行します。

  1. Elasticsearchのサーバー・プロセスが実行中であることを確認します。

  2. クライアント・プロパティ構成ファイルで、cluster.nameプロパティを確認します。

  3. クライアント・プロパティ・ファイルで、x-PackまたはShieldプラグインの認証の資格証明を確認します。

  4. gg.handler.name.ServerAddressListハンドラ・プロパティを確認します。

8.2.16.1.4.5 サポートされていないTRUNCATE操作

Elasticsearchハンドラがソース証跡でTRUNCATE操作を検出すると、次のエラーが発生します。

oracle.goldengate.util.GGException: Elasticsearch Handler does not support the operation: TRUNCATE

この例外エラー・メッセージは、RAeplicatプロセスが異常終了する前にハンドラのログ・ファイルに書き込まれます。Replicatのパラメータ・ファイルからGETTRUNCATESパラメータを削除すると、このエラーが解決します。

8.2.16.1.4.6 一括実行エラー
""
DEBUG [main] (ElasticSearch5DOTX.java:130) - Bulk execute status: failures:[true] buildFailureMessage:[failure in bulk execution: [0]: index [cs2cat_s1sch_n1tab], type [N1TAB], id [83], message [RemoteTransportException[[UOvac8l][127.0.0.1:9300][indices:data/write/bulk[s][p]]]; nested: EsRejectedExecutionException[rejected execution of org.elasticsearch.transport.TransportService$7@43eddfb2 on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@5ef5f412[Running, pool size = 4, active threads = 4, queued tasks = 50, completed tasks = 84]]];]

Elasticsearchが操作を処理するためのリソースが不足している可能性があります。MAXTRANSOPSを使用してReplicatのバッチ・サイズを制限し、Elasticsearchの構成パラメータthread_pool.bulk.queue_sizeの値と一致させることができます。

ノート:

Elasticsearchのパラメータthread_pool.bulk.queue_sizeの変更は、Elasticsearchノードの再起動後にのみ有効です。

8.2.16.1.5 パフォーマンスに関する考慮事項

Elasticsearchハンドラのgg.handler.name.bulkWriteプロパティは、Elasticsearchクラスタにソース証跡レコードをプッシュする際に、一度に1つずつ行うか、または一括書込みAPIを使用して一括で行うかを判断するために使用されます。このプロパティがtrueの場合、ソース証跡の操作は、一般的なReplicatパラメータ・ファイルのMAXTRANSOPSパラメータによってサイズを制御されるバッチでElasticsearchクラスタにプッシュされます。一括書込みAPIを使用するとパフォーマンスが向上します。

Elasticsearchは、ノード内で管理されるスレッド・プールのメモリー消費量を改善するために、異なるスレッド・プールを使用します。また、これらのプールの多くにはそれに関連付けられたキューも存在し、保留中のリクエストは廃棄されずに保持されます。

一括操作の場合、デフォルトのキュー・サイズは50(バージョン5.2)および200(バージョン5.3)です。

一括APIのエラーを回避するには、ReplicatのMAXTRANSOPSサイズを一括スレッドのプール・キュー・サイズの最小値と一致するように設定する必要があります。thread_pool.bulk.queue_size構成プロパティはelasticsearch.yamlファイルで変更できます。

8.2.16.1.6 Shieldプラグインのサポートについて

Elasticsearchバージョン6.xおよび7.x (Elasticsearch 6.xおよび7.x用X-Packプラグイン)では、基本認証、SSLおよびIPフィルタリングを提供するShieldプラグインがサポートされています。Elasticsearch 6.xおよび7.xのX-Packプラグインにも同様の機能があります。追加のトランスポート・クライアントの設定は、gg.handler.name.clientSettingsFileプロパティを使用してElasticsearchハンドラで構成できます。

8.2.16.1.7 DDL処理について

Elasticsearchハンドラはソース証跡内のDDLレコードには反応しません。新規ソース表のデータ操作レコードにより、Elasticsearchクラスタでインデックスまたはタイプの自動作成が行われます。

8.2.16.1.8 Elasticsearchハンドラの既知の問題

Elasticsearch: 非常に大きな数を入力しようとしています

非常に大きな数値は、Elasticsearchのドキュメントでは不正確な値になります。たとえば、9223372036854775807、-9223372036854775808です。これは、Elasticsearchサーバーの問題であり、Elasticsearchハンドラの制限ではありません。

この問題の回避策は、gg.handler.name.numberAsString=trueプロパティを使用してすべての数値を文字列として収集することです。

Elasticsearch: インデックスの問題

類似した列名で異なる列データ型を持つ複数の表がある場合、Elasticsearchハンドラでは同じインデックスにデータを入力できません。

証跡内のcatalog/schema/tablenameは、大文字と小文字を区別することがありますが、インデックス名は常に小文字です。

8.2.16.1.9 Elasticsearchハンドラ・トランスポート・クライアント依存性

Elasticsearchデータベースに接続するためのElasticsearchハンドラの依存性とはどのようなものでしょう。

Maven Central RepositoryのElasticsearchデータベースのアーティファクトは次のとおりです。

Maven groupId: org.elasticsearch.client

Maven atifactId: transport

Maven groupId: org.elasticsearch.client

Maven atifactId: x-pack-transport

8.2.16.1.10 Elasticsearch High Level RESTクライアント依存性

Elasticsearch High Level RESTクライアントのMaven座標は次のとおりです。

Maven groupId: org.elasticsearch.client

Maven atifactId: elasticsearch-rest-high-level-client

Maven version: 7.13.3

ノート:

Elasticsearch High Level RESTクライアントのjarファイルの依存性スタックにバージョンを混在させないでください。バージョンが混在すると、依存性の競合が発生します。

8.2.16.2 Elasticsearch 8x

Elasticsearchハンドラを使用すると、大量のデータをすばやく、ほぼリアルタイムで保存、検索および分析できます。

この記事では、Elasticsearchハンドラ(Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA) 21.10.0.0.0以降)の使用方法について説明します。Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)バージョン21.10.0.0では、Elasticsearchハンドラが、新しいElasticsearchクライアントをサポートするように変更されました。新しいクライアントは、Elasticsearch 8.xをサポートしています。

8.2.16.2.1 概要

Elasticsearchは、拡張性の高い、オープン・ソースのフルテキスト検索および分析エンジンです。Elasticsearchを使用すると、大量のデータをすばやく、ほぼリアルタイムで保存、検索および分析できます。通常、複雑な検索機能を備えたアプリケーションを駆動する基盤となるエンジンやテクノロジとして使用されます。

Elasticsearchハンドラでは、Elasticsearch Javaクライアントを使用してElasticsearchノードに接続し、データを受信します。https://www.elastic.coを参照してください。

8.2.16.2.2 機能の詳細

このトピックでは、Elasticsearchハンドラの機能について詳しく説明します。

8.2.16.2.3 インデックスについて

Elasticsearchのインデックスは、類似した特性を持つドキュメントの集まりです。インデックスは小文字でのみ作成できます。Elasticsearchのタイプは、インデックス内の論理グループです。インデックスまたはタイプ内のすべてのドキュメントは、同じ番号およびタイプのフィールドを持つ必要があります。ElasticsearchのインデックスはRDBMSの表に相当します。

ソース証跡の3つの部分からなる表名の場合、インデックスはソース・カタログ、スキーマおよび表名を連結して構成されます。ソース表にカタログがない場合、Elasticsearchハンドラによってソース証跡スキーマがソース証跡表名と連結されてインデックスが構築されます。

表8-17 Elasticsearchのマッピング

ソース証跡 Elasticsearchのインデックス

schema.tablename

schema_tablename

catalog.schema.tablename

catalog_schema_tablename

Elasticsearchクラスタにまだインデックスが存在しない場合は、Elasticsearchハンドラがデータを受信すると(ソース証跡でのINSERTまたはUPDATE操作)、新しいインデックスが作成されます。

ハンドラがソース証跡でDELETE操作を受信したが、インデックスがElasticsearchクラスタに存在しない場合、ハンドラはABENDします。

8.2.16.2.4 ドキュメントについて

Elasticsearchのドキュメントは、インデックス付けのできる情報の基本単位です。インデックスまたはタイプ内に、必要な数のドキュメントを格納できます。各ドキュメントには_idフィールドに基づく一意の識別子があります。

ハンドラがソース証跡でDELETE操作を受信したが、インデックスがElasticsearchクラスタに存在しない場合、ハンドラはABENDします。

8.2.16.2.5 データ型について

Elasticsearchでは次のデータ型がサポートされています。

  • 32ビット整数

  • 64ビット整数

  • Double

  • Date

  • String

  • Binary

8.2.16.2.6 接続について

クラスタは、データ全体を保持する1つまたは複数のノード(サーバー)の集合です。すべてのノードにわたるフェデレーテッド索引付けおよび検索機能が提供されます。

ノードはクラスタの一部であり、データを格納し、クラスタの索引付けおよび検索に参加する単一のサーバーです。

Elasticsearchハンドラのプロパティgg.handler.name.ServerAddressListは、クラスタで使用可能なノードを指すように設定できます。

Elasticsearchハンドラは、クラスタ・ノードがトランスポート・レイヤー・プロトコルを使用して相互に内部的に通信する場合でも、Java APIクライアントを使用して、http/httpsプロトコルを介して前述のハンドラ・プロパティで構成されたElasticsearchクラスタ・ノードに接続します。

http/httpsのポートは、Elasticsearchクライアントを介した接続のハンドラ・プロパティ(トランスポート・ポートではなく)で構成する必要があります。

8.2.16.2.7 サポートされている操作について

Elasticsearchハンドラは、ターゲット内のElasticsearchクラスタへのレプリケーションに対して次の操作をサポートします。

INSERT

Elasticsearchハンドラでは、インデックスが存在しない場合、新規インデックスが作成されて新規ドキュメントが挿入されます。_idがすでに存在する場合、既存のレコードをsame _idの新しいレコードで上書き(置換)します。

UPDATE

Elasticsearchのインデックスやドキュメントが存在する場合は、そのドキュメントが更新されます。Elasticsearchのインデックスやドキュメントが存在しない場合は、新規インデックスが作成され、UPDATE操作の列の値が新規ドキュメントとして挿入されます。

DELETE

Elasticsearchのインデックスやドキュメントの_idが存在する場合は、そのドキュメントが削除されます。ドキュメントの_idが存在しない場合、何もせずに続行されます。Elasticsearchインデックスがない場合は、ハンドラをABENDします。

TRUNCATE操作はサポートされていません。

8.2.16.2.8 DDL処理について

Elasticsearchハンドラはソース証跡内のDDLレコードには反応しません。新規ソース表のデータ操作レコードにより、Elasticsearchクラスタでインデックスまたはタイプの自動作成が行われます。

8.2.16.2.9 主キーの更新について

Elasticsearchのドキュメント識別子はソース表の主キー列の値に基づいて作成されます。ドキュメント識別子は変更できません。

Elasticsearchハンドラでは、DELETEに続いてINSERTを実行することによってソース主キーの更新操作が処理されます。INSERTの実行中、新しいドキュメントのフィールドが必要なフィールド数よりも少ないことがあります。

ソース表内のすべてのフィールドをINSERT操作に含めるには、更新操作用にデータ全体のビフォア・イメージをキャプチャするように証跡のExtractを有効にするか、GETBEFORECOLSを使用して必要な列のビフォア・イメージを書き込みます。

8.2.16.2.10 UPSERTについて

Elasticsearchハンドラは、UPDATE操作のUPSERTモードをサポートしています。このモードを有効にするには、Elasticsearchハンドラ・プロパティgg.handler.name.upserttrueに設定します。デフォルトでは、これは有効になっています。

UPSERTモードでは、ソース証跡からのUPDATE操作について、Elasticsearchクラスタにドキュメントのインデックスまたは_idがない場合、インデックスが作成され、操作がINSERTに変換されて新しいレコードとして追加されます。

UPSERTfalseの場合、Elasticsearchハンドラは同じシナリオでABENDします。

今後のリリースでは、このメカニズムがHANDLECOLLISIONモードのOracle GoldenGateと一致するように拡張され、次のようになります:
  • 挿入の衝突が発生すると、重複エラーが発生します。
  • 更新または削除がないと、見つからないというエラーになります。
対応するエラー・コードは、Oracle GoldenGateのハンドル衝突ストラテジに従って、Replicatに返され、それによって処理されます。

8.2.16.2.11 一括書込みについて

Elasticsearchハンドラは一括操作モードをサポートしており、複数の操作を1つのバッチにグループ化でき、バッチ全体を1つのショットでターゲットElasticsearchクラスタに適用できます。これにより、パフォーマンスが向上します。

一括モードを有効にするには、Elasticsearchハンドラ・プロパティ gg.handler.name.bulkWriteの値をtrueに設定します。デフォルトでは無効です。

一括モードにはいくつかの制限があります。一括操作で障害が発生した場合(例外がスローされた場合)、ターゲットでデータの一貫性が失われる可能性があります。たとえば、ターゲットElasticsearchクラスタからインデックスが欠落している削除操作では、例外が発生します。このような操作が一括モードのバッチの一部である場合、その操作の失敗後にバッチは適用されず、一貫性が失われます。

一括APIのエラーを回避するには、ハンドラのMAXTRANSOPSサイズを一括スレッドのプール・キュー・サイズの最小値と一致するように設定する必要があります。

thread_pool.bulk.queue_size構成プロパティはelasticsearch.yamlファイルで変更できます。

8.2.16.2.12 ルーティングについて

ドキュメントは、_routing値を使用してインデックスの特定のシャードにルーティングされます。デフォルトの_routing値は、ドキュメントの_idフィールドです。カスタム・ルーティング・パターンを実装するには、ドキュメントごとにカスタム・ルーティング値を指定します。

Elasticsearchハンドラは、Elasticsearchハンドラ・プロパティ・ファイルのプロパティgg.handler.name.routingKeyMappingTemplateでマッピング・フィールド・キーを指定することで、カスタム・ルーティングをサポートします。

8.2.16.2.13 リクエスト・ヘッダーについて

Elasticsearchでは、RESTコールのhttpリクエストとともに、追加のリクエスト・ヘッダー(ヘッダー名と値のペア)を送信できます。Elasticsearchハンドラは、プロパティ・ファイルのElasticsearchハンドラ・プロパティgg.handler.name.headersでヘッダー名と値のペアを指定することで、追加のヘッダーの送信をサポートします。

8.2.16.2.14 Java APIクライアントについて

Elasticsearchハンドラは、Java APIクライアントを使用してElasticsearchクラスタを接続し、レプリケーションのすべての操作を実行するようになりました。内部でElasticsearch Restクライアントおよびトランスポート・クライアントを使用してすべての操作を実行します。高レベルのRestクライアントやトランスポート・クライアントなどの古いクライアントは非推奨であるため削除されました。

Elasticsearchクラスタのサポートされているバージョン

このハンドラを構成するには、Elasticsearchクラスタ・バージョン7.16.x以降を構成して実行する必要があります。Elasticsearchクラスタを構成するには、Elasticsearchの起動と実行を参照してください

8.2.16.2.15 Elasticsearchハンドラの設定

Elasticsearchクラスタが正しく設定され、そのクラスタが稼働していることを確認する必要があります。Elasticsearchクラスタのサポートされているバージョンは、7.16.x以降です。https://www.elastic.co/guide/en/elasticsearch/reference/current/index.htmlを参照してください。また、Kibanaを使用して設定を確認することもできます。

8.2.16.2.16 Elasticsearchハンドラ構成

Elasticsearchハンドラを構成するには、パラメータ・ファイル(res.prm)およびプロパティ(elasticsearch.props)ファイルを有効な値で構成する必要があります。

パラメータ・ファイル:

パラメータ・ファイルは、Elasticsearchハンドラの正しいプロパティ・ファイルを指す必要があります。

Elasticsearchハンドラの実行に必要なパラメータ・ファイル(res.prm)の必須パラメータは次のとおりです:
-	REPLICAT replicat-name  
-	TARGETDB LIBFILE libggjava.so SET property=dirprm/elasticsearch.props 
-	MAP schema-name.table-name, TARGET schema-name.table-name

プロパティ・ファイル:

次に、Elasticsearchハンドラの実行に必要なプロパティ・ファイル(elasticsearch.props)の必須プロパティを示します:

-	gg.handlerlist=elasticsearch
-	gg.handler.elasticsearch.type=elasticsearch
-	gg.handler.elasticsearch.ServerAddressList=127.0.0.1:9200

表8-18 Elasticsearchハンドラの構成プロパティ

プロパティ名 必須(はい/いいえ) 有効な値(デフォルト値) 説明
gg.handler.name.ServerAddressList はい [<Hostname|ip>:<port>, <Hostname|ip>:<port>, …]

[localhost:9200]

Elasticsearchクラスタのクラスタ・ノードの有効なホスト名(またはIP)およびポート番号を':'で区切ったリスト。
gg.handler.name.BulkWrite いいえ

[true | false]

デフォルト[false]

一括書込みモードが有効(trueに設定)の場合、トランザクションの操作はバッチに格納され、バッチ・サイズに応じてバッチ(トランザクション)に対して1つのショットでターゲットESクラスタに適用されます。
gg.handler.name.Upsert いいえ

[true | false]

[true]

アップサート・モードが有効になっている場合(trueに設定)、更新操作がターゲットESクラスタで欠落している場合は、新しいドキュメントとして挿入されます。
gg.handler.name.NumberAsString いいえ

[true | false]

[false]

数値を文字列として格納する場合に設定します。
gg.handler.name.ProxyServer いいえ [Proxy-Hostname | Proxy-IP] Elasticsearchクラスタに接続するプロキシ・サーバーのホスト名(またはIP)。
gg.handler.name.ProxyPort いいえ [ポート番号] プロキシ・サーバーのポート番号。プロキシが構成されている場合は必須です。
gg.handler.name.ProxyProtocol いいえ

[http | https]

[http]

プロキシ・サーバー接続のプロトコル。
gg.handler.name.ProxyUsername いいえ [プロキシ・サーバーのユーザー名] プロキシ・サーバーに接続するためのユーザー名。
gg.handler.name.ProxyPassword いいえ [プロキシ・サーバーのパスワード] プロキシ・サーバーに接続するためのパスワード。これは、ORACLEWALLETを使用して暗号化できます。
gg.handler.name.AuthType いいえ

[basic | ssl | none]

[none]

Elasticsearchクラスタへの接続に使用する認証タイプ。
gg.handler.name.BasicAuthUsername いいえ [ESクラスタのユーザー名] ESサーバーに接続するための基本認証のユーザー名資格証明。これは、ORACLEWALLETを使用して暗号化できます。
gg.handler.name.BasicAuthPassword いいえ [ESクラスタのパスワード] ESサーバーに接続するための基本認証のパスワード資格証明。これは、ORACLEWALLETを使用して暗号化できます。
gg.handler.name.Fingerprint いいえ [フィンガープリント・ハッシュ・コード] これは、すべての証明書のデータとその署名について計算された証明書のハッシュです。認証タイプSSLに適用できます。これは、ORACLEWALLETを使用して暗号化できます。
gg.handler.name.CertFilePath いいえ [/path/to/CA_certificate_file.crt] SSL/TLS認証用のCA証明書ファイル(.crt)。
gg.handler.name.TrustStore いいえ [/Path/to/trust-store-file] SSL/TLSサーバー認証用のサーバーのトラストストア・ファイルへのパス。認証タイプSSLに適用できます。
gg.handler.name.TrustStorePassword いいえ [trust-store password] SSL/TLS認証用のトラストストア・ファイルのパスワード。認証タイプSSLに適用できます。これは、ORACLEWALLETを使用して暗号化できます。
gg.handler.name.TrustStoreType いいえ [jks | pkcs12]

[jks]

SSL/TLS認証のキーストア・タイプ。認証タイプがSSLの場合に適用できます。
gg.handler.name.RoutingKeyMappingTemplate いいえ [ルーティング・フィールド名] これは、ESクラスタのインデックス内の特定のシャードにルーティングするために値がマップされるフィールド名を定義します。
gg.handler.name.Headers いいえ

[<key>:<value>,

<key>:<value>, …]

RESTコールで送信されるヘッダーの名前と値のペアのリスト。

gg.handler.name.MaxConnectTimeout

いいえ 時間(秒) リクエストがElasticsearchサーバーへの接続を待機する秒単位の時間。
gg.handler.name.MaxSocketTimeout いいえ 時間(秒) リクエストがElasticsearchサーバーからのレスポンスを待機する時間(秒)。
gg.handler.name.IOThreadCount いいえ IOリクエストを処理するスレッドの数。
gg.handler.name.NodeSelector いいえ

ANY | SKIP_DEDICATED _MASTERS | [ノード・セレクタ・クラスの完全修飾名]

[ANY]

事前定義済のストラテジANYまたはSKIP_DEDICATED_MASTERS。または、(NodeSelector.javaインタフェースを実装することによって)カスタム・ストラテジを実装するクラスの完全修飾名。

クラスパスの設定

Elasticsearchハンドラ・プロパティgg.classpathには、Java APIクライアントに必要なすべての依存性jarが含まれている必要があります。必要なクライアントJARファイルのリストおよびダウンロードについては、OGG_HOME/DependencyDownloaderディレクトリの依存性ダウンローダ・スクリプトelasticsearch_java.shを使用して、バージョン8.7.0を引数として渡します。Elasticsearchクライアント依存性の詳細は、「Elasticsearchハンドラ・クライアント依存性」を参照してください。

ディレクトリOGG_HOME/DepedencyDownloader/dependencies/elasticsearch_rest_8.7.0を作成し、その中のすべての依存性jarをダウンロードします。クライアント・ライブラリ・バージョン8.7.0は、サポートされているすべてのElasticsearchクラスタに使用できます。

この場所は、gg.classpath=/path/to/OGG_HOME/DepedencyDownloader/dependencies/elasticsearch_rest_8.7.0/*のようにクラスパスで構成できます

パスの末尾に*ワイルドカード文字を含めると、そのディレクトリ内のすべてのJARファイルを関連するクラスパスに含めることができます。*.jarは使用しないでください

Elasticsearchハンドラのサンプル構成:

参照用にElasticsearchハンドラを構成するには、Elasticsearchハンドラのサンプル・パラメータ(res.prm)およびサンプル・プロパティ・ファイル(elasticsearch.props)をディレクトリで使用できます:

OGG_HOME/AdapterExamples/big-data/elasticsearch

8.2.16.2.17 Elasticsearchのセキュリティの有効化

Elasticsearchクラスタには、本番環境でセキュアな方法でアクセスする必要があります。最初にElasticsearchクラスタでセキュリティ機能を有効にし、それらのセキュリティ構成をElasticsearchハンドラ・プロパティ・ファイルに追加する必要があります

8.2.16.2.18 Elasticsearchクラスタのセキュリティ構成

最新バージョンのElasticsearchのセキュリティは、インストールおよび起動時に自動構成されます。ログには、自動構成されたクラスタのセキュリティ詳細が次のように出力されます:

- Elasticsearch security features have been automatically configured!
-	Authentication is enabled and cluster connections are encrypted.
-	Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`): nnh0LWKZMLkw_QD5jxhE
-	HTTP CA certificate SHA-256 fingerprint: 862e3f117c386a63f8f43db88760d463900e4c814590b8920e1c0e25f6db4df4
-	Configure Kibana to use this cluster:
-	Run Kibana and click the configuration link in the terminal when Kibana starts.
-	Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes): eyJ2ZXIiOiI4LjYuMiIsImFkciI6WyIxMDAuNzAuOTguNzM6OTIwMCJdLCJmZ3IiOiI4NjJlM2YxMTdjMzg2YTYzZjhmNDNkYjg4NzYwZDQ2MzkwMGU0YzgxNDU5MGI4OTIwZTFjMGUyNWY2ZGI0ZGY0Iiwia2V5IjoiUTVCVF9vWUJ2TnZDVXBSSkNTWEM6NkJNc3ZXanBUYWUwa0l6V1pDU1JPQSJ9

これらのセキュリティ・パラメータ値は書き留めて、Elasticsearchハンドラを構成するために使用する必要があります。自動生成された証明書はすべて、ElasticSearch-install-directory/config/certフォルダ内に作成されます。

古いバージョンのElasticsearchに対してセキュリティが自動構成されていない場合、Elasticsearchクラスタの実行前に、次の構成ファイルで基本認証および暗号化された(SSL)認証などのセキュリティ機能を手動で有効にする必要があります。

Elasticsearch-installation-directory/config/elasticsearch.yml
elasticsearch.ymlファイルのセキュリティ機能を有効にしてElasticsearchクラスタを再起動するには、次のパラメータを追加する必要があります。

#----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------
# The following settings, TLS certificates and keys have been 
# configured for SSL/TLS authentication.
# -----------------------------------------------------------------------
# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true

# Enable encryption for HTTP API client connections
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["cluster-host-name"]

# Allow HTTP API connections from anywhere
# Connections are encrypted and require user authentication
http.host: 0.0.0.0
#----------------------- END SECURITY AUTO CONFIGURATION --------------
Elasticsearchクラスタのセキュリティ設定の詳細は、https://www.elastic.co/guide/en/elasticsearch/reference/current/manually-configure-security.htmlを参照してください

8.2.16.2.19 Elasticsearchハンドラのセキュリティ構成

Elasticsearchハンドラでは、次の値を使用してElasticsearchハンドラ・プロパティgg.handler.name.authTypeを使用して構成できる3つのセキュリティ構成モードがサポートされています: Elasticsearch-installation-directory/config/elasticsearch.yml
  1. なし: このモードは、Elasticsearchスタックでセキュリティ機能が有効になっていない場合に使用されます。このモードに他の構成は必要ありません。Elasticsearchにはhttpプロトコルを使用して直接アクセスできます。
  2. Basic: このモードは、ユーザーのユーザー名とパスワードを設定して、ユーザーに対して基本セキュリティ機能のみが有効になっている場合に使用されます。Elasticsearchクラスタにアクセスするには、基本認証のユーザー名およびパスワード・プロパティをプロパティ・ファイルで指定する必要があります。
    gg.handler.name.authType=basic
    gg.handler.name.basicAuthUsername=elastic
    gg.handler.name.basicAuthPassword=changeme
    
  3. SSL: このモード・モードは、ElasticsearchスタックでSSL/TLS認証が暗号化用に構成されている場合に使用されます。ハンドラをElasticsearchクラスタに接続できるようにするには、CAフィンガープリント・ハッシュ、CA証明書ファイル(.crt)へのパスまたはトラストストア・ファイルへのパス(トラストストア・タイプおよびトラストストア・パスワード)のいずれかを指定する必要があります。このモードでは、Elasticsearchスタックで構成されたSSL/TLS認証と基本認証の組合せもサポートされています。両方がElasticsearchクラスタで構成されている場合、ユーザーは基本認証プロパティ(ユーザー名とパスワード)とSSL関連プロパティ(フィンガープリント、証明書ファイルまたはトラストストア)の両方を構成する必要があります。
    gg.handler.name.authType=ssl
    
    # if basic authentication username and password is configured. 
    gg.handler.name.basicAuthUsername=username
    gg.handler.name.basicAuthPassword=password
    
    # for SSL one of these three must be configured
    gg.handler.name.certFilePath=/path/to/ESHome/config/certs/http_ca.crt
    				OR
    gg.handler.name.fingerprint=862e3f117c386a63f8f43db88760d463900e4c814590b8920e1c0e25f6db4df4
    				OR
    gg.handler.name.trustStore=/path/to/http.p12
    gg.handler.name.trustStoreType=pkcs12
    gg.handler.name.trustStorePassword=pass
    

機密情報を含む前述のセキュリティ関連プロパティはすべて、Oracle Walletを使用してプロパティ・ファイル内の機密値を暗号化するように構成できます。

8.2.16.2.20 トラブルシューティング

  1. エラー: org.elasticsearch.ElasticsearchException[Index [index-name] is not found] - この例外は、削除操作があり、対応する削除操作のインデックスがElasticsearchクラスタに存在しない場合に発生します。これは、upsert=falseおよびインデックスがない場合の更新操作でも発生する可能性があります。
  2. エラー: javax.net.SSL.SSLHandshakeException:[ Connection failed ] - これは、前述のelasticsearch.ymlファイルで認証を有効にするためのプロパティが認証タイプSSLにない場合に発生する可能性があります。
  3. エラー: javax.net.ssl.SSLException: [Received fatal alert: bad_certificate] - この問題は、ホストの検証に失敗した場合に発生します。Elasticsearchのcert-utilsを使用して生成された証明書にホスト情報が含まれていることを確認します。

8.2.16.2.21 Elasticsearchハンドラ・クライアント依存性

Elasticsearchデータベースに接続するためのElasticsearchハンドラの依存性とはどのようなものでしょう。

Maven Central RepositoryのElasticsearchデータベースのアーティファクトは次のとおりです。

Maven groupId: co.elastic.clients

Maven atifactId: elasticsearch-java

バージョン: 8.7.0

8.2.16.2.21.1 Elasticsearch 8.7.0
commons-codec-1.15.jar
commons-logging-1.2.jar
elasticsearch-java-8.7.0.jar
elasticsearch-rest-client-8.7.0.jar
httpasyncclient-4.1.5.jar
httpclient-4.5.13.jar
httpcore-4.4.13.jar
httpcore-nio-4.4.13.jar
jakarta.json-api-2.0.1.jar
jsr305-3.0.2.jar
parsson-1.0.0.jar