Elasticsearch クラスターのデプロイメント
1. Elasticsearch クラスターのアーキテクチャ
Elasticsearch クラスターは、複数のノードで構成される強力な検索および分析エンジンであり、各ノードは独立した Elasticsearch インスタンスです。これらのノードは連携して、可用性とスケーラブルな検索エンジンを構築します。この記事では、マスターノード、データノード、クライアントノード、シャード、ノード間の通信方法など、Elasticsearch クラスターのアーキテクチャとデプロイメントについて詳しく説明します。
マスターノード
Elasticsearch クラスターには、マスター ノードとして指定されたノードが 1 つあります。マスター ノードの主なタスクは、クラスターの管理と調整です。マスターノードの主な役割の一部を次に示します。
-
クラスターのステータスを維持する:
节点列表、索引元数据和分片状态
マスター ノードは、クラスター全体(などを含む) のステータスを維持する責任があります。 -
クラスターのリバランスを担当します:新しいノードがクラスターに参加するか、古いノードがクラスターから離脱する場合、マスター ノードが責任を負います
重新平衡集群,确保分片被适当地重新分配给节点,以保持负载均衡
。 -
クラスターレベルの操作を実行する:マスターノードは、インデックスの作成または削除、インデックスレベルの設定などのクラスターレベルの操作を実行できます。
-
ノードのステータスを監視する:マスター ノードは、クラスタ内の各ノードのステータスを監視し、ノードが適切に動作しているかどうかを適時に検出します。
クラスター内に存在できるマスター ノードは 1 つだけです。マスターノードに障害が発生した場合、Elasticsearch は自动选举
新しいマスターノードを作成して作業を引き継ぎ、クラスターの安定した動作を保証します。
データノード
データ ノードの主な役割は です存储和处理数据
。クライアントがクラスターに対して検索リクエストを開始すると、データ ノードはリクエストに従ってローカル データをクエリし、結果を返します。各データ ノードは、クラスター内のデータの一部を保存する責任を負います。新しいデータにインデックスが付けられると、データ ノードはそのデータを対応するシャードに割り当て、そのシャードをローカル ディスクに保存します。データ ノードに障害が発生した場合、クラスター内の他のノードがノードの作業を引き継ぎ、データの可用性と冗長バックアップを確保します。
クライアントノード
クライアント ノードはデータを保存しません。その主な役割は、クライアントにデータを提供することです集群发送查询请求,并将查询结果返回给客户端应用程序
。
クライアント ノードには次の 2 つの重要な役割があります。
-
負荷分散:クライアント ノードは、負荷分散を実現し、クエリのパフォーマンスを向上させるために、クエリ リクエストをさまざまなデータ ノードに割り当てることができます。
-
フェイルオーバー:データ ノードに障害が発生した場合、クライアント ノードはクエリ要求を他の正常なノードに自動的に切り替えて、サービスの可用性を確保します。
断片化
Elasticsearch クラスターでは、データはストレージと管理のために複数のシャードに分割されます。各シャードは、 を含む独立した Lucene インデックスです一部分数据和索引信息
。これを実現するために、シャーディングをクラスター内のさまざまなノードに分散および複製できます高可用性和数据冗余
。
各インデックスは、複数のプライマリ シャードと複数のレプリカ シャードに分割できます。プライマリ シャードはインデックスの基本単位であり、データとインデックス情報の一部が含まれています。各プライマリ シャードは、クラスター内の任意のノードに保存できる独立した Lucene インデックスです。レプリカ シャードはプライマリ シャードのコピーであり、クエリの効率と可用性を向上させるために使用されます。
シャードの数はインデックスの作成時に指定され、作成後に変更することはできません。通常、主分片的数量应该与集群中的数据节点数量相匹配
各ノードが特定の数のシャードを保存できるようにするためです。
ノード間の通信
Elasticsearch クラスターでは、ノードはネットワーク経由で相互に通信します。各ノードには一意のノード名があり、Elasticsearch によって自動的に生成されます。ノード名は通常、次の形式を取ります。
<host>-<uuid>
このうち、host はノードが配置されているホスト名、uuid はノード名の一意性を保証するために使用される一意の識別子です。
ノード間の通信は、HTTP プロトコルとトランスポート プロトコルの 2 つの方法で実行できます。HTTP プロトコルは Elasticsearch のデフォルトのプロトコルであり、RESTful API リクエストを処理するために使用されます。トランスポート プロトコルは、ノード間の直接通信のために Elasticsearch クラスターによって内部的に使用されるプロトコルです。
クラスターのステータス
Elasticsearch クラスターの状態は次の 3 種類に分類できます。
-
緑:クラスターは正常で、すべてのプライマリ シャードとレプリカ シャードが使用可能です。
-
黄色:クラスターは部分的に利用可能であり、すべてのプライマリ シャードは利用可能ですが、一部のレプリカ シャードは利用できません。
-
赤:クラスターが使用できず、少なくとも 1 つのプライマリ シャードが使用できません。
Elasticsearch クラスター内のノードに障害が発生すると、マスターノードは障害が発生したノードをクラスターから自動的に削除し、そのノードに割り当てられていたシャードを他のノードに再配布します。障害が発生したノードが正常に戻ったら
、データの整合性と可用性を確保するために、クラスターに再参加し、シャードを再配布します。
Elasticsearch のクラスター アーキテクチャは、大規模なデータ ストレージと検索に高い拡張性と可用性を提供し、複雑な検索と分析のニーズを処理するのに最適です。クラスター アーキテクチャのさまざまなコンポーネントと役割を理解することで、ビジネス ニーズに合わせて Elasticsearch クラスターをより適切に計画および管理できます。
2. Elasticsearch クラスターのデプロイメント
2.1 システム構成の変更
2.1.1 ファイルハンドルとスレッドの数を変更する
Elasticsearch ユーザーが所有する作成可能なファイル記述子に対する権限が低いことによって発生するエラーを防ぐには、ファイル ハンドルとスレッドの数を変更する必要があります。/etc/security/limits.conf
ファイルを編集し、次の内容を追加します。
# 文件句柄
es soft nofile 65536
es hard nofile 65536
# 线程
es soft nproc 4096
es hard nproc 4096
保存退出后,需要重新启动系统
上記の構成は次のことを解決するためのものです。
エラー レポート: elasticsearch プロセスの最大ファイル記述子 [4096] が低すぎます。少なくとも [65535] まで増やしてください。
問題の説明: elasticsearch ユーザーのファイル記述を作成するには権限が低すぎます。少なくとも 65536 が必要です。
2.1.2 仮想メモリの変更
/etc/sysctl.conf
ファイルを編集し、次の内容を追加します。
vm.max_map_count=262144
保存して終了した後、構成ファイルを更新します。
sysctl -p
変更が成功したかどうかを確認します。
sysctl vm.max_map_count
上記の設定は、
エラーの問題を解決するためのものです: 最大仮想メモリ領域 vm.max_map_count [65530] が低すぎます。少なくとも [262144] まで増やしてください。
2.1.3 スワップ空間のクローズ(Swap)
公式推奨: メモリの半分を Lucene+ に与え、32G を超えないようにする + スワップをオフにする
ES では、スワップ メモリのスワップ スペースをオフにし、スワップを無効にすることを推奨しています。メモリがディスクにスワップされると、100 マイクロ秒の操作が 10 ミリ秒になり、さらに 100 マイクロ秒の操作遅延が加算され、スワップがパフォーマンスに致命的な影響を与えることがわかります。
vim /etc/fstab
コメントにはスワップ行が含まれています。
コメントの前:
保存退出后需要系统重启!
コメント後:
2.2 es データベースをダウンロードしてサーバーにアップロードする
Elasticsearch 7.17.11 をダウンロードし、サーバーにアップロードし、次のコマンドを使用して Elasticsearch を解凍します。
cd /mnt/data/es-cluster
tar -zxvf elasticsearch-7.17.11-linux-x86_64.tar.gz
コピーを 3 つ作成し、次のように名前を付けます。
2.3 クラスタ構成ファイルの変更
2.3.1 elasticsearch.yml設定項目の説明
設定項目 | 設定手順 | 構成例 |
---|---|---|
クラスタ名 | クラスター名 | エスクラスター |
ノード名 | ノード名 | ノード1 |
パス.データ | データディレクトリ | /home/es/パス/ノード/データ |
パス.ログ | ログディレクトリ | /home/es/パス/ノード/ログ |
ノード名 | ノード名 | ノード1 |
ネットワーク.ホスト | IPアドレスをバインドする | 127.0.0.1 |
http.ポート | サービスアクセスポートの指定 | 9201 |
トランスポート.tcp.ポート | APIクライアントの呼び出しポートを指定する | 9301 |
Discovery.seed_hosts | クラスタ通信アドレス | [“127.0.0.1:9301”、“127.0.0.1:9301:9302”、“127.0.0.1:9301:9303”] |
クラスター.initial_master_nodes | クラスタの初期化で選択できるノード情報 | [“127.0.0.1:9301”、“127.0.0.1:9301:9302”、“127.0.0.1:9301:9303”] |
http.cors.enabled | クロスドメイン アクセスのサポートを有効にする | 真実 |
http.cors.allow-origin | クロスドメインアクセスが許可されるドメイン名 | 「*」 |
ポートの割り当ては次のとおりです。
ホスト | ノード名 | HTTPポート | 輸送ポート |
---|---|---|---|
192.168.0.119 | ノード1 | 9201 | 9301 |
192.168.0.119 | ノード2 | 9202 | 9302 |
192.168.0.119 | ノード3 | 9203 | 9303 |
2.3.2 node1のノード構成情報の変更
vim /mnt/data/es-cluster/elasticsearch-7.17.11-node1/config/elasticsearch.yml
elasticsearch.yml
# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node1
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/logs
# 指定服务访问端口
http.port: 9201
# 指定API端户端调用端口
transport.tcp.port: 9301
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3
2.3.2 ノード2のノード構成情報の変更
vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/config/elasticsearch.yml
elasticsearch.yml
# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node2
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/logs
# 指定服务访问端口
http.port: 9202
# 指定API端户端调用端口
transport.tcp.port: 9302
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3
2.3.3 node3のノード構成情報の変更
vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node3/config/elasticsearch.yml
elasticsearch.yml
# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node3
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/logs
# 指定服务访问端口
http.port: 9203
# 指定API端户端调用端口
transport.tcp.port: 9303
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3
2.4 Elasticsearch ユーザーとグループの作成
「es」という名前のユーザーと「es」という名前のグループを作成し、そのユーザーをグループに追加します。
# 新建群组es
groupadd es
# 新建用户es并指定群组为es
useradd -g es es
# 设置用户密码
passwd es
# usermod 将用户添加到某个组group
usermod -aG root es
2.5 ディレクトリの権限を設定する
Elasticsearch クラスター ディレクトリが属するユーザーとグループを設定します。
chown -R es:es /mnt/data/es-cluster
2.6. Elasticsearch サービスの開始
2.6.1 起動メモリの構成 (オプション)
単一マシンのメモリ サイズが制限されている場合は、es の起動メモリ サイズを設定できます。3 つのノードそれぞれの /config ディレクトリに入り、 を実行してvim jvm.options
、構成を変更します。
-Xms512m
-Xmx512m
2.6.2 サービスを開始および停止するスクリプトの作成
三个es节点
Elasticsearch サービスを開始および停止するスクリプトを作成する
( 注意当前目录是在 ../elasticsearch-7.17.11-node1
)
-
スターツシングル.sh
#!/bin/bash cd "$(dirname "$0")" # -d:后台(daemon)方式运行 Elasticsearch ./bin/elasticsearch -d -p pid
-
stop-single.sh
#!/bin/bash cd "$(dirname "$0")" if [ -f "pid" ]; then pkill -F pid fi
-
実行権限を付与します。
chmod 755 startes-single.sh stopes-single.sh chown es:es startes-single.sh stopes-single.sh
-
Elasticsearch ユーザーとして Elasticsearch サービスを開始します。
su es cd /mnt/sdb/es-cluster/elasticsearch-7.17.11-node1 ./startes-single.sh
考えられるエラー:
- ノード ロックの取得に失敗しました。ロック ID [0] で [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] を試行しました。おそらくこれらの場所は書き込み可能ではないか、複数のノードが増加せずに起動された可能性があります。
][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node2] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:173) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.11.jar:7.17.11]
Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.node.Node.<init>(Node.java:429) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.node.Node.<init>(Node.java:309) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.11.jar:7.17.11]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169) ~[elasticsearch-7.17.11.jar:7.17.11]
... 6 more
uncaught exception in thread [main]
java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328)
at org.elasticsearch.node.Node.<init>(Node.java:429)
at org.elasticsearch.node.Node.<init>(Node.java:309)
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
at org.elasticsearch.cli.Command.main(Command.java:77)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
解決策: 構成ファイルに「node.max_local_storage_nodes: 3」を追加します。
この構成では、単一ノードで開くことができる ES ストレージ インスタンスの数が制限されます。単一マシン上で複数のインスタンスを起動する必要がある場合は、この構成を構成ファイルに書き込み、この構成に 2 以上の値を割り当てる必要があります。
2.7 ファイアウォールのポートを開く
CentOS
# 查看防火墙状态
systemctl status firewalld
# 查看开放的端口
firewall-cmd --query-port=9200/tcp
# 添加端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 再次查看端口是否已经开放
firewall-cmd --query-port=9200/tcp
Ubuntu
# 查看防火墙状态
sudo ufw status
# 开放端口 9200
sudo ufw allow 9200/tcp
# 查看已添加的规则
sudo ufw status numbered
# 查看防火墙状态
sudo ufw status
2.8 esの起動ステータスを表示する
- 3 つのノードの http ポートにそれぞれアクセスします
- ノードのステータスを表示する
http://192.168.0.119:9201/_cat/nodes?pretty
3 つのノードの情報が表示され、3 つのノードが独自にマスター ノードを選択します (ES は Bully 選出アルゴリズムに基づいて改良された実装です)。
- クラスターの健全性ステータスを表示する
http://192.168.0.119:9201/_cluster/health?pretty
4.Elasticsearchヘッダービュー