Ubuntu14.04で本番Elasticsearchクラスターをセットアップする方法
序章
Elasticsearchは、データのリアルタイム分散検索と分析に使用される人気のあるオープンソース検索サーバーです。 開発以外の目的で使用する場合、Elasticsearchは、最高のパフォーマンス、安定性、およびスケーラビリティーを実現するために、クラスターとして複数のサーバーにデプロイする必要があります。
このチュートリアルでは、クラウドサーバー環境でUbuntu14.04に本番Elasticsearchクラスターをインストールして構成する方法を説明します。
Elasticsearchクラスターを手動でセットアップすることは学習に役立ちますが、クラスターのセットアップでは構成管理ツールを使用することを強くお勧めします。 Ansibleを使用してElasticsearchクラスターをデプロイする場合は、次のチュートリアルに従ってください:Ansibleを使用して本番Elasticsearchクラスターをセットアップする方法。
前提条件
Elasticsearchクラスターには少なくとも3つのマスター適格ノードが必要であるため、このチュートリアルを完了するには、少なくとも3つのUbuntu14.04サーバーが必要です。 専用のマスターノードとデータノードが必要な場合は、マスターノード用に少なくとも3台のサーバーと、データノード用に追加のサーバーが必要になります。
代わりにCentOSを使用したい場合は、次のチュートリアルを確認してください:CentOS7で本番Elasticsearchクラスターをセットアップする方法
仮定
このチュートリアルでは、サーバーが次のようなVPNを使用していることを前提としています: Ansible andTincVPNを使用してサーバーインフラストラクチャを保護する方法。 これにより、サーバーが使用している物理ネットワークに関係なく、プライベートネットワーク機能が提供されます。
共有プライベートネットワークを使用している場合は、VPNを使用してElasticsearchを不正アクセスから保護する必要があります。 ElasticsearchにはHTTPインターフェースにセキュリティが組み込まれていないため、各サーバーは同じプライベートネットワーク上にある必要があります。 プライベートネットワークは、信頼できないコンピューターと共有してはなりません。
サーバーのVPNIPアドレスを次のように参照します vpn_ip
. また、上記のリンク先のチュートリアルで説明されているように、すべてに「tun0」という名前のVPNインターフェイスがあると想定します。
Java8をインストールします
ElasticsearchにはJavaが必要なので、今すぐインストールします。 Elasticsearchが推奨する最新バージョンのOracleJava8をインストールします。 ただし、そのルートを選択する場合は、OpenJDKで正常に機能するはずです。
すべてのElasticsearchサーバーでこの手順を実行します。
OracleJavaPPAをaptに追加します。
- sudo add-apt-repository -y ppa:webupd8team/java
aptパッケージデータベースを更新します。
- sudo apt-get update
次のコマンドを使用して、Oracle Java 8の最新の安定バージョンをインストールします(ポップアップするライセンス契約に同意します)。
- sudo apt-get -y install oracle-java8-installer
すべてのElasticsearchサーバーでこの手順を必ず繰り返してください。
Java 8がインストールされたので、ElasticSearchをインストールしましょう。
Elasticsearchをインストールする
Elasticsearchは、Elasticのパッケージソースリストを追加することにより、パッケージマネージャーとともにインストールできます。 すべてのElasticsearchサーバーでこの手順を実行します。
次のコマンドを実行して、Elasticsearchの公開GPGキーをaptにインポートします。
- wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
プロンプトがちょうどそこにぶら下がっている場合は、おそらくユーザーのパスワードを待っています( sudo
指図)。 この場合は、パスワードを入力してください。
Elasticsearchソースリストを作成します。
- 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パッケージデータベースを更新します。
- sudo apt-get update
次のコマンドでElasticsearchをインストールします。
- sudo apt-get -y install elasticsearch
すべてのElasticsearchサーバーでこれらの手順を必ず繰り返してください。
Elasticsearchがインストールされましたが、使用する前に構成する必要があります。
Elasticsearchクラスターを構成する
次に、Elasticsearch構成を編集します。 すべてのElasticsearchサーバーでこれらの手順を実行します。
Elasticsearch構成ファイルを開いて編集します。
- 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」であるため、すべてのサーバーを同じ行で構成できます。
network.host: [_tun0_, _local_]
「_local_」が追加されていることに注意してください。これは、すべてのループバックデバイスでもリッスンするようにElasticsearchを構成します。 これにより、Elasticsearch HTTP APIをローカルで、各サーバーから、にリクエストを送信することで使用できるようになります。 localhost
. これを含めない場合、ElasticsearchはVPNIPアドレスへのリクエストにのみ応答します。
警告: Elasticsearchにはセキュリティが組み込まれていないため、制御または信頼していないサーバーからアクセスできるIPアドレスにこれを設定しないことが非常に重要です。 Elasticsearchをパブリックまたは共有プライベートネットワークIPアドレスにバインドしないでください!
クラスタ名を設定する
次に、クラスターの名前を設定します。これにより、Elasticsearchノードがクラスターに参加して形成できるようになります。 (ネットワーク内で)一意のわかりやすい名前を使用することをお勧めします。
指定する行を検索します cluster.name
、コメントを外し、その値を目的のクラスター名に置き換えます。 このチュートリアルでは、クラスターに「本番環境」という名前を付けます。
cluster.name: production
ノード名を設定する
次に、各ノードの名前を設定します。 これは、クラスター内で一意のわかりやすい名前にする必要があります。
指定する行を検索します node.name
、コメントを外し、その値を目的のノード名に置き換えます。 このチュートリアルでは、を使用して各ノード名をサーバーのホスト名に設定します。 ${HOSTNAME}
環境変数:
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
、次の行を使用できます:
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
または、すべてのサーバーがVPN IPアドレスの名前ベースの解決で構成されている場合(DNSまたは /etc/hosts
)、次の行を使用できます:
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]
注:前提条件のVPNチュートリアルのAnsiblePlaybookは自動的に作成します /etc/hosts
各VPNサーバーのインベントリホスト名(Ansibleで指定)を解決する各サーバーのエントリ hosts
ファイル)そのVPNIPアドレスに。
保存して終了
これで、サーバーは基本的なElasticsearchクラスターを形成するように構成されました。 更新したい設定は他にもありますが、クラスターが機能していることを確認した後で設定します。
保存して終了 elasticsearch.yml
.
Elasticsearchを開始します
次にElasticsearchを起動します。
- sudo service elasticsearch restart
次に、次のコマンドを実行して、起動時にElasticsearchを起動します。
- sudo update-rc.d elasticsearch defaults 95 10
すべてのElasticsearchサーバーでこれらの手順( Elasticsearchクラスターの構成)を必ず繰り返してください。
クラスターの状態を確認する
すべてが正しく構成されていれば、Elasticsearchクラスターが稼働しているはずです。 先に進む前に、正しく機能していることを確認しましょう。 これを行うには、任意のElasticsearchノードからElasticsearchにクエリを実行します。
いずれかのElasticsearchサーバーから、次のコマンドを実行してクラスターの状態を出力します。
- 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構成を編集します。
- sudo vi /etc/elasticsearch/elasticsearch.yml
指定する行を検索します bootstrap.mlockall
コメントを外します。
bootstrap.mlockall: true
保存して終了。
次に、 /etc/default/elasticsearch
編集用ファイル:
- sudo vi /etc/default/elasticsearch
まず、見つけます ES_HEAP_SIZE
、コメントを外し、使用可能なメモリの約50% ofに設定します。 たとえば、約4 GBの空き容量がある場合は、これを2 GBに設定する必要があります(2g
):
ES_HEAP_SIZE=2g
次に、検索してコメントを解除します MAX_LOCKED_MEMORY=unlimited
. 完了すると、次のようになります。
MAX_LOCKED_MEMORY=unlimited
保存して終了。
次に、Elasticsearchを再起動して、変更を適用します。
- sudo service elasticsearch restart
すべてのElasticsearchサーバーでこの手順を必ず繰り返してください。
Mlockallステータスを確認する
それを確認するには mlockall
すべてのElasticsearchノードで動作している場合は、任意のノードから次のコマンドを実行します。
- 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
ユーザー:
- ps -u elasticsearch
次のような出力が表示されます。 最初の列の数字は、Elasticsearch(java)プロセスのPIDです。
Output: PID TTY TIME CMD
11708 ? 00:00:10 java
次に、このコマンドを実行して、Elasticsearchプロセスのオープンファイル制限を表示します(強調表示された番号を前の手順の独自のPIDに置き換えます)。
- cat /proc/11708/limits | grep 'Max open files'
OutputMax open files 65535 65535 files
2列目と3列目の数字は、それぞれソフト制限とハード制限を64k(65535)として示しています。 これは多くのセットアップで問題ありませんが、この設定を増やすことをお勧めします。
最大ファイル記述子の制限を増やす方法
Elasticsearchで開くファイル記述子の最大数を増やすには、1つの設定を変更するだけです。
を開きます /etc/default/elasticsearch
編集用ファイル:
- sudo vi /etc/default/elasticsearch
探す MAX_OPEN_FILES
、コメントを外し、希望する制限に設定します。 たとえば、128k記述子の制限が必要な場合は、次のように変更します。 131070
:
MAX_OPEN_FILES=131070
保存して終了。
次に、Elasticsearchを再起動して、変更を適用します。
- sudo service elasticsearch restart
次に、前のサブセクションに従って、制限が引き上げられたことを確認します。
より高いファイル記述子制限を必要とするElasticsearchサーバーでは、必ずこの手順を繰り返してください。
専用のマスターノードとデータノードを構成する(オプション)
Elasticsearchノードには、masterとdataの2つの一般的なタイプがあります。 マスターノードは、インデックスの管理や特定のデータシャードを格納するデータノードの決定など、クラスター全体のアクションを実行します。 データノードは、インデックス付けされたドキュメントのシャードを保持し、CRUD、検索、および集計操作を処理します。 原則として、データノードは大量のCPU、メモリ、およびI/Oを消費します。
デフォルトでは、すべてのElasticsearchノードは「マスター適格」データノードとして構成されています。つまり、データを保存し(そしてリソースを大量に消費する操作を実行し)、マスターノードとして選出される可能性があります。 小さなクラスターの場合、これは通常は問題ありません。 ただし、大規模なElasticsearchクラスターは、専用マスターノードで構成して、マスターノードの安定性が集中的なデータノード作業によって損なわれないようにする必要があります。
専用マスターノードを構成する方法
専用のマスターノードを構成する前に、クラスターに少なくとも3つのマスター適格ノードがあることを確認してください。 これは、ネットワーク障害が発生した場合にデータに不整合を引き起こす可能性のあるスプリットブレインの状況を回避するために重要です。
専用のマスターノードを設定するには、ノードのElasticsearch設定を編集します。
- sudo vi /etc/elasticsearch/elasticsearch.yml
次の2行を追加します。
node.master: true
node.data: false
最初の行、 node.master: true
、ノードがマスター適格であり、実際にはデフォルト設定であることを指定します。 2行目、 node.data: false
、ノードがデータノードになることを制限します。
保存して終了。
次に、Elasticsearchノードを再起動して、変更を有効にします。
- sudo service elasticsearch restart
他の専用マスターノードでも、必ずこの手順を繰り返してください。
次のコマンドを使用して、クラスターにクエリを実行し、専用マスターノードとして構成されているノードを確認できます。 curl -XGET 'http://localhost:9200/_cluster/state?pretty'
. を持つ任意のノード data: false
と master: true
専用のマスターノードです。
専用データノードを構成する方法
専用データノード(マスター適格ではないデータノード)を構成するには、ノードのElasticsearch構成を編集します。
- sudo vi /etc/elasticsearch/elasticsearch.yml
次の2行を追加します。
node.master: false
node.data: true
最初の行、 node.master: false
、ノードがマスター適格ではないことを指定します。 2行目、 node.data: true
、は、ノードをデータノードにすることができるデフォルト設定です。
保存して終了。
次に、Elasticsearchノードを再起動して、変更を有効にします。
- sudo service elasticsearch restart
他の専用データノードでもこの手順を繰り返してください。
次のコマンドを使用して、クラスターにクエリを実行し、専用データノードとして構成されているノードを確認できます。 curl -XGET 'http://localhost:9200/_cluster/state?pretty'
. リストするノード master: false
およびはをリストしません data: false
専用のデータノードです。
最小マスターノードを構成する
Elasticsearchクラスターを実行するときは、クラスターが正常に機能するために実行する必要のあるマスター適格ノードの最小数を設定することが重要です。これは、クォーラムと呼ばれることもあります。 これは、1つ以上のノードがクラスターの残りの部分への接続を失った場合にデータの一貫性を確保し、「スプリットブレイン」状態と呼ばれる状況を防ぐためです。
クラスタに必要な最小マスターノードの数を計算するには、次のように計算します n / 2 + 1
、ここで、 n は、正常なクラスター内の「マスター適格」ノードの総数であり、結果を最も近い整数に切り捨てます。 たとえば、3ノードクラスターの場合、クォーラムは2です。
注:マスター適格(デフォルト設定)のデータノードを含め、すべてのマスター適格ノードをクォーラム計算に含めるようにしてください。
最小マスターノード設定は、ElasticsearchHTTPAPIを介して動的に設定できます。 これを行うには、任意のノードで次のコマンドを実行します(強調表示された番号をクォーラムに置き換えます)。
- curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
- "persistent" : {
- "discovery.zen.minimum_master_nodes" : 2
- }
- }'
Output:{
"acknowledged" : true,
"persistent" : {
"discovery" : {
"zen" : {
"minimum_master_nodes" : "2"
}
}
},
"transient" : { }
}
注:このコマンドは「永続的」設定です。つまり、最小マスターノード設定はクラスターの完全な再起動後も存続し、Elasticsearch構成ファイルをオーバーライドします。 また、この設定は次のように指定できます。 discovery.zen.minimum_master_nodes: 2
の /etc/elasticsearch.yml
まだ動的に設定していない場合。
後でこの設定を確認する場合は、次のコマンドを実行できます。
- 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には、インデックス、シャード、レプリケーション設定など、ここでは取り上げられていない他の多くの構成オプションがあります。 クラスターがニーズを満たすように構成されていることを確認するために、公式ドキュメントとともに後で構成を再検討することをお勧めします。