我使用EC2 Discovery Plugin构建了一个Elasticsearch7的集群的故事
首先
在用EC2构建Elasticsearch集群时,EC2 Discovery插件非常方便!
在Elasticsearch 7系中,节点发现(Discovery)方式在集群配置时发生了变化。
因此,我重新确认了在使用EC2 Discovery插件的情况下,elasticsearch.yml的设置是如何的。这篇文章是我在那个时候记录下来的备忘录。
关于7系的节点检测
在6系版本之前,通过discovery.zen.minimum_master_nodes参数指定了维护集群所需的最低主节点数。
在7系中,启动集群的检查过程中,需要明确指定cluster.initial_master_nodes所指定的主节点的主机名或IP地址,以便进行访问。※如果类似滚动更新的情况下绝对不关闭集群,则即使没有设置也可以运行。
此外,Zen Discovery的参数名称已更改如下。
※ 本次将使用discovery.seed_providers。
【参考】
・ 下一代Elasticsearch集群协作
・ 7系中节点发现方法的变更点
・ 引导集群
EC2发现插件是什么?
在使用多个EC2实例组成Elasticsearch集群时,可以通过插件而不是使用discovery.seed_hosts来检测主节点的适配节点。
我们可以使用附加给EC2的标签和安全组来进行节点检测。(我们正在确认使用安全组进行设置)
【参考】
· EC2发现插件
充分利用环境

【補足】
– 为了下载安装所需的软件包,已将其放置在公共位置。
– Elasticsearch的三台服务器都扮演着主节点和数据节点的角色。
– Elasticsearch集群间的Discover通信使用9300-9305端口。(默认为9300)
– EC2的IP地址已经通过”ip addr”命令事先确认过。
执行步骤
-
- 创建IAM角色
-
- 创建安全组
-
- 安装Elasticsearch
-
- 安装discovery-ec2插件
-
- 配置集群
- 进行运行验证
【補充】
· 在本提交中,假设VPC、子网和EC2实例已经预先创建。
· 所有EC2操作都是通过Systems Manager的会话管理器进行的。
创建IAM角色
-
- AWSマネージメントコンソールにログインします。
IAM > ポリシーでポリシーの作成を実施します。
JSONタブを開き、下記のポリシーを貼り付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:DescribeInstances"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
※ Elasticsearch在节点发现时参考EC2的元数据
-
- 次に作成したIAMポリシーをIAMロールに割り当てます。
IAM > ロールでロールの作成を実施します。
下記内容で作成します。
- 作成したIAMロールを3台のEC2に割り当てます。
创建安全组
EC2 > セキュリティグループでセキュリティグループを作成を実施します。
下記内容で作成します。

3. 安装Elasticsearch
-
- Amazon Linux2は公式サイトのRPMでの手順でインストールします。
- 下記コマンドでPGP鍵をインポートします。
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
- 下記コマンドでRPMリポジトリ定義ファイルを作成します。
$ sudo vi /etc/yum.repos.d/elastic.repo
[elastic]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
- 下記コマンドでElasticsearchパッケージをインストールします。
$ sudo sudo yum install --enablerepo=elastic elasticsearch
- 下記コマンドでElasticsearchと同梱されているOpneJDKのバージョンを確認します。
$ yum list installed | grep elastic
$ /usr/share/elasticsearch/jdk/bin/java --version
- 下記コマンドでElasticsearchデーモンの自動起動設定をします。
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch
※ 在这里不会启动守护进程。
※ 我们将在三台设备上执行相同的安装步骤。
4. 安装 discovery-ec2 插件。
- 下記コマンドでプラグインをインストールします。
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install discovery-ec2
5. 集群的设置
- 下記コマンドで設定ファイルにクラスタ設定を行います。(3台とも同じ設定を行います)
$ sudo vi /etc/elasticsearch/elasticsearch.yml
# リッスンするIPアドレスを指定
- #network.host: 192.168.0.1
+ network.host: _eth0_
# ノード検出方法でEC2 Discovery有効化
- discovery.seed_hosts: ["host1", "host2"]
+ discovery.seed_providers: ec2
+ discovery.ec2.groups: "sg-01b2b630a5385f442"
+ discovery.ec2.endpoint: "ec2.us-west-2.amazonaws.com"
+ discovery.ec2.availability_zones: ["us-west-2a", "us-west-2b", "us-west-2c"]
# クラスタ起動時のマスター参照設定 (bootstrapping a cluster)
+ cluster.initial_master_nodes: ["10.0.1.174", "10.0.2.92", "10.0.3.230"]
请根据每个人的环境适当调整安全组ID和主匹配节点的IP地址。
- 下記コマンドでElasticsearchを起動します。(3台とも)
$ sudo systemctl start elasticsearch
6. 验证动作
- 下記コマンドでクラスタ状態を確認します。
$ curl http://<ElasticsearchのIPアドレス>:9200/_cluster/health?pretty
# 下記は正常時のレスポンスになります。
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
如果状态是绿色且节点数为3,则表示正常。
群集名称默认为elasticsearch。
- 下記コマンドはクラスタ内のノードの状態になります。(es02がマスターに選出されています)
$ sudo curl http://<ElasticsearchのIPアドレス>:9200/_cat/nodes?v
# 下記は正常時のレスポンスになります。
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.0.2.92 33 64 4 0.02 0.15 0.11 cdfhilmrstw * ip-10-0-2-92.us-west-2.compute.internal
10.0.3.230 8 63 4 0.05 0.22 0.15 cdfhilmrstw - ip-10-0-3-230.us-west-2.compute.internal
10.0.1.174 45 63 4 0.01 0.08 0.05 cdfhilmrstw - ip-10-0-1-174.us-west-2.compute.internal
- 余談ですが、cluster.initial_master_nodesを設定しないと下記エラーログが出力されます。
$ sudo tail -f /var/log/elasticsearch/elasticsearch.log
2021-05-05T23:53:31,994][WARN ][o.e.c.c.ClusterFormationFailureHelper] [ip-10-0-1-174.us-west-2.compute.internal] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and [cluster.initial_master_nodes] is empty on this node: have discovered [{ip-10-0-1-174.us-west-2.compute.internal}{ctcTgFMWQGiCqi0dWIr9Ow}{7yMMGhinTViqK2eoeL_wzg}{10.0.1.174}{10.0.1.174:9300}{cdfhilmrstw}{ml.machine_memory=4073328640, xpack.installed=true, transform.node=true, ml.max_open_jobs=20, ml.max_jvm_size=1073741824}, {ip-10-0-3-230.us-west-2.compute.internal}{9Xpmo5b6SqKlloXUWRzeGg}{J9Ag6Ng3QXuwqCxMZGVj6g}{10.0.3.230}{10.0.3.230:9300}{cdfhilmrstw}{ml.machine_memory=4073328640, ml.max_open_jobs=20, xpack.installed=true, ml.max_jvm_size=1073741824, transform.node=true}, {ip-10-0-2-92.us-west-2.compute.internal}{2V-zcyrySuy13tlNBtRskQ}{xqPqlOH7Sp-pMEGFTGDOSA}{10.0.2.92}{10.0.2.92:9300}{cdfhilmrstw}{ml.machine_memory=4073328640, ml.max_open_jobs=20, xpack.installed=true, ml.max_jvm_size=1073741824, transform.node=true}]; discovery will continue using [127.0.0.1:9300, 127.0.0.1:9301, 127.0.0.1:9302, 127.0.0.1:9303, 127.0.0.1:9304, 127.0.0.1:9305, [::1]:9300, [::1]:9301, [::1]:9302, [::1]:9303, [::1]:9304, [::1]:9305, 10.0.2.92:9300, 10.0.1.174:9300, 10.0.3.230:9300] from hosts providers and [{ip-10-0-1-174.us-west-2.compute.internal}{ctcTgFMWQGiCqi0dWIr9Ow}{7yMMGhinTViqK2eoeL_wzg}{10.0.1.174}{10.0.1.174:9300}{cdfhilmrstw}{ml.machine_memory=4073328640, xpack.installed=true, transform.node=true, ml.max_open_jobs=20, ml.max_jvm_size=1073741824}] from last-known cluster state; node term 0, last-accepted version 0 in term 0
果然,仅仅使用插件是不行的,还需要设置cluster.initial_master_nodes。
综上所述
以上是针对EC2集群配置的步骤,请问您对此有何看法?
我认为通过使用插件,就不需要关注主适配节点的IP地址了。但是由于需要在cluster.initial_master_nodes中指定,所以减少了一半的喜悦感。
我一开始也觉得不需要插件,但幸好在EC2上成功搭建了7系列的集群,所以就没事了,算是不错的结果^^