前書き
Elasticsearchは、データをリアルタイムで分散検索および分析するためのプラットフォームです。 その人気は、その使いやすさ、強力な機能、およびスケーラビリティによるものです。
ElasticsearchはRESTful操作をサポートします。 これは、HTTPメソッド(GET、POST、PUT、DELETEなど)をHTTP URI(/collection/entry
)と組み合わせて使用してデータを操作できることを意味します。 直感的なRESTfulアプローチは、開発者にとってもユーザーにとっても使いやすいものであり、これがElasticsearchの人気の理由の1つです。
Elasticsearchは、強固な企業であるElasticを備えた無料のオープンソースソフトウェアです。 この組み合わせにより、個人テストから企業統合まで、あらゆる場所での使用に適しています。
この記事では、Elasticsearchを紹介し、インストール、構成、セキュリティ保護、使用の開始方法を示します。
前提条件
このチュートリアルを実行する前に、次のものが必要です。
-
sudo非rootユーザーの作成を含む、Initial Server Setup with Ubuntu 16.04に従うことによってセットアップされたUbuntu16.04ドロップレット。
-
Oracle JDK 8がインストールされました。これは、this Java installation articleの「OracleJDKのインストール」セクションに従って実行できます。
特に断りのない限り、このチュートリアルでルート権限を必要とするすべてのコマンドは、sudo権限を持つ非ルートユーザーとして実行する必要があります。
[[step-1 -—- downloading-and-installing-elasticsearch]] ==ステップ1—Elasticsearchのダウンロードとインストール
Elasticsearchは、zip
、tar.gz
、deb
、またはrpm
パッケージのelastic.coから直接ダウンロードできます。 Ubuntuの場合、Elasticsearchの実行に必要なすべてのものをインストールするdeb
(Debian)パッケージを使用するのが最善です。
まず、パッケージインデックスを更新します。
sudo apt-get update
執筆時点で2.3.1である最新のElasticsearchバージョンをダウンロードします。
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb
次に、dpkg
を使用して通常のUbuntuの方法でインストールします。
sudo dpkg -i elasticsearch-2.3.1.deb
これにより、Elasticsearchが/usr/share/elasticsearch/
にインストールされ、構成ファイルが/etc/elasticsearch
に配置され、initスクリプトが/etc/init.d/elasticsearch
に追加されます。
サーバーでElasticsearchが自動的に開始および停止するようにするには、その初期化スクリプトをデフォルトのランレベルに追加します。
sudo systemctl enable elasticsearch.service
Elasticsearchを初めて起動する前に、推奨される最小構成について次のセクションを確認してください。
[[step-2 -—- configuring-elasticsearch]] ==ステップ2—Elasticsearchの設定
ElasticsearchとそのJava依存関係がインストールされたので、Elasticsearchを構成します。 Elasticsearch構成ファイルは/etc/elasticsearch
ディレクトリにあります。 次の2つのファイルがあります。
-
elasticsearch.yml
はElasticsearchサーバーの設定を構成します。 これは、ロギングのオプションを除くすべてのオプションが保存される場所です。そのため、このファイルに最も関心があるのはこのためです。 -
logging.yml
は、ロギングの構成を提供します。 最初は、このファイルを編集する必要はありません。 すべてのデフォルトのログオプションをそのまま使用できます。 結果のログは、デフォルトで/var/log/elasticsearch
にあります。
Elasticsearchサーバーでカスタマイズする最初の変数は、node.name
とelasticsearch.yml
のcluster.name
です。 それらの名前が示すように、node.name
は、サーバー(ノード)の名前と、後者が関連付けられているクラスターを指定します。
これらの変数をカスタマイズしない場合、Dropletホスト名に関してnode.name
が自動的に割り当てられます。 cluster.name
は、デフォルトのクラスターの名前に自動的に設定されます。
cluster.name
値は、Elasticsearchの自動検出機能によって使用され、Elasticsearchノードを自動的に検出してクラスターに関連付けます。 したがって、デフォルト値を変更しないと、クラスター内の同じネットワーク上に不要なノードが見つかる可能性があります。
nano
またはお気に入りのテキストエディタを使用して、メインのelasticsearch.yml
構成ファイルの編集を開始します。
sudo nano /etc/elasticsearch/elasticsearch.yml
cluster.name
およびnode.name
の行の先頭にある#
文字を削除してコメントを解除してから、それらの値を更新します。 /etc/elasticsearch/elasticsearch.yml
ファイルでの最初の構成変更は次のようになります。
/etc/elasticsearch/elasticsearch.yml
. . .
cluster.name: mycluster1
node.name: "My First Node"
. . .
これらは、Elasticsearchを使用して開始できる最小設定です。 ただし、Elasticsearchのより完全な理解と微調整のために、構成部分を読み続けることをお勧めします。
Elasticsearchの特に重要な設定の1つは、マスターまたはスレーブのサーバーの役割です。 Master serversは、クラスターの正常性と安定性に関与します。 多数のクラスターノードがある大規模な展開では、複数の専用マスターを用意することをお勧めします。 通常、専用マスターはデータを保存したり、インデックスを作成したりしません。 したがって、過負荷になる可能性はなく、それによってクラスターの健全性が危険にさらされる可能性があります。
Slave serversは、データタスクをロードできる主力製品として使用されます。 スレーブノードが過負荷になっても、追加の負荷をかける他のノードがあれば、クラスターの状態に深刻な影響はありません。
サーバーの役割を決定する設定は、node.master
と呼ばれます。 デフォルトでは、ノードはマスターです。 Elasticsearchノードが1つしかない場合は、少なくとも1つのマスターが常に必要になるため、このオプションをデフォルトのtrue
値のままにしておく必要があります。 または、ノードをスレーブとして構成する場合は、次のように変数node.master
にfalse
値を割り当てます。
/etc/elasticsearch/elasticsearch.yml
. . .
node.master: false
. . .
もう1つの重要な構成オプションはnode.data
です。これは、ノードがデータを格納するかどうかを決定します。 ほとんどの場合、このオプションはデフォルト値(true
)のままにしておく必要がありますが、ノードにデータを保存したくない場合が2つあります。 1つは、前述のように、ノードが専用マスターの場合です。 もう1つは、ノードがノードからのデータのフェッチと結果の集計にのみ使用される場合です。 後者の場合、ノードはsearch load balancerとして機能します。
繰り返しますが、Elasticsearchノードが1つしかない場合は、この値を変更しないでください。 それ以外の場合、データのローカル保存を無効にするには、次のようにnode.data
をfalse
として指定します。
/etc/elasticsearch/elasticsearch.yml
. . .
node.data: false
. . .
多くのノードを持つ大規模なElasticsearchデプロイメントでは、他の2つの重要なオプションはindex.number_of_shards
とindex.number_of_replicas
です。 1つ目は、インデックスが分割されるピース、つまりshardsの数を決定します。 2番目は、クラスター全体に分散されるレプリカの数を定義します。 シャードを増やすとインデックス作成のパフォーマンスが向上し、レプリカを増やすと検索が高速になります。
デフォルトでは、シャードの数は5で、レプリカの数は1です。 まだ単一ノードでElasticsearchを調査およびテストしていると仮定すると、1つのシャードのみでレプリカなしで開始できます。 したがって、それらの値は次のように設定する必要があります。
/etc/elasticsearch/elasticsearch.yml
. . .
index.number_of_shards: 1
index.number_of_replicas: 0
. . .
変更する可能性のある最後の設定の1つは、データが格納されるパスを決定するpath.data
です。 デフォルトのパスは/var/lib/elasticsearch
です。 実稼働環境では、Elasticsearchデータを保存するために専用のパーティションとマウントポイントを使用することをお勧めします。 最良の場合、この専用パーティションは、パフォーマンスとデータの分離を向上させる別個のストレージメディアになります。 次のように指定することで、別のpath.data
パスを指定できます。
/etc/elasticsearch/elasticsearch.yml
. . .
path.data: /media/different_media
. . .
すべての変更を行ったら、ファイルを保存して終了します。 これで、Elasticsearchを初めて起動できます。
sudo systemctl start elasticsearch
Elasticsearchを使用してみる前に、Elasticsearchを完全に起動してください。 そうしないと、接続できないというエラーが表示される場合があります。
[[step-3 -—- securing-elasticsearch]] ==ステップ3—Elasticsearchの保護
デフォルトでは、Elasticsearchにはセキュリティが組み込まれていないため、HTTP APIにアクセスできるすべてのユーザーが制御できます。 Elasticsearchはローカルでのみアクセスできるループバックインターフェイス(つまり、127.0.0.1
)でのみリッスンするため、これは必ずしもセキュリティリスクではありません。 したがって、パブリックアクセスは不可能であり、すべてのサーバーユーザーが信頼されているか、これが専用のElasticsearchサーバーである限り、Elasticsearchは十分に安全です。
それでも、セキュリティを強化したい場合、最初にすることは認証を有効にすることです。 認証は商用Shield pluginによって提供されます。 残念ながら、このプラグインは無料ではありませんが、テストに使用できる30日間の無料試用版があります。 その公式ページには、優れたインストールおよび構成手順があります。 さらに知っておく必要があるのは、Elasticsearchプラグインのインストールマネージャーへのパスが/usr/share/elasticsearch/bin/plugin
であることだけです。
商用プラグインを使用したくないが、HTTP APIへのリモートアクセスを許可する必要がある場合、UbuntuのデフォルトファイアウォールUFW(Uncomplicated Firewall)を使用して、少なくともネットワークの露出を制限できます。 デフォルトでは、UFWはインストールされていますが、有効化されていません。 使用する場合は、次の手順を実行します。
まず、必要なサービスを許可するルールを作成します。 サーバーにログインするには、少なくともSSHを許可する必要があります。 SSHへの世界規模のアクセスを許可するには、ポート22をホワイトリストに登録します。
sudo ufw allow 22
次に、信頼できるリモートホストのデフォルトのElasticsearch HTTP APIポート(TCP 9200)へのアクセスを許可します(例:TRUSTED_IP
)。
sudo ufw allow from TRUSTED_IP to any port 9200
次のコマンドでUFWを有効にします:
sudo ufw enable
最後に、次のコマンドでUFWのステータスを確認します。
sudo ufw status
ルールを正しく指定すると、出力は次のようになります。
Output of java -versionStatus: active
To Action From
-- ------ ----
9200 ALLOW TRUSTED_IP
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
UFWが有効でElasticsearchポート9200を保護していることを確認したら、Elasticsearchが外部接続をリッスンできるようにすることができます。 これを行うには、elasticsearch.yml
構成ファイルを再度開きます。
sudo nano /etc/elasticsearch/elasticsearch.yml
network.bind_host
を含む行を見つけ、行の先頭にある#
文字を削除してコメントを解除し、値を0.0.0.0
に変更して次のようにします。
/etc/elasticsearch/elasticsearch.yml
. . .
network.host: 0.0.0.0
. . .
ElasticsearchがすべてのインターフェースとバインドされたIPをリッスンするように0.0.0.0
を指定しました。 特定のインターフェイスでのみリッスンする場合は、0.0.0.0
の代わりにIPを指定できます。
上記の設定を有効にするには、次のコマンドでElasticsearchを再起動します。
sudo systemctl restart elasticsearch
その後、信頼できるホストからElasticsearchに接続してみてください。 接続できない場合は、UFWが機能していて、network.host
変数が正しく指定されていることを確認してください。
[[step-4 -—- testing-elasticsearch]] ==ステップ4—Elasticsearchのテスト
現在、Elasticsearchはポート9200で実行されているはずです。 curl
、コマンドラインクライアント側URL転送ツール、および単純なGETリクエストを使用してテストできます。
curl -X GET 'http://localhost:9200'
次の応答が表示されます。
Output of curl{
"name" : "My First Node",
"cluster_name" : "mycluster1",
"version" : {
"number" : "2.3.1",
"build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
"build_timestamp" : "2016-04-04T12:25:05Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
上記のような応答が表示された場合、Elasticsearchは正常に機能しています。 そうでない場合は、インストール手順を正しく実行し、Elasticsearchが完全に起動するまでしばらく時間を置いていることを確認してください。
Elasticsearchのより徹底的なチェックを実行するには、次のコマンドを実行します。
curl -XGET 'http://localhost:9200/_nodes?pretty'
上記のコマンドの出力では、ノード、クラスター、アプリケーションパス、モジュールなどの現在のすべての設定を確認できます。
[[step-5 --- using-elasticsearch]] ==ステップ5—Elasticsearchを使用する
Elasticsearchの使用を開始するには、まずデータを追加しましょう。 すでに述べたように、ElasticsearchはRESTful APIを使用します。これは、通常のCRUDコマンド(create、read、update、およびdelete)に応答します。 それを操作するために、再びcurl
を使用します。
次のコマンドで最初のエントリを追加できます。
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
次の応答が表示されます。
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
cuel
を使用して、ElasticsearchサーバーにHTTPPOSTリクエストを送信しました。 リクエストのURIは/tutorial/helloworld/1
で、いくつかのパラメーターがあります。
-
tutorial
は、Elasticsearchのデータのインデックスです。 -
helloworld
はタイプです。 -
1
は、上記のインデックスとタイプの下にあるエントリのIDです。
この最初のエントリは、HTTP GETリクエストで取得できます。
curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
結果は次のようになります。
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}
既存のエントリを変更するには、HTTP PUT要求を使用できます。
curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
{
"message": "Hello People!"
}'
Elasticsearchは、次のような変更の成功を確認する必要があります。
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}
上記の例では、最初のエントリのmessage
を「HelloPeople!」に変更しました。 これにより、バージョン番号は自動的に2
に増加しました。
上記のリクエストで余分な引数pretty
に気づいたかもしれません。 人間が読める形式を使用できるため、各データフィールドを新しい行に書き込むことができます。 また、データを取得するときに結果を「プリティ」化して、次のようなはるかに優れた出力を取得することもできます。
curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
これで、応答はより優れた形式になります。
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"message" : "Hello People!"
}
}
これまで、Elasticsearchにデータを追加して照会しました。 その他の操作については、the API documentationを確認してください。
結論
Elasticsearchのインストール、設定、使用の開始は簡単です。 手動クエリで十分に遊んだら、次のタスクはアプリケーションから使用を開始することです。