CentOS 7で実稼働Elasticsearchクラスターをセットアップする方法

前書き

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

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

Elasticsearchクラスターを手動でセットアップすることは学習に役立ちますが、クラスターのセットアップでは構成管理ツールの使用を強くお勧めします。 Ansibleを使用してElasticsearchクラスターをデプロイする場合は、このチュートリアルに従ってください:https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-set-up-a-production-elasticsearch- cluster [Ansibleを使用して実稼働Elasticsearchクラスターをセットアップする方法]。

前提条件

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

代わりにUbuntuを使用する場合は、次のチュートリアルをご覧ください:https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-cluster-on-ubuntu-14- 04 [Ubuntu 14.04で実稼働Elasticsearchクラスターをセットアップする方法]

仮定

このチュートリアルでは、サーバーが次のような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インターフェースにセキュリティが組み込まれていないため、各サーバーは同じプライベートネットワーク上にある必要があります。 プライベートネットワークは、信頼できないコンピューターと共有しないでください。

サーバーのVPN IPアドレスを「+ vpn_ip +」と呼びます。 上記のリンクされたチュートリアルで説明されているように、それらはすべて「tun0」という名前のVPNインターフェイスを持っていると仮定します。

Java 8をインストールする

ElasticsearchにはJavaが必要なため、今すぐJavaをインストールします。 Elasticsearchが推奨しているので、Oracle Java 8の最新バージョンをインストールします。 ただし、そのルートに進むことにした場合、OpenJDKで正常に動作するはずです。 このセクションの手順に従うことは、Java SEのOracle Binary License Agreementに同意することを意味します。

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

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

cd ~
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をインストールします(別のリリースをダウンロードした場合は、ここでファイル名を置き換えます)。

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

これで、Javaを `+ / usr / java / jdk1.8.0_73 / jre / bin / java `にインストールし、 ` / usr / bin / java +`からリンクする必要があります。

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

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

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

Elasticsearchをインストールする

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

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

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

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

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

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

sudo yum -y install elasticsearch

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

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

Elasticsearchクラスターを構成する

次に、Elasticsearchの設定を編集します。 すべてのElasticsearchサーバーでこれらの手順を完了します。

Elasticsearch構成ファイルを編集用に開きます。

sudo vi /etc/elasticsearch/elasticsearch.yml

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

VPN IPアドレスまたはインターフェースにバインド

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

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

elasticsearch.yml-network.host

network.host: [__, _local_]

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

クラスタ名を設定

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

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

elasticsearch.yml-cluster.name

cluster.name:

ノード名を設定

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

`+ 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 」があり、それぞれのVPN IPアドレスが「+10.0.0.1 +」、「 10.0.0.2+」、および「+10.0」である場合。 0.3 + `、次の行を使用できます。

elasticsearch.yml-IPアドレスによるホスト

discovery.zen.ping.unicast.hosts: ["", "", ""]

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

elasticsearch.yml-名前によるホスト

discovery.zen.ping.unicast.hosts: ["", "", ""]

保存して終了

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

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

Elasticsearchを開始

次に、Elasticsearchを開始します。

sudo systemctl start elasticsearch

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

sudo systemctl enable elasticsearch

必ずこれらの手順を繰り返してください(https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-cluster-on-centos-7#configure-elasticsearch-cluster[Configure Elasticsearch Cluster])すべての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 +`を指定する行を見つけてコメント解除します。

elasticsearch.yml-bootstrap.mlockall

bootstrap.mlockall: true

保存して終了。

次に、編集のために `+ / etc / sysconfig / elasticsearch +`ファイルを開きます:

sudo vi /etc/sysconfig/elasticsearch

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

/ etc / default / elasticsearch-ES_HEAP_SIZE

ES_HEAP_SIZE=

次に、「+ MAX_LOCKED_MEMORY = unlimited」を見つけてコメント解除します。 完了すると、次のようになります。

/ etc / default / elasticsearch-MAX_LOCKED_MEMORY

MAX_LOCKED_MEMORY=unlimited

保存して終了。

編集する最後のファイルは、Elasticsearch systemdユニットファイルです。 編集用に開きます。

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

`+ LimitMEMLOCK = infinity +`を見つけてコメント解除します。 完了すると、次のようになります。

/usr/lib/systemd/system/elasticsearch.service-LimitMEMLOCK

LimitMEMLOCK=infinity

保存して終了。

次に、systemctlデーモンをリロードしてElasticsearchを再起動し、変更を所定の場所に配置します。

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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

Mlockallステータスの確認

すべてのElasticsearchノードで「+ mlockall +」が機能していることを確認するには、任意のノードから次のコマンドを実行します。

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 」がfalseの場合、ノードの設定を確認し、Elasticsearchを再起動します。 Elasticsearchの起動に失敗する一般的な理由は、 ` ES_HEAP_SIZE +`の設定が高すぎることです。

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

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

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

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

ps -u elasticsearch

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

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

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

cat /proc//limits | grep 'Max open files'
OutputMax open files            65535                65535                files

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

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

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

編集のために `+ / usr / lib / systemd / system / elasticsearch.service +`ファイルを開きます:

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

`+ LimitNOFILE `を見つけて、希望する制限に設定します。 たとえば、128k記述子の制限が必要な場合は、「 131070+」に変更します。

/usr/lib/systemd/system/elasticsearch.service-LimitNOFILE

LimitNOFILE=

保存して終了。

次に、systemctlデーモンをリロードしてElasticsearchを再起動し、変更を所定の場所に配置します。

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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

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

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

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

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

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

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

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

sudo vi /etc/elasticsearch/elasticsearch.yml

次の2行を追加します。

elasticsearch.yml-専用マスター

node.master: true
node.data: false

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

保存して終了。

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

sudo systemctl restart elasticsearch

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

次のコマンドを使用して、クラスターを照会して、どのノードが専用マスターノードとして構成されているかを確認できます: + curl -XGET 'http:// localhost:9200 / _cluster / state?pretty' +。 `+ data:false `と ` master:true +`を持つノードは、専用のマスターノードです。

専用データノードの構成方法

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

sudo vi /etc/elasticsearch/elasticsearch.yml

次の2行を追加します。

elasticsearch.yml-専用データ

node.master: false
node.data: true

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

保存して終了。

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

sudo systemctl restart elasticsearch

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

次のコマンドを使用して、クラスターを照会して、どのノードが専用データノードとして構成されているかを確認できます: + curl -XGET 'http:// localhost:9200 / _cluster / state?pretty' +。 `+ master:false `をリストし、 ` data:false +`を*リストしないノードは、専用のデータノードです。

最小マスターノードの構成

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

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

Elasticsearch HTTP APIを使用して、最小マスターノード設定を動的に設定できます。 これを行うには、任意のノードで次のコマンドを実行します(強調表示されている数値をクォーラムに置き換えます)。

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

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

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

Elasticsearchにアクセスする方法

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

Elasticsearchクラスターは、任意のノードのVPN IPアドレスを介してクライアントサーバーにアクセスできます。つまり、クライアントサーバーもVPNの一部でなければなりません。

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

結論

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

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

Related