序章

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

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

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

前提条件

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

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

仮定

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

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

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

Java8をインストールします

ElasticsearchにはJavaが必要なので、今すぐインストールします。 Elasticsearchが推奨する最新バージョンのOracleJava8をインストールします。 ただし、そのルートを選択する場合は、OpenJDKで正常に機能するはずです。

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

OracleJavaPPAをaptに追加します。

  1. sudo add-apt-repository -y ppa:webupd8team/java

aptパッケージデータベースを更新します。

  1. sudo apt-get update

次のコマンドを使用して、Oracle Java 8の最新の安定バージョンをインストールします(ポップアップするライセンス契約に同意します)。

  1. sudo apt-get -y install oracle-java8-installer

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

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

Elasticsearchをインストールする

Elasticsearchは、Elasticのパッケージソースリストを追加することにより、パッケージマネージャーとともにインストールできます。 すべてのElasticsearchサーバーでこの手順を実行します。

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

  1. wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

プロンプトがちょうどそこにぶら下がっている場合は、おそらくユーザーのパスワードを待っています(sudoコマンドを承認するため)。 この場合は、パスワードを入力してください。

Elasticsearchソースリストを作成します。

  1. echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

aptパッケージデータベースを更新します。

  1. sudo apt-get update

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

  1. sudo apt-get -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 for node01)またはインターフェース名。 すべてのサーバーでVPNインターフェースの名前が「tun0」であるため、すべてのサーバーを同じ行で構成できます。

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

「_local_」が追加されていることに注意してください。これは、すべてのループバックデバイスでもリッスンするようにElasticsearchを構成します。 これにより、localhostにリクエストを送信することで、各サーバーからローカルでElasticsearchHTTPAPIを使用できるようになります。 これを含めない場合、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つのサーバーnode01node02、およびnode03があり、それぞれのVPNIPアドレスが10.0.0.110.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は、各VPNサーバーのインベントリホスト名を解決する/etc/hostsエントリを各サーバーに自動的に作成します( Ansible hostsファイル)をVPNIPアドレスに送信します。

保存して終了

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

elasticsearch.ymlを保存して終了します。

Elasticsearchを開始します

次にElasticsearchを起動します。

  1. sudo service elasticsearch restart

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

  1. sudo update-rc.d elasticsearch defaults 95 10

すべての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/default/elasticsearchファイルを開いて編集します。

  1. sudo vi /etc/default/elasticsearch

まず、ES_HEAP_SIZEを見つけてコメントを外し、使用可能なメモリの約50% oに設定します。 たとえば、約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

保存して終了。

次に、Elasticsearchを再起動して、変更を適用します。

  1. sudo service elasticsearch restart

すべての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つの設定を変更するだけです。

/etc/default/elasticsearchファイルを開いて編集します。

  1. sudo vi /etc/default/elasticsearch

MAX_OPEN_FILESを見つけてコメントを外し、希望の制限に設定します。 たとえば、128k記述子の制限が必要な場合は、131070に変更します。

/ etc / default / elasticsearch — MAX_OPEN_FILES
MAX_OPEN_FILES=131070

保存して終了。

次に、Elasticsearchを再起動して、変更を適用します。

  1. sudo service elasticsearch restart

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

より高いファイル記述子制限を必要とする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 service elasticsearch restart

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

curl -XGET 'http://localhost:9200/_cluster/state?pretty'コマンドを使用して、クラスターにクエリを実行し、専用マスターノードとして構成されているノードを確認できます。 data: falseおよびmaster: 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 service elasticsearch restart

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

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

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

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

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

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

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

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

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

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

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

Elasticsearchにアクセスする方法

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

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

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

結論

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

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