序章

Elasticsearchは、データのリアルタイム分散検索と分析に使用される人気のあるオープンソース検索サーバーです。 開発以外の目的で使用する場合、Elasticsearchは、最高のパフォーマンス、安定性、およびスケーラビリティーを実現するために、クラスターとして複数のサーバーにデプロイする必要があります。

このチュートリアルでは、クラウドサーバー環境でCentOS7に本番Elasticsearchクラスターをインストールして構成する方法を説明します。

Elasticsearchクラスターを手動でセットアップすることは学習に役立ちますが、クラスターのセットアップでは構成管理ツールを使用することを強くお勧めします。 Ansibleを使用してElasticsearchクラスターをデプロイする場合は、次のチュートリアルに従ってください:Ansibleを使用して本番Elasticsearchクラスターをセットアップする方法

前提条件

Elasticsearchクラスターには少なくとも3つのマスター適格ノードが必要であるため、このチュートリアルを完了するには、少なくとも3つのCentOS7サーバーが必要です。 専用のマスターノードとデータノードが必要な場合は、マスターノード用に少なくとも3台のサーバーと、データノード用に追加のサーバーが必要になります。

代わりにUbuntuを使用したい場合は、次のチュートリアルを確認してください:Ubuntu14.04で本番Elasticsearchクラスターをセットアップする方法

仮定

このチュートリアルでは、サーバーが次のようなVPNを使用していることを前提としています: Ansible andTincVPNを使用してサーバーインフラストラクチャを保護する方法。 これにより、サーバーが使用している物理ネットワークに関係なく、プライベートネットワーク機能が提供されます。

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

サーバーのVPNIPアドレスを次のように参照します vpn_ip. また、上記のリンク先のチュートリアルで説明されているように、すべてに「tun0」という名前のVPNインターフェイスがあると想定します。

Java8をインストールします

ElasticsearchにはJavaが必要なので、今すぐインストールします。 Elasticsearchが推奨する最新バージョンのOracleJava8をインストールします。 ただし、そのルートを選択する場合は、OpenJDKで正常に機能するはずです。 このセクションの手順に従うことは、JavaSEのOracleBinaryLicenseAgreementに同意することを意味します。

すべてのElasticsearchサーバーでこの手順を実行します。

ホームディレクトリに移動し、次のコマンドを使用してOracle Java 8(Update 73、この記事の執筆時点で最新)JDKRPMをダウンロードします。

  1. cd ~
  2. wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"

次に、このyumコマンドを使用してRPMをインストールします(別のリリースをダウンロードした場合は、ここでファイル名に置き換えてください)。

  1. sudo yum -y localinstall jdk-8u73-linux-x64.rpm

これで、Javaを次の場所にインストールする必要があります。 /usr/java/jdk1.8.0_73/jre/bin/java、およびからリンク /usr/bin/java.

以前にダウンロードしたアーカイブファイルを削除できます。

  1. rm ~/jdk-8u73-linux-x64.rpm

Java 8がインストールされたので、ElasticSearchをインストールしましょう。

Elasticsearchをインストールする

Elasticsearchは、Elasticのパッケージリポジトリを追加することにより、パッケージマネージャーとともにインストールできます。

次のコマンドを実行して、Elasticsearchの公開GPGキーをrpmにインポートします。

  1. sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

Elasticsearch用の新しいyumリポジトリファイルを作成します。 これは単一のコマンドであることに注意してください。

  1. echo '[elasticsearch-2.x]
  2. name=Elasticsearch repository for 2.x packages
  3. baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
  4. gpgcheck=1
  5. gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
  6. enabled=1
  7. ' | sudo tee /etc/yum.repos.d/elasticsearch.repo

次のコマンドでElasticsearchをインストールします。

  1. sudo yum -y install elasticsearch

すべてのElasticsearchサーバーでこの手順を必ず繰り返してください。

Elasticsearchがインストールされましたが、使用する前に構成する必要があります。

Elasticsearchクラスターを構成する

次に、Elasticsearch構成を編集します。 すべてのElasticsearchサーバーでこれらの手順を実行します。

Elasticsearch構成ファイルを開いて編集します。

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

以降のセクションでは、構成を変更する方法について説明します。

VPNIPアドレスまたはインターフェースにバインドする

Elasticsearchインスタンスへの外部アクセスを制限して、外部の人がHTTP APIを介してデータにアクセスしたり、Elasticsearchクラスターをシャットダウンしたりできないようにする必要があります。 つまり、プライベートネットワーク(VPN)上のサーバーへのアクセスのみを許可するようにElasticsearchを構成する必要があります。 これを行うには、VPNIPアドレスにバインドするように各ノードを構成する必要があります。 vpn_ip、またはインターフェース「tun0」。

指定する行を検索します network.host、コメントを外し、その値をそれぞれのサーバーのVPN IPアドレスに置き換えます(例: 10.0.0.1 node01)またはインターフェース名の場合。 すべてのサーバーでVPNインターフェースの名前が「tun0」であるため、すべてのサーバーを同じ行で構成できます。

Elasticsearch.yml — network.host
network.host: [_tun0_, _local_]

「_local_」が追加されていることに注意してください。これは、すべてのループバックデバイスでもリッスンするようにElasticsearchを構成します。 これにより、Elasticsearch HTTP APIをローカルで、各サーバーから、にリクエストを送信することで使用できるようになります。 localhost. これを含めない場合、ElasticsearchはVPNIPアドレスへのリクエストにのみ応答します。

警告: Elasticsearchにはセキュリティが組み込まれていないため、制御または信頼していないサーバーからアクセスできるIPアドレスにこれを設定しないことが非常に重要です。 Elasticsearchをパブリックまたは共有プライベートネットワークIPアドレスにバインドしないでください!

クラスタ名を設定する

次に、クラスターの名前を設定します。これにより、Elasticsearchノードがクラスターに参加して形成できるようになります。 (ネットワーク内で)一意のわかりやすい名前を使用することをお勧めします。

指定する行を検索します cluster.name、コメントを外し、その値を目的のクラスター名に置き換えます。 このチュートリアルでは、クラスターに「本番環境」という名前を付けます。

Elasticsearch.yml — cluster.name
cluster.name: production

ノード名を設定する

次に、各ノードの名前を設定します。 これは、クラスター内で一意のわかりやすい名前にする必要があります。

指定する行を検索します node.name、コメントを外し、その値を目的のノード名に置き換えます。 このチュートリアルでは、を使用して各ノード名をサーバーのホスト名に設定します。 ${HOSTNAME} 環境変数:

Elasticsearch.yml — node.name
node.name: ${HOSTNAME}

必要に応じて、ノードに手動で名前を付けることもできますが、必ず一意の名前を指定してください。 あなたも去ることができます node.name ノードにランダムな名前を付けてもかまわない場合は、コメントアウトします。

ディスカバリーホストを設定する

次に、クラスターを検出して形成するために接続されるノードの初期リストを構成する必要があります。 これは、ユニキャストネットワークで必要です。

指定する行を検索します discovery.zen.ping.unicast.hosts コメントを外します。 その値を、他のすべてのノードのVPN IPアドレスまたはホスト名(VPN IPアドレスに解決される)の文字列の配列に置き換えます。

たとえば、サーバーが3つある場合 node01, node02、 と node03 それぞれのVPNIPアドレス 10.0.0.1, 10.0.0.2、 と 10.0.0.3、次の行を使用できます:

Elasticsearch.yml —IPアドレス別のホスト
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

または、すべてのサーバーがVPN IPアドレスの名前ベースの解決で構成されている場合(DNSまたは /etc/hosts)、次の行を使用できます:

elasticsearch.yml —名前によるホスト
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]

注:前提条件のVPNチュートリアルのAnsiblePlaybookは自動的に作成します /etc/hosts 各VPNサーバーのインベントリホスト名(Ansibleで指定)を解決する各サーバーのエントリ hosts ファイル)そのVPNIPアドレスに。

保存して終了

これで、サーバーは基本的なElasticsearchクラスターを形成するように構成されました。 更新したい設定は他にもありますが、クラスターが機能していることを確認した後で設定します。

保存して終了 elasticsearch.yml.

Elasticsearchを開始します

次にElasticsearchを起動します。

  1. sudo systemctl start elasticsearch

次に、次のコマンドを実行して、起動時にElasticsearchを起動します。

  1. sudo systemctl enable elasticsearch

すべてのElasticsearchサーバーでこれらの手順( Elasticsearchクラスターの構成)を必ず繰り返してください。

クラスターの状態を確認する

すべてが正しく構成されていれば、Elasticsearchクラスターが稼働しているはずです。 先に進む前に、正しく機能していることを確認しましょう。 これを行うには、任意のElasticsearchノードからElasticsearchにクエリを実行します。

いずれかのElasticsearchサーバーから、次のコマンドを実行してクラスターの状態を出力します。

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

「production」という名前のクラスターが実行されていることを示す出力が表示されます。 また、構成したすべてのノードがメンバーであることを示す必要があります。

Cluster State:
{ "cluster_name" : "production", "version" : 36, "state_uuid" : "MIkS5sk7TQCl31beb45kfQ", "master_node" : "k6k2UObVQ0S-IFoRLmDcvA", "blocks" : { }, "nodes" : { "Jx_YC2sTQY6ayACU43_i3Q" : { "name" : "node02", "transport_address" : "10.0.0.2:9300", "attributes" : { } }, "k6k2UObVQ0S-IFoRLmDcvA" : { "name" : "node01", "transport_address" : "10.0.0.1:9300", "attributes" : { } }, "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "node03", "transport_address" : "10.0.0.3:9300", "attributes" : { } } }, ...

これに似た出力が表示された場合は、Elasticsearchクラスターが実行されています。 欠落しているノードがある場合は、先に進む前に、問題のノードの構成を確認してください。

次に、Elasticsearchクラスターで検討する必要のあるいくつかの構成設定について説明します。

メモリロックを有効にする

Elasticは、パフォーマンスと安定性に悪影響を与えるため、Elasticsearchプロセスを絶対に入れ替えないようにすることをお勧めします。 過度のスワッピングを回避する1つの方法は、必要なメモリをロックするようにElasticsearchを構成することです。

すべてのElasticsearchサーバーでこの手順を実行します。

Elasticsearch構成を編集します。

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

指定する行を検索します bootstrap.mlockall コメントを外します。

Elasticsearch.yml — bootstrap.mlockall
bootstrap.mlockall: true

保存して終了。

次に、 /etc/sysconfig/elasticsearch 編集用ファイル:

  1. sudo vi /etc/sysconfig/elasticsearch

まず、見つけます ES_HEAP_SIZE、コメントを外し、使用可能なメモリの約50% ofに設定します。 たとえば、約4 GBの空き容量がある場合は、これを2 GBに設定する必要があります(2g):

/ etc / default / elasticsearch — ES_HEAP_SIZE
ES_HEAP_SIZE=2g

次に、検索してコメントを解除します MAX_LOCKED_MEMORY=unlimited. 完了すると、次のようになります。

/ etc / default / elasticsearch — MAX_LOCKED_MEMORY
MAX_LOCKED_MEMORY=unlimited

保存して終了。

編集する最後のファイルはElasticsearchsystemdユニットファイルです。 編集のためにそれを開きます:

  1. sudo vi /usr/lib/systemd/system/elasticsearch.service

検索してコメントを外す LimitMEMLOCK=infinity. 完了すると、次のようになります。

/usr/lib/systemd/system/elasticsearch.service — LimitMEMLOCK
LimitMEMLOCK=infinity

保存して終了。

次に、systemctlデーモンをリロードし、Elasticsearchを再起動して、変更を適用します。

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart elasticsearch

すべてのElasticsearchサーバーでこの手順を必ず繰り返してください。

Mlockallステータスを確認する

それを確認するには mlockall すべてのElasticsearchノードで動作している場合は、任意のノードから次のコマンドを実行します。

  1. curl http://localhost:9200/_nodes/process?pretty

各ノードには、次のような行が必要です。 "mlockall" : true、これは、メモリロックが有効で機能していることを示します。

Nodes process output:
... "nodes" : { "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "es03", "transport_address" : "10.0.0.3:9300", "host" : "10.0.0.3", "ip" : "10.0.0.3", "version" : "2.2.0", "build" : "8ff36d1", "http_address" : "10.0.0.3:9200", "process" : { "refresh_interval_in_millis" : 1000, "id" : 1650, "mlockall" : true } ...

もしも mlockall いずれかのノードでfalseの場合は、ノードの設定を確認してElasticsearchを再起動します。 Elasticsearchが起動しない一般的な理由は、 ES_HEAP_SIZE 設定が高すぎます。

オープンファイル記述子の制限を構成する(オプション)

デフォルトでは、Elasticsearchノードの「OpenFileDescriptorLimit」は64kである必要があります。 このセクションでは、これを確認する方法と、必要に応じて増やす方法を示します。

最大オープンファイルを確認する方法

まず、ElasticsearchプロセスのプロセスID(PID)を見つけます。 これを行う簡単な方法は、 ps に属するすべてのプロセスを一覧表示するコマンド elasticsearch ユーザー:

  1. ps -u elasticsearch

次のような出力が表示されます。 最初の列の数字は、Elasticsearch(java)プロセスのPIDです。

Output:
PID TTY TIME CMD 11708 ? 00:00:10 java

次に、このコマンドを実行して、Elasticsearchプロセスのオープンファイル制限を表示します(強調表示された番号を前の手順の独自のPIDに置き換えます)。

  1. cat /proc/11708/limits | grep 'Max open files'
Output
Max open files 65535 65535 files

2列目と3列目の数字は、それぞれソフト制限とハード制限を64k(65535)として示しています。 これは多くのセットアップで問題ありませんが、この設定を増やすことをお勧めします。

最大ファイル記述子の制限を増やす方法

Elasticsearchで開くファイル記述子の最大数を増やすには、1つの設定を変更するだけです。

を開きます /usr/lib/systemd/system/elasticsearch.service 編集用ファイル:

  1. sudo vi /usr/lib/systemd/system/elasticsearch.service

探す LimitNOFILE そしてそれをあなたが望む限界に設定します。 たとえば、128k記述子の制限が必要な場合は、次のように変更します。 131070:

/usr/lib/systemd/system/elasticsearch.service — LimitNOFILE
LimitNOFILE=131070

保存して終了。

次に、systemctlデーモンをリロードし、Elasticsearchを再起動して、変更を適用します。

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart elasticsearch

次に、前のサブセクションに従って、制限が引き上げられたことを確認します。

より高いファイル記述子制限を必要とするElasticsearchサーバーでは、必ずこの手順を繰り返してください。

専用のマスターノードとデータノードを構成する(オプション)

Elasticsearchノードには、masterdataの2つの一般的なタイプがあります。 マスターノードは、インデックスの管理や特定のデータシャードを格納するデータノードの決定など、クラスター全体のアクションを実行します。 データノードは、インデックス付けされたドキュメントのシャードを保持し、CRUD、検索、および集計操作を処理します。 原則として、データノードは大量のCPU、メモリ、およびI/Oを消費します。

デフォルトでは、すべてのElasticsearchノードは「マスター適格」データノードとして構成されています。つまり、データを保存し(そしてリソースを大量に消費する操作を実行し)、マスターノードとして選出される可能性があります。 小さなクラスターの場合、これは通常は問題ありません。 ただし、大規模なElasticsearchクラスターは、専用マスターノードで構成して、マスターノードの安定性が集中的なデータノード作業によって損なわれないようにする必要があります。

専用マスターノードを構成する方法

専用のマスターノードを構成する前に、クラスターに少なくとも3つのマスター適格ノードがあることを確認してください。 これは、ネットワーク障害が発生した場合にデータに不整合を引き起こす可能性のあるスプリットブレインの状況を回避するために重要です。

専用のマスターノードを設定するには、ノードのElasticsearch設定を編集します。

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

次の2行を追加します。

Elasticsearch.yml —専用マスター
node.master: true 
node.data: false

最初の行、 node.master: true、ノードがマスター適格であり、実際にはデフォルト設定であることを指定します。 2行目、 node.data: false、ノードがデータノードになることを制限します。

保存して終了。

次に、Elasticsearchノードを再起動して、変更を有効にします。

  1. sudo systemctl restart elasticsearch

他の専用マスターノードでも、必ずこの手順を繰り返してください。

次のコマンドを使用して、クラスターにクエリを実行し、専用マスターノードとして構成されているノードを確認できます。 curl -XGET 'http://localhost:9200/_cluster/state?pretty'. を持つ任意のノード data: falsemaster: true 専用のマスターノードです。

専用データノードを構成する方法

専用データノード(マスター適格ではないデータノード)を構成するには、ノードのElasticsearch構成を編集します。

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

次の2行を追加します。

Elasticsearch.yml —専用データ
node.master: false 
node.data: true

最初の行、 node.master: false、ノードがマスター適格ではないことを指定します。 2行目、 node.data: true、は、ノードをデータノードにすることができるデフォルト設定です。

保存して終了。

次に、Elasticsearchノードを再起動して、変更を有効にします。

  1. sudo systemctl restart elasticsearch

他の専用データノードでもこの手順を繰り返してください。

次のコマンドを使用して、クラスターにクエリを実行し、専用データノードとして構成されているノードを確認できます。 curl -XGET 'http://localhost:9200/_cluster/state?pretty'. リストするノード master: false およびをリストしません data: false 専用のデータノードです。

最小マスターノードを構成する

Elasticsearchクラスターを実行するときは、クラスターが正常に機能するために実行する必要のあるマスター適格ノードの最小数を設定することが重要です。これは、クォーラムと呼ばれることもあります。 これは、1つ以上のノードがクラスターの残りの部分への接続を失った場合にデータの一貫性を確保し、「スプリットブレイン」状態と呼ばれる状況を防ぐためです。

クラスタに必要な最小マスターノードの数を計算するには、次のように計算します n / 2 + 1、ここで、 n は、正常なクラスター内の「マスター適格」ノードの総数であり、結果を最も近い整数に切り捨てます。 たとえば、3ノードクラスターの場合、クォーラムは2です。

注:マスター適格(デフォルト設定)のデータノードを含め、すべてのマスター適格ノードをクォーラム計算に含めるようにしてください。

最小マスターノード設定は、ElasticsearchHTTPAPIを介して動的に設定できます。 これを行うには、任意のノードで次のコマンドを実行します(強調表示された番号をクォーラムに置き換えます)。

  1. curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
  2. "persistent" : {
  3. "discovery.zen.minimum_master_nodes" : 2
  4. }
  5. }'
Output:
{ "acknowledged" : true, "persistent" : { "discovery" : { "zen" : { "minimum_master_nodes" : "2" } } }, "transient" : { } }

注:このコマンドは「永続的」設定です。つまり、最小マスターノード設定はクラスターの完全な再起動後も存続し、Elasticsearch構成ファイルをオーバーライドします。 また、この設定は次のように指定できます。 discovery.zen.minimum_master_nodes: 2/etc/elasticsearch.yml まだ動的に設定していない場合。

後でこの設定を確認する場合は、次のコマンドを実行できます。

  1. curl -XGET localhost:9200/_cluster/settings?pretty

Elasticsearchにアクセスする方法

Elasticsearch HTTP APIにアクセスするには、任意のノードのVPN IPアドレスにリクエストを送信するか、チュートリアルで示されているように、にリクエストを送信します。 localhost ノードの1つから。

Elasticsearchクラスターは、任意のノードのVPN IPアドレスを介してクライアントサーバーにアクセスできます。つまり、クライアントサーバーもVPNの一部である必要があります。

KibanaやLogstashなど、クラスターに接続する必要のある他のソフトウェアがある場合は、通常、アプリケーションに1つ以上のElasticsearchノードのVPNIPアドレスを提供することで接続を構成できます。

結論

Elasticsearchクラスターは正常な状態で実行され、いくつかの基本的な最適化で構成されている必要があります。

Elasticsearchには、インデックス、シャード、レプリケーション設定など、ここでは取り上げられていない他の多くの構成オプションがあります。 クラスターがニーズを満たすように構成されていることを確認するために、公式ドキュメントとともに後で構成を再検討することをお勧めします。