序章

Elasticsearch は、データをリアルタイムで分散検索および分析するためのプラットフォームです。 その人気は、その使いやすさ、強力な機能、およびスケーラビリティによるものです。

ElasticsearchはRESTful操作をサポートしています。 これは、HTTPメソッド(GET、POST、PUT、DELETEなど)をHTTP URI(/collection/entry)と組み合わせて使用してデータを操作できることを意味します。 直感的なRESTfulアプローチは、開発者とユーザーの両方に優しいものであり、これがElasticsearchの人気の理由の1つです。

Elasticsearchは無料のオープンソースソフトウェアであり、その背後には確固たる会社であるElasticがあります。 この組み合わせにより、個人テストから企業統合まで、あらゆる場所での使用に適しています。

この記事では、Elasticsearchを紹介し、Elasticsearchをインストール、構成、保護、および使用を開始する方法を示します。

前提条件

このチュートリアルを実行する前に、次のものが必要です。

  • Ubuntu 16.04を使用した初期サーバーセットアップ(sudo非rootユーザーの作成を含む)に従ってセットアップされたUbuntu16.04ドロップレット。

  • Oracle JDK 8がインストールされました。これは、このJavaインストール記事の「OracleJDKのインストール」セクションに従って実行できます。

特に明記されていない限り、このチュートリアルでroot権限を必要とするすべてのコマンドは、sudo権限を持つroot以外のユーザーとして実行する必要があります。

ステップ1—Elasticsearchのダウンロードとインストール

Elasticsearchは、ziptar.gzdeb、またはrpmパッケージのelastic.coから直接ダウンロードできます。 Ubuntuの場合、Elasticsearchの実行に必要なすべてのものをインストールするdeb(Debian)パッケージを使用するのが最適です。

まず、パッケージインデックスを更新します。

  1. sudo apt-get update

最新のElasticsearchバージョンをダウンロードします。これは執筆時点では2.3.1です。

  1. wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb

次に、dpkgを使用して通常のUbuntuの方法でインストールします。

  1. sudo dpkg -i elasticsearch-2.3.1.deb

これにより、Elasticsearchが/usr/share/elasticsearch/にインストールされ、構成ファイルが/etc/elasticsearchに配置され、initスクリプトが/etc/init.d/elasticsearchに追加されます。

Elasticsearchがサーバーで自動的に開始および停止するようにするには、そのinitスクリプトをデフォルトのランレベルに追加します。

  1. sudo systemctl enable elasticsearch.service

Elasticsearchを初めて起動する前に、推奨される最小構成について次のセクションを確認してください。

ステップ2—Elasticsearchを設定する

ElasticsearchとそのJava依存関係がインストールされたので、Elasticsearchを構成します。 Elasticsearch構成ファイルは/etc/elasticsearchディレクトリにあります。 2つのファイルがあります:

  • elasticsearch.ymlは、Elasticsearchサーバーの設定を構成します。 これは、ロギングのオプションを除くすべてのオプションが保存される場所です。そのため、このファイルに主に関心があります。

  • logging.ymlは、ロギングの構成を提供します。 最初は、このファイルを編集する必要はありません。 デフォルトのログオプションはすべてそのままにしておくことができます。 結果のログは、デフォルトで/var/log/elasticsearchにあります。

Elasticsearchサーバーでカスタマイズする最初の変数は、elasticsearch.ymlnode.namecluster.nameです。 それらの名前が示すように、node.nameは、サーバー(ノード)と後者が関連付けられているクラスターの名前を指定します。

これらの変数をカスタマイズしない場合、node.nameがドロップレットホスト名に関して自動的に割り当てられます。 cluster.nameは、デフォルトのクラスターの名前に自動的に設定されます。

cluster.name値は、Elasticsearchの自動検出機能によって使用され、Elasticsearchノードを自動的に検出してクラスターに関連付けます。 したがって、デフォルト値を変更しないと、クラスター内の同じネットワーク上に不要なノードが見つかる可能性があります。

nanoまたはお気に入りのテキストエディタを使用してメインのelasticsearch.yml構成ファイルの編集を開始します。

  1. 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つは、マスターまたはスレーブのいずれかであるサーバーの役割です。 マスターサーバーは、クラスターの正常性と安定性を担当します。 多数のクラスターノードを使用する大規模なデプロイメントでは、複数の専用マスターを用意することをお勧めします。 通常、専用マスターはデータを保存したり、インデックスを作成したりしません。 したがって、クラスターの状態が危険にさらされる可能性がある過負荷になる可能性はありません。

スレーブサーバーは、データタスクをロードできる主力製品として使用されます。 スレーブノードが過負荷になった場合でも、追加の負荷をかける他のノードがあれば、クラスターの状態に深刻な影響を与えることはありません。

サーバーの役割を決定する設定をnode.masterと呼びます。 デフォルトでは、ノードはマスターです。 Elasticsearchノードが1つしかない場合は、少なくとも1つのマスターが常に必要になるため、このオプションをデフォルトのtrue値のままにしておく必要があります。 または、ノードをスレーブとして構成する場合は、次のようにfalse値を変数node.masterに割り当てます。

/etc/elasticsearch/elasticsearch.yml
. . .
node.master: false
. . .

もう1つの重要な構成オプションは、node.dataです。これは、ノードがデータを格納するかどうかを決定します。 ほとんどの場合、このオプションはデフォルト値(true)のままにしておく必要がありますが、ノードにデータを保存したくない場合が2つあります。 1つは、前述のように、ノードが専用マスターである場合です。 もう1つは、ノードがノードからデータをフェッチして結果を集約するためだけに使用される場合です。 後者の場合、ノードは検索ロードバランサーとして機能します。

繰り返しますが、Elasticsearchノードが1つしかない場合は、この値を変更しないでください。 それ以外の場合、データのローカル保存を無効にするには、次のようにnode.datafalseとして指定します。

/etc/elasticsearch/elasticsearch.yml
. . .
node.data: false
. . .

多くのノードを持つ大規模なElasticsearchデプロイメントでは、他の2つの重要なオプションはindex.number_of_shardsindex.number_of_replicasです。 1つ目は、インデックスが分割されるピース、つまりシャードの数を決定します。 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を初めて起動できます。

  1. sudo systemctl start elasticsearch

Elasticsearchを使用する前に、Elasticsearchをいくつか使用して完全に開始してください。 そうしないと、接続できないというエラーが発生する可能性があります。

ステップ3—Elasticsearchの保護

デフォルトでは、Elasticsearchにはセキュリティが組み込まれておらず、HTTPAPIにアクセスできるすべてのユーザーが制御できます。 Elasticsearchはローカルでのみアクセスできるループバックインターフェイス(つまり、127.0.0.1)でのみリッスンするため、これは必ずしもセキュリティリスクではありません。 したがって、パブリックアクセスは不可能であり、すべてのサーバーユーザーが信頼されているか、これが専用のElasticsearchサーバーである限り、Elasticsearchは十分に安全です。

それでも、セキュリティを強化したい場合、最初に行うことは認証を有効にすることです。 認証は、商用のシールドプラグインによって提供されます。 残念ながら、このプラグインは無料ではありませんが、テストに使用できる30日間の無料トライアルがあります。 その公式ページには、優れたインストールと構成の手順があります。 さらに知っておく必要があるのは、Elasticsearchプラグインのインストールマネージャーへのパスが/usr/share/elasticsearch/bin/pluginであるということだけです。

商用プラグインを使用したくないが、HTTP APIへのリモートアクセスを許可する必要がある場合は、少なくともUbuntuのデフォルトファイアウォールであるUFW(Uncomplicated Firewall)を使用してネットワークの露出を制限できます。 デフォルトでは、UFWはインストールされていますが、有効になっていません。 使用する場合は、次の手順に従ってください。

まず、必要なサービスを許可するルールを作成します。 サーバーにログインできるようにするには、少なくともSSHが許可されている必要があります。 SSHへのワールドワイドアクセスを許可するには、ポート22をホワイトリストに登録します。

  1. sudo ufw allow 22

次に、信頼できるリモートホストのデフォルトのElasticsearch HTTP APIポート(TCP 9200)へのアクセスを許可します(例:TRUSTED_IP)。

  1. sudo ufw allow from TRUSTED_IP to any port 9200

その後、次のコマンドでUFWを有効にします。

  1. sudo ufw enable

最後に、次のコマンドを使用してUFWのステータスを確認します。

  1. sudo ufw status

ルールを正しく指定した場合、出力は次のようになります。

Output of java -version
Status: active To Action From -- ------ ---- 9200 ALLOW TRUSTED_IP 22 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6)

UFWが有効になっていて、Elasticsearchポート9200を保護していることを確認したら、Elasticsearchに外部接続のリッスンを許可できます。 これを行うには、elasticsearch.yml構成ファイルを再度開きます。

  1. 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を再起動します。

  1. sudo systemctl restart elasticsearch

その後、信頼できるホストからElasticsearchに接続してみてください。 接続できない場合は、UFWが機能していて、network.host変数が正しく指定されていることを確認してください。

ステップ4—Elasticsearchのテスト

これで、Elasticsearchはポート9200で実行されているはずです。 curl、コマンドラインクライアント側URL転送ツール、および単純なGETリクエストを使用してテストできます。

  1. 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のより徹底的なチェックを実行するには、次のコマンドを実行します。

  1. curl -XGET 'http://localhost:9200/_nodes?pretty'

上記のコマンドの出力では、ノード、クラスター、アプリケーションパス、モジュールなどの現在のすべての設定を確認して確認できます。

ステップ5—Elasticsearchを使用する

Elasticsearchの使用を開始するには、最初にいくつかのデータを追加しましょう。 すでに述べたように、ElasticsearchはRESTful APIを使用します。これは、通常のCRUDコマンド( c reate、 r ead、 u pdate、および d)に応答します。 elete。 作業には、curlを再度使用します。

次のコマンドを使用して、最初のエントリを追加できます。

  1. 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}

curlを使用して、ElasticsearchサーバーにHTTPPOSTリクエストを送信しました。 リクエストのURIは/tutorial/helloworld/1で、いくつかのパラメーターがあります。

  • tutorialは、Elasticsearchのデータのインデックスです。
  • helloworldがタイプです。
  • 1は、上記のインデックスとタイプの下にあるエントリのIDです。

この最初のエントリは、HTTPGETリクエストを使用して取得できます。

  1. curl -X GET 'http://localhost:9200/tutorial/helloworld/1'

結果は次のようになります。

Output
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}

既存のエントリを変更するには、HTTPPUTリクエストを使用できます。

  1. curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d
  2. '
  3. {
  4. "message": "Hello People!"
  5. }'

Elasticsearchは、次のような変更が成功したことを確認する必要があります。

Output
{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "created" : false }

上記の例では、最初のエントリのmessageを「HelloPeople!」に変更しました。 これにより、バージョン番号は自動的に2に増加しました。

上記のリクエストで余分な引数prettyに気づいたかもしれません。 これにより、人間が読める形式が可能になり、各データフィールドを新しい行に書き込むことができます。 また、データを取得するときに結果を「きれいに」して、次のようにはるかに優れた出力を取得することもできます。

  1. 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にデータを追加してクエリを実行してきました。 その他の操作については、APIドキュメントを確認してください。

結論

これは、Elasticsearchのインストール、構成、および使用開始が非常に簡単なことです。 手動クエリを十分に試したら、次のタスクはアプリケーションからそれを使い始めることです。