使用Elasticsearch的EC2发现插件来构建集群非常方便
晚上好!
我打算在AWS上搭建Elasticsearch集群时尝试使用一个非常方便的插件,它叫做「EC2发现插件」。☆彡
在我做调查的过程中,我发现写有AWS Cloud Plugin的使用方法的人还是有相当多的,但从5系列开始提供的EC2 Discovery Plugin似乎不太多见呢。所以,我打算简单地写一下EC2 Discovery Plugin的相关内容。
EC2发现插件有哪些方便之处呢?
在使用Elasticsearch的默认Zen Discovery建立集群时,可以使用Unicast通过主机名或IP地址进行配置。
然而,在考虑云上运维时,使用Unicast会很困难。
因此,可以使用EC2 Discovery插件基于SecurityGroup来创建集群的配置(d゚ω゚d)オゥイェー
※也有一个称为Multicast Discovery插件,但从5系开始已被废弃
我想在快速解释结构后,解释实施方法。
实例配置
-
- InstanceType:t2.medium
-
- OS:Amazon Linux AMI release 2017.03
-
- Node: 3台
- ClusterName: es-cluster
我会以这样的方式写出来
-
- AWS准备
-
- 安装Oracle JDK 1.8
-
- 安装Elasticsearch
-
- 安装Kibana(仅1台)
-
- 安装X-pack Elasticsearch和Kibana(仅1台)
-
- 安装EC2发现插件
- 进行操作确认
中文本土化的翻譯:亞馬遜準備中
安全组
请在安装Elasticsearch实例上附加的SecurityGroup上设置适合您环境的源。
身份角色
请创建以下策略,并将其附加到实例的 IAM 角色。
{
"Statement": [
{
"Action": [
"ec2:DescribeInstances"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
],
"Version": "2012-10-17"
}
亚马逊网络服务配置
当登录服务器后,执行AWS Configure操作。由于不使用Access Key和Secret Key,因此无需输入任何内容。
$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: json
我已经完成了准备工作,现在我想继续推进Elasticsearch周边的工作。
安装Oracle JDK 1.8
$ java -version
java version "1.7.0_141"
OpenJDK Runtime Environment (amzn-2.6.10.1.73.amzn1-x86_64 u141-b02)
OpenJDK 64-Bit Server VM (build 24.141-b02, mixed mode)
### Install Java1.8
$ sudo yum -y install java-1.8.0-openjdk-devel
### alternativesコマンドでJavaのバージョンを切り替える
$ sudo alternatives --config java
There are 2 programs which provide 'java'.
Selection Command
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
2 /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java
Enter to keep the current selection[+], or type selection number: 2
### バージョン確認
$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)
安装Elasticsearch
我想要安装Elasticsearch 5.5.1。
安装Elasticsearch
### PGP Keyをダウンロード&インストール
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
### リポジトリの登録
$ sudo vim /etc/yum.repos.d/elastic.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
### Elasticsearchインストール
$ sudo yum -y install elasticsearch
### サービス起動登録
$ sudo chkconfig --add elasticsearch
### 確認
$ sudo chkconfig --list | grep elasticsearch
elasticsearch 0:off 1:off 2:on 3:on 4:on 5:on 6:off
### elasticsearch.yml設定変更
$ sudo vim /etc/elasticsearch/elasticsearch.yml
+ cluster.name: es-cluster
+ network.host: 0.0.0.0
+ http.port: 9200
### サービス起動
$ sudo service elasticsearch start
Starting elasticsearch: [ OK ]
### 起動確認
$ curl http://localhost:9200
{
"name" : "fDpNQ4m",
"cluster_name" : "es",
"cluster_uuid" : "mayxoDENThSmrUltkXyRWg",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
安装 Kibana
为了进行监控,我会安装Kibana5.5.1。
### Install Kibana
$ sudo yum install -y kibana
### サービス登録
$ sudo chkconfig --add kibana
$ chkconfig --list | grep kibana
kibana 0:off 1:off 2:on 3:on 4:on 5:on 6:off
### Kibana設定
$ sudo vim /etc/kibana/kibana.yml
+ server.host: 0.0.0.0
+ elasticsearch.url: "http://ES_IP_ADDR"
### サービス停止状態のままにしておきます(X-Pack入れたあとに設定変更後に起動します)
$ service kibana status
kibana is not running
在Elasticsearch上安装X-Pack
为了监控Elasticsearch节点状态等,我们将安装X-Pack5.5。
在Elasticsearch上安装X-Pack。
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
-> Downloading x-pack from elastic
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission \\.\pipe\* read,write
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission sun.nio.ch.bugLevel write
* javax.net.ssl.SSLPermission setHostnameVerifier
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
Continue with installation? [y/N]y
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin forks a native controller @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
This plugin launches a native controller that is not subject to the Java
security manager nor to system call filters.
Continue with installation? [y/N]y
-> Installed x-pack
为确认操作,由于安全性已启用,会返回错误。
因此,此次将禁用安全性。
(只是出于监控目的而已)
顺便提一下,关于X-Pack,Classmethod公司已经写得非常详细了。
禁用X-Pack安全性
通过无效化,会得到响应。
### Security無効化
$ vim /etc/elasticsearch/elasticsearch.yml
+ xpack.security.enabled: false
### 動作確認
$ curl -u elastic http://localhost:9200
{
"name" : "fDpNQ4m",
"cluster_name" : "es",
"cluster_uuid" : "mayxoDENThSmrUltkXyRWg",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
### 再起動
$ service kibana restart
kibana stopped.
kibana started
在Kibana上安装X-Pack。
我們還需要安裝Kibana的X-Pack 5.5版本。
在Kibana上安装X-Pack插件
$ sudo /usr/share/kibana/bin/kibana-plugin install x-pack
Attempting to transfer from x-pack
Attempting to transfer from https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-5.5.1.zip
Transferring 119276972 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
安装EC2 Discovery插件
终于到了这一步,现在开始安装 EC2 Discovery 插件吧!
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install discovery-ec2
-> Downloading discovery-ec2 from elastic
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
Continue with installation? [y/N]y
-> Installed discovery-ec2
将其配置在Elasticsearch.yml中。
$ sudo vim /etc/elasticsearch/elasticsearch.yml
cluster.name: es-cluster
discovery.zen.hosts_provider: ec2
discovery.ec2.groups: "SECURITY_GROUP_NAME" or "SECURITY_GROUP_ID"
discovery.ec2.availability_zones: [ "ap-northeast-1a", "ap-northeast-1c" ]
cloud.aws.region: ap-northeast-1
### サービス再起動
service elasticsearch restart
### クラスタ状態確認
$ curl http://localhost:9200/_cluster/health?pretty
{
"cluster_name" : "es-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"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
}
我们要去第二和第三台目!
由于第二台也与上述相同,因此将进行相同的设置,故略去(m(_)m)。
请使用与第一台相同的SecurityGroup。
此外,请在所有三台服务器上安装Elasticsearch的X-Pack。
不需要安装Kibana。
设置各项参数后,重新启动Elasticsearch,您就可以在日志中看到集群已经建立起来。
从日志中确认是否已将其嵌入到群集中。
### Master側のログ
[20xx-xx-xxxx:xx:xx][INFO ][o.e.c.s.ClusterService ] [fDpNQ4m] added {{gdRR6r1}{gdRR6r17T5iaGPmaO9wgTA}{6l3QNArhSkyBVu08jTfwYQ}{IP_ADDR}{IP_ADDR:9300},}, reason: zen-disco-receive(from master [master {dKgmQfLLg}{IP_ADDR}{IP_ADDR:9300} committed version [15]])
### Node側のログでマスタを検出したことがわかる
$ tail -f /var/log/elasticsearch/es.log
[20xx-xx-xxxx:xx:xx][INFO ][o.e.c.s.ClusterService ] [gdRR6r1] detected_master {dKgmQfL}{dKgmQfLASM-35x0X0ulSXg}{XE4jgXEzQwqgkSfRypgoLg}{IP_ADDR}{IP_ADDR:9300}, added {{fDpNQ4m}{fDpNQ4mrRR2vN7wiTVjfIg}{aqPbmbhbTkm1X40gH1tylw}{IP_ADDR}{IP_ADDR:9300},{dKgmQfL}{dKgmQfLASM-35x0X0ulSXg}{XE4jgXEzQwqgkSfRypgoLg}{IP_ADDR}{IP_ADDR:9300},}, reason: zen-disco-receive(from master [master {dKgmQfL}{dKgmQfLASM-35x0X0ulSXg}{XE4jgXEzQwqgkSfRypgoLg}{IP_ADDR}{IP_ADDR:9300} committed version [15]])
在Kibana的监控中进行确认。
访问 Kibana [http://KIBANA_IP_ADDR:5601]。
点击「监控」,你可以看到Elasticsearch有三个节点。
状态:绿色

您可以点击「节点」,以查看节点的状态。

我很幸運地成功組成了一個群組!ヽ(*゚д゚)ノ
填充#01
如果没有在AWS Configure的设置和IAM Role上附加策略,则会出现以下错误。顺便说一句,日志将使用创建的集群名称创建。
$ sudo /var/log/elasticsearch/es-cluster.log
[20xx-xx-xxxx:xx:xx][INFO ][o.e.d.e.AwsEc2UnicastHostsProvider] [node_id] Exception while retrieving instance list from AWS API: Unable to execute HTTP request: connect timed out
#02填補
启动自已存在的NodeID的AMI时,由于NodeID重复,无法将其纳入集群中。
以下是相关日志。
### AMIから起動したノード
$ tail -f /var/log/elasticsearch/es.log
[20xx-xx-xxxx:xx:xx][INFO ][o.e.d.z.ZenDiscovery ] [gdRR6r1] failed to send join request to master [{fDpNQ4m}{fDpNQ4mrRR2vN7wiTVjfIg}{eHfV5HLkRrKo8_FXfgyHDA}{IP_ADDR}{IP_ADDR:9300}{ml.enabled=true}], reason [RemoteTransportException[[fDpNQ4m][IP_ADDR:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {gdRR6r1}{gdRR6r17T5iaGPmaO9wgTA}{hzzXQXB8TM-xQVn9Uj8e2A}{IP_ADDR}{IP_ADDR:9300}{ml.enabled=true}, found existing node {gdRR6r1}{gdRR6r17T5iaGPmaO9wgTA}{9pWjYpL5Tq23yIte7WzMiw}{IP_ADDR}{IP_ADDR:9300}{ml.enabled=true} with the same id but is a different node instance]; ]
最后
EC2发现插件怎么样?
我认为可以很轻松地组建集群。
但是,根据个人观点来看,我认为在考虑运维时需要采用能够自动恢复的配置。因为在当前状态下,当进行Elasticsearch集群化时,NodeID会冲突,导致从AMI中进行自动恢复变得困难。因此,在安装Elasticsearch之前,需要从AMI中进行配置,并将其集成到集群中。
嗯…如果还有其他更改NodeID的方法,如果有人知道,请告诉我。m(_ _)m
因此,這次我寫了一篇關於Elasticsearch插件中的EC2 Discovery插件的文章。
非常感謝!
追加内容
我使用了GCE并撰写了一篇相关文章,希望对你有所帮助。
我在GCP环境下尝试使用GCE发现插件!