🔰

OpenSearch の構成要素

2024/05/13に公開

はじめに

業務で OpenSearch を使う機運が高まってきたので、OpenSearch の構成要素や用語をまとめてみました。

OpenSearch とは

OpenSearchは、Elasticsearch 7.10.2 をフォークして開発された、オープンソースの全文検索・分析エンジンです。
OpenSearchは、Elasticsearch と同様に大量データの検索や解析を高速に行うことができます。

https://aws.amazon.com/jp/what-is/opensearch/

OpenSearch と Amazon OpenSearch Service

サービス名が似ているので混乱しやすいですが、OpenSearch とは前述の通りオープンソースの全文検索・分析エンジンです。
Amazon OpenSearch Service は、AWS が提供する OpenSearch を簡単にデプロイ・管理、スケール可能なフルマネージドサービスです。

OpenSearch の論理的構成要素

Index

ドキュメントの集合、RDBMS でいうところのデータベース。
余談ですが、インデックスをドキュメントに登録することを「インデックスする」と言います。

Document

データを格納する最小単位。JSON 形式で保存され、複数のフィールドを様々なデータ型で持つことができる。
RDBMS でいうところのレコード。

{
  "name": "John Doe",
  "age": 25,
  "email": "[email protected]"
}

Field

ドキュメント内のキーと値からなる要素。RDBMS でいうところのカラム。

Mapping

インデックスに格納されるデータの構造と型を定義するもの。RDBMS でいうところのスキーマ定義。

OpenSearch の物理的構成要素

Cluster

クラスターとは、複数のノードを1つのユニットとして管理し、検索や管理を行う分散システムです。

Node

OpenSearch のプロセスが動作する単一のサーバーを指します。
基本的には、1つのノードは1つの OpenSearch プロセスで構成します。
1つのノードで複数の OpenSearch プロセスを動作させる事は一般的には推奨されていないようです。

以下は、Elasticsearch ディスカッションの内容ですが、OpenSearch でも同様の考え方が適用されると思われます。

Unless you have a large bare-metal server with 128 GB RAM or more, having multiple nodes on the same host does not makes much sense.
You will have multiple small nodes competing for the same resources, elasticsearch is more bound to the disk and memory than to the CPU cores and in the end if your host fails, your entire cluster fails. In this case is better to have a larger node instance.
But to run multiple nodes in the same hosts you need to have a different elasticsearch.yml for every node with separated data and log folders, there isn't a way to use the same elasticsearch.yml to run multiple nodes at the same time.
Even if you have large servers with 128 GB or more, I would recommend to use docker to run the instances instead of configure multiple nodes in the same host.

意訳
大きなベアメタルサーバー(128GBのRAM以上)を持たない限り、同じホストで複数のノードを実行することにはあまり意味がありません。
なぜなら、複数の小さなノードがリソースを争い、Elasticsearch は CPU コアよりもディスクとメモリに依存しているためです。ホストが故障した場合には、クラスター全体がダウンします。その場合、より大きなノードインスタンスを使用する方が良いでしょう。
同じホストで複数のノードを実行するには、各ノードごとに異なる設定ファイル(elasticsearch.yml)と分離されたデータおよびログフォルダーが必要です。同じ設定ファイルを使って複数のノードを同時に実行する方法はありません。
128GB以上の大きなサーバーを持っている場合でも、同じホストで複数のノードを設定する代わりに、インスタンスを実行するためにDockerを使用することをお勧めします

https://discuss.elastic.co/t/setting-up-a-multi-nodes-cluster-on-a-single-machine-1-elasticsearch-yml-file/272286

Node Roles

ノードロールとは、ノードがクラスター内でどのような目的と責任を持つかを定義するものです。
クラスタの設定に基づいて、各ノードに複数のロールを割り当てることができます。
明示的にロールを指定しない場合、自動的にデフォルトのロールとして Cluster Manager EligibleDataIngestCoordinating が付与されるようです。(OpenSearch 2.13

※ 下記は一部です。その他のノードロールについては公式ドキュメントを参照してください。

Cluster Manager

クラスタ全体の運用を管理するノード。
インデックスの作成と削除、クラスターへのノードの参加と離脱の監視、各ノードのヘルスチェック(pingリクエスト)およびシャードの割り当てを含みます。

Elasticsearch で使われる master node という用語は、OpenSearch では cluster manager node に置き換えられています。
恐らくですが、よりニュートラルな用語として変更されたのだと思われます。(Splunk でも同様に master node という用語は使用されなくなっています。manager node

Cluster Manager Eligible

クラスタマネージャーに障害が発生した際に、クラスタマネージャーとして機能することができる資格を持ったノード。

Data

クラスタ内でデータを格納し、検索および索引付けなどのデータ関連操作を実行するノード。
ロールから予想はつきますが、他のどのノードタイプよりも多くのディスク容量を必要とします。

Ingest

ドキュメントをインデックスに保存する前処理を行うノード。
データの形式を変更したり、不要な情報をフィルタリングしたり、データに追加の情報を付与などができる。

Coordinating

クラスターの HTTP(S) リクエスト、インデックス作成リクエストと検索リクエストを処理するノード。
Coordinating ロールを持つノードが Cluster Manager Eligible、Data ではない場合、Coordinating Only(CO)ノードと呼ばれます。
CO はデータノードとマスターノードを、HTTP(S)リクエストのリソース要求から隔離することができるため、クラスタのパフォーマンスを向上させることができるようです。(OpenSearch Coordinating Node

Shard

シャードはインデックスを分割したものです。これらノードから成るクラスターで並列処理や分散ストレージを可能にしています。
シャードには、プライマリーシャードとレプリカシャードの2つの種類があります。
プライマリーシャードはオリジナルのデータを保持し、レプリカシャードはプライマリーシャードのコピーを保持します。

レプリカシャードは何かしらの障害でプライマリーシャードが利用できなくなった場合に、データの可用性を高めるために使用されます。
また、検索リクエストをプライマリーシャードとレプリカシャードに分散することで、検索のパフォーマンスを向上させることができます。

シャードは内部的には Lucene のインデックスであり、それぞれが独自の Lucene プロセスとして動作します。
シャードの数が増えると、それぞれのプロセスがリソースを消費するため、全体的なシステムのオーバーヘッドが増加します。
そのため、シャード数は適切に分割することが重要のようです。

OpenSearch では、理想的なシャードサイズとして1シャードあたり10~50GBを推奨しています。
シャードあたり10~30GBは、アプリケーションの検索や読み込みの負荷が高い場合に推奨され、30~50GBは、ログ分析のような書き込み負荷の高いワークロードに適しているようです。

https://opensearch.org/blog/optimize-opensearch-index-shard-size/

参考

GitHubで編集を提案

Discussion