前書き

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

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

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

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

前提条件

このチュートリアルを実行する前に、次の前提条件を満たしていることを確認してください。

  • CentOS 7ドロップレット

  • 非ルートsudoユーザー(詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [CentOS 7での初期サーバーセットアップ]をご覧ください。)

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

仮定

このチュートリアルでは、サーバーが次のようなVPNを使用していることを前提としています:https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- server-infrastructure [AnsibleおよびTinc VPNを使用してサーバーインフラストラクチャを保護する方法]。 これにより、サーバーが使用している物理ネットワークに関係なく、プライベートネットワーク機能が提供されます。

DigitalOcean Private Networkingなどの共有プライベートネットワークを使用している場合、VPNを使用してElasticsearchを不正アクセスから保護する必要があります。 ElasticsearchにはHTTPインターフェースにセキュリティが組み込まれていないため、各サーバーは同じプライベートネットワーク上にある必要があります。 プライベートネットワークは、信頼できないコンピューターと共有しないでください。

ステップ1-Javaのインストール

ElasticsearchはJavaプログラミング言語で記述されているため、まず、DropletにJavaランタイム環境(JRE)が必要です。 JREにはネイティブのCentOS OpenJDKパッケージを使用できます。 このJREは無料で、十分にサポートされており、CentOS Yumインストールマネージャーを介して自動的に管理されます。

次のコマンドを使用して、最新のOpenJDKをインストールできます。

sudo yum install java-1.8.0-openjdk.x86_64

JREがインストールされ、使用できることを確認するには、次のコマンドを実行します。

java -version

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

Output of java -versionopenjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

Elasticsearchの使用を進め、より優れたJavaのパフォーマンスと互換性を探し始めたら、Oracle独自のJava(Oracle JDK 8)をインストールすることを選択できます。 これを行う方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-install-java-on-centos-and-fedora [CentOSにJavaをインストールする方法]の記事を参照してください。とFedora]。

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

Elasticsearchは、zip、tar.gz、deb、またはrpmパッケージのhttps://www.elastic.co/downloads/elasticsearch[elastic.co]から直接ダウンロードできます。 CentOSの場合、Elasticsearchを実行するために必要なすべてをインストールするネイティブrpmパッケージを使用するのが最善です。

この記事の執筆時点では、最新のElasticsearchバージョンは1.7.3です。 次のコマンドを使用して、選択したディレクトリにダウンロードします。

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.noarch.rpm

次に、次のような `+ rpm +`コマンドを使用して、通常のCentOSの方法でインストールします。

sudo rpm -ivh elasticsearch-1.7.3.noarch.rpm

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

ElasticsearchがDropletで自動的に起動および停止するようにするには、次のコマンドを使用して、その初期化スクリプトをデフォルトのランレベルに追加します。

sudo systemctl enable elasticsearch.service

ステップ3-Elasticの構成

ElasticsearchとそのJava依存関係がインストールされたので、Elasticsearchを構成します。

Elasticsearch設定ファイルは `+ / etc / elasticsearch +`ディレクトリにあります。 次の2つのファイルがあります。

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

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

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

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

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

メインの `+ elasticsearch.yml +`設定ファイルの編集を開始するには:

sudo nano /etc/elasticsearch/elasticsearch.yml

+ node.name`と + cluster.name`の行の先頭にある `#`文字を削除してコメント解除し、値を変更します。 `+ / etc / elasticsearch / elasticsearch.yml +`ファイルの最初の設定変更は次のようになります。

/etc/elasticsearch/elasticsearch.yml

...
node.name:
cluster.name:
...

もう1つの重要な設定は、サーバーの役割です。これは、「マスター」または「スレーブ」のいずれかです。 「マスター」は、クラスターの正常性と安定性を担当します。 多数のクラスターノードがある大規模な展開では、複数の専用「マスター」を持つことをお勧めします。通常、専用「マスター」はデータを保存したり、インデックスを作成したりしません。 したがって、過負荷になる可能性はなく、それによってクラスターの健全性が危険にさらされる可能性があります。

「スレーブ」は、データタスクをロードできる「作業馬」として使用されます。 「スレーブ」ノードが過負荷になっても、他のノードに追加の負荷がかかる場合は、クラスターの状態に深刻な影響はありません。

サーバーの役割を決定する設定は、 `+ node.master `と呼ばれます。 Elasticsearchノードが1つしかない場合は、このオプションをコメントアウトして、デフォルト値の ` true `を保持する必要があります。つまり、 唯一のノードもマスターである必要があります。 または、ノードをスレーブとして設定する場合は、「 node.master 」行の先頭にある「#」文字を削除し、値を「 false +」に変更します。

/etc/elasticsearch/elasticsearch.yml

...
node.master:
...

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

繰り返しますが、Elasticsearchノードが1つしかない場合は、この設定をコメントアウトしたままにして、デフォルトの `+ true `値を保持するようにしてください。 それ以外の場合、データのローカル保存を無効にするには、次の行のコメントを外し、値を「 false +」に変更します。

/etc/elasticsearch/elasticsearch.yml

...
node.data:
...

他の2つの重要なオプションは、 `+ index.number_of_shards `と ` index.number_of_replicas +`です。 1つ目は、インデックスが分割される断片(断片)の数を決定します。 2番目は、クラスター全体に分散されるレプリカの数を定義します。 シャードを増やすとインデックス作成のパフォーマンスが向上し、レプリカを増やすと検索が高速になります。

まだ単一ノードでElasticsearchを調査およびテストしていると仮定すると、1つのシャードのみでレプリカなしで開始する方が適切です。 したがって、それらの値は次のように設定する必要があります(行の先頭にある「#」を必ず削除してください)。

/etc/elasticsearch/elasticsearch.yml

...
index.number_of_shards:
index.number_of_replicas:
...

変更に興味があるかもしれない最後の設定の1つは、データが保存されるパスを決定する `+ path.data `です。 デフォルトのパスは ` / var / lib / elasticsearch `です。 実稼働環境では、Elasticsearchデータを保存するために専用のパーティションとマウントポイントを使用することをお勧めします。 最良の場合、この専用パーティションは、パフォーマンスとデータ分離を向上させる別個のストレージメディアになります。 ` path.data `行のコメントを外し、その値を変更することにより、別の ` path.data`パスを指定できます。

/etc/elasticsearch/elasticsearch.yml

...
path.data:
...

すべての変更を行ったら、ファイルを保存して終了してください。 次のコマンドを使用して、Elasticsearchを初めて起動できます。

sudo service elasticsearch start

Elasticsearchを使用するには、Elasticsearchが完全に起動するまで少なくとも10秒かかります。 そうしないと、接続できないというエラーが表示される場合があります。

ステップ4-Elasticの保護

Elasticsearchにはセキュリティが組み込まれていないため、HTTP APIにアクセスできるすべてのユーザーが制御できます。 このセクションは、Elasticsearchを保護するための包括的なガイドではありません。 それと、それが実行されているサーバー/仮想マシンへの不正アクセスを防ぐために必要な措置を講じてください。 iptablesを使用してシステムをさらに保護することを検討してください。

最初のセキュリティ調整は、パブリックアクセスを防止することです。 パブリックアクセスを削除するには、ファイル `+ elasticsearch.yml +`を編集します。

sudo nano /etc/elasticsearch/elasticsearch.yml

「+ network.bind_host 」を含む行を見つけ、行の先頭にある「#」文字を削除してコメントを外し、値を「 localhost +」に変更して次のようにします。

/etc/elasticsearch/elasticsearch.yml

...
network.bind_host:
...

+
また、セキュリティを強化するために、カスタム式の評価に使用される動的スクリプトを無効にすることができます。 カスタムの悪意のある表現を作成することにより、攻撃者が環境を危険にさらす可能性があります。

カスタム式を無効にするには、 `+ / etc / elasticsearch / elasticsearch.yml +`ファイルの最後に次の行を追加します:

/etc/elasticsearch/elasticsearch.yml

...
script.disable_dynamic: true
...

上記の変更を有効にするには、次のコマンドでElasticsearchを再起動する必要があります。

sudo service elasticsearch restart

ステップ5-テスト

現在、Elasticsearchはポート9200で実行されているはずです。 curl、コマンドラインクライアント側URL転送ツール、および次のような簡単なGETリクエストでテストできます。

curl -X GET 'http://localhost:9200'

次の応答が表示されます。

Output of curl{
 "status" : 200,
 "name" : "CentOS Node",
 "cluster_name" : "mysqluster",
 "version" : {
   "number" : "1.7.3",
   "build_hash" : "05d4530971ef0ea46d0f4fa6ee64dbc8df659682",
   "build_timestamp" : "2015-10-15T09:14:17Z",
   "build_snapshot" : false,
   "lucene_version" : "4.10.4"
 },
 "tagline" : "You Know, for Search"
}

上記のような応答が表示された場合、Elasticsearchは正常に機能しています。 そうでない場合は、インストール手順を正しく実行し、Elasticsearchが完全に起動するまでしばらく時間を置いていることを確認してください。

ステップ6-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,"created":true}

curlを使用して、HTTP POSTリクエストをElasticsearchサーバーに送信しました。 リクエストの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,
 "created" : false
}

上記の例では、最初のエントリの「+ message 」を「Hello People!」に変更しました。 それに伴い、バージョン番号は自動的に「+2」に増加しました。

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

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

これで、応答はより優れた形式になります。

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

これまで、Elasticsearchにデータを追加して照会しました。 他の操作については、https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html [APIドキュメント]をご覧ください。

結論

Elasticsearchのインストール、設定、使用の開始は簡単です。 手動クエリで十分に遊んだら、次のタスクはアプリケーションから使用を開始することです。