我使用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。

6系まで7系からdiscovery.zen.ping.unicast.hostsdiscovery.seed_hostsdiscovery.zen.hosts_providerdiscovery.seed_providersdiscovery.zen.no_master_blockcluster.no_master_block

【参考】
・ 下一代Elasticsearch集群协作
・ 7系中节点发现方法的变更点
・ 引导集群

EC2发现插件是什么?

在使用多个EC2实例组成Elasticsearch集群时,可以通过插件而不是使用discovery.seed_hosts来检测主节点的适配节点。

我们可以使用附加给EC2的标签和安全组来进行节点检测。(我们正在确认使用安全组进行设置)

【参考】
· EC2发现插件

充分利用环境

項目内容Elasticsearch7.12.1OpenJDK (同梱)AdoptOpenJDK (build 16+36)OSAmazon Linux 2AMIami-0cf6f5c8a62fa5da6Instance Typet3.medium (2vCPU,4GB)EBS20GB (gp2)Regionus-west-2
image.png

【補足】
– 为了下载安装所需的软件包,已将其放置在公共位置。
– Elasticsearch的三台服务器都扮演着主节点和数据节点的角色。
– Elasticsearch集群间的Discover通信使用9300-9305端口。(默认为9300)
– EC2的IP地址已经通过”ip addr”命令事先确认过。

执行步骤

    1. 创建IAM角色

 

    1. 创建安全组

 

    1. 安装Elasticsearch

 

    1. 安装discovery-ec2插件

 

    1. 配置集群

 

    进行运行验证

【補充】
· 在本提交中,假设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 > ロールでロールの作成を実施します。
下記内容で作成します。

項目内容信頼されたエンティティの種類AWSサービスユースケースの選択EC2Attachアクセス権限ポリシーAmazonEC2RoleforSSM、AmazonEC2RoleforESロール名AmazonEC2RoleforES
    作成したIAMロールを3台のEC2に割り当てます。

创建安全组

EC2 > セキュリティグループでセキュリティグループを作成を実施します。
下記内容で作成します。

項目内容セキュリティグループ名sg_es説明SGforESVPCES_VPCインバウンドルール1ポート: TCP9200、ソース: 10.0.0.0/16インバウンドルール2ポート: TCP9300、ソース: 10.0.0.0/16
image.png

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系列的集群,所以就没事了,算是不错的结果^^