前書き

このチュートリアルでは、構成管理ツールであるAnsibleを使用して、クラウドサーバー環境のUbuntu 14.04またはCentOS 7に実稼働Elasticsearchクラスターをインストールする方法を示します。 AnsibleおよびTinc VPNの使用方法サーバーインフラストラクチャをセキュリティで保護する]チュートリアルでは、Elasticsearchノードが自分のネットワーク外のコンピューターから安全であることを確認します。

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

前提条件

Elasticsearchクラスターには最低3つのマスター適格ノードが必要であるため、このチュートリアルを完了するには、少なくとも3つのUbuntu 14.04またはCentOS 7サーバーとプライベートネットワークが必要です。 専用のマスターノードとデータノードが必要な場合は、マスターノード用に少なくとも3台のサーバーと、データノード用の追加サーバーが必要です。 また、デフォルトのElasticsearchヒープサイズである2 GBを使用する予定の場合、サーバーには少なくとも4 GBのメモリを割り当てる必要があることに注意してください。

サーバーを取得したら、このチュートリアルでメッシュVPNを使用するようにサーバーを構成します:https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- server-infrastructure [AnsibleおよびTinc VPNを使用してサーバーインフラストラクチャを保護する方法]。 各サーバーに固有のAnsibleインベントリのホスト名があることを確認してください。

DigitalOcean Private Networkingなどのプライベートネットワークを使用している場合、サーバーは同じアカウントまたはチーム内の同じリージョン内の他のサーバーと安全に通信できます。 Elasticsearchを使用する場合、HTTPインターフェースにセキュリティが組み込まれていないため、これは特に重要です。

仮定

上記のリンクされたチュートリアルで説明されているように、Elasticsearchノードとして使用するすべてのサーバーには、「tun0」という名前のVPNインターフェイスがあると仮定します。 そうでなく、ESノードが別のインターフェースでリッスンするようにする場合は、Playbookの `+ site.yml +`ファイルで適切な変更を行う必要があります。

また、Playbookはローカルコンピューターのホームディレクトリにある `+ ansible-tinc +`というディレクトリにあると仮定します。

ansible-elasticsearchプレイブックをダウンロードする

Elasticは、Elasticsearchクラスターを簡単にセットアップするために使用できるAnsibleロールを提供します。 それを使用するには、単にそれを `+ ansible-tinc +`プレイブックに追加し、いくつかのホストグループを定義し、適切なロールをグループに割り当てる必要があります。 繰り返しますが、前提条件のVPNチュートリアルをまだ実行していない場合は、https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-で見つけることができます。 your-server-infrastructure [こちら]。

まず、Tinc Ansible Playbookがあるディレクトリに移動します。

cd ~/ansible-tinc

次に、ElasticのGitHubアカウントで利用可能な「+ ansible-elasticsearch 」ロールをPlaybookの「 roles +」ディレクトリに複製します。

cd roles
git clone https://github.com/elastic/ansible-elasticsearch

ロールの名前を「elasticsearch」に変更します。

mv ansible-elasticsearch elasticsearch

site.ymlを更新する

マスターPlaybookファイル、「+ site.yml +」を編集して、3つの異なるElasticsearchロールを3つの異なるAnsibleホストグループにマッピングします。 これにより、適切なグループにホストを追加するだけで、専用マスター、専用データ、およびマスター適格/データElasticsearchノードを作成できます。

Ansible Playbookのディレクトリに戻ります。

cd ~/ansible-playbook

お気に入りのエディターで、「+ elasticsearch.yml 」という新しいファイルを編集します。 ` vi +`を使用します。

vi site.yml

グループへのElasticsearch専用マスターロールのマッピング

ファイルの下部で、次の行を追加して、専用のマスター `+ elasticsearch `ロールを ` elasticsearch_master_nodes +`グループにマッピングします。

site.yml-専用マスターノード

- hosts: elasticsearch_master_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false,  http.port: 9200, transport.tcp.port: 9300, node.data: false, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

このロールは、次の値でノードを構成するため、専用マスターノードを作成します: + node.master:true +`および `+ node.data:false +

いくつかのElasticsearchサーバーのAnsibleインベントリのホスト名(またはVPN IPアドレス)と一致するように、 + discovery.zen.ping.unicast.hosts +`変数で強調表示されているホスト名を更新してください。 これにより、これらのノードはElasticsearchクラスターを検出できます。 この例では、 `+ node01 ++ node02 +、および `+ node03 `を使用しています。これらは前提条件のVPNチュートリアルで使用されたホスト名であるためです。 また、VPNインターフェースの名前が「tun0」以外の場合、それに応じて ` network.host +`変数を更新します。

Elasticsearchの別のバージョンを使用する場合は、 `+ es_version `を更新します。 古いバージョンでは、 ` network.host +`変数のコンマ区切りリストを受け付けないため、2.2より前のバージョンではこの設定は機能しません。

`+ es_heap_size +`を、専用マスターサーバーの空きメモリの約半分の値に更新します。 たとえば、サーバーに約4 GBの空きがある場合、ヒープサイズを「2g」に設定します。

これで、 + elasticsearch_master_nodes + Ansibleホストグループに属するホストはすべて、専用のマスターElasticsearchノードとして設定されます。

Elasticsearchマスター/データロールをグループにマップする

ファイルの下部で、これらの行を追加することにより、マスター適格およびデータの `+ elasticsearch `ロールを ` elasticsearch_master_data_nodes +`グループにマッピングします。

site.yml-マスター適格/データノード

- hosts: elasticsearch_master_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

このロールは、ノードに「+ node.master:true 」および「 node.data:true +」の値を設定するため、マスターに適格なデータノードを作成します。

いくつかのElasticsearchサーバーのAnsibleインベントリのホスト名(またはVPN IPアドレス)と一致するように、 `+ discovery.zen.ping.unicast.hosts `変数で強調表示されているホスト名を更新してください。 また、VPNインターフェースの名前が「tun0」以外の場合、それに応じて ` network.host +`変数を更新します。

`+ es_version +`を専用マスターロールに使用したのと同じ値に設定します。

「+ es_heap_size +」を、マスター適格/データサーバー上の空きメモリの約半分の値に更新します。

これで、 + elasticsearch_master_data_nodes + Ansibleホストグループに属するホストはすべて、マスターに適格なデータノードとして設定されます。

Elasticsearch専用データロールをグループにマップする

ファイルの下部で、これらの行を追加して、専用のデータ「+ elasticsearch 」ロールを「 elasticsearch_data_nodes +」グループにマッピングします。

site.yml-専用データノード

- hosts: elasticsearch_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: false, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

このロールは、次の値でノードを構成するため、専用のデータノードを作成します: + node.master:false +`および `+ node.data:true +

いくつかのElasticsearchサーバーのAnsibleインベントリのホスト名(またはVPN IPアドレス)と一致するように、 `+ discovery.zen.ping.unicast.hosts `変数で強調表示されているホスト名を更新してください。 また、VPNインターフェースの名前が「tun0」以外の場合、それに応じて ` network.host +`変数を更新します。

`+ es_version +`を前のロールで使用したのと同じ値に設定します。

`+ es_heap_size +`を、専用データサーバーの空きメモリの約半分の値に更新します。

これで、 + elasticsearch_data_nodes + Ansibleホストグループに属するホストはすべて、専用データElasticsearchノードとして設定されます。

保存して終了

3つのロールを定義し、それらをホストグループにマッピングしたので、 `+ site.yml +`を保存して終了できます。

後でElasticsearchロールとホストグループマッピングを追加してください。

ホストインベントリファイルの更新

新しいElasticsearchロールがホストグループにマッピングされたので、適切なホストグループにホストを追加するだけで、異なるタイプのElasticsearchノードを作成できます。

Ansibleの `+ hosts +`インベントリファイルを編集します。

vi hosts

前提条件のチュートリアルに従った場合、ファイルは次のようになります(サーバーのホスト名とIPアドレスを含む):

Ansibleホストのインベントリ-元のファイル

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

次に、 `+ site.yml +`で定義したマッピングに対応する3つのグループを追加します。

Ansibleホストのインベントリ-Elasticsearchグループ

[elasticsearch_master_nodes]

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]

次に、クラスターを構成するElasticsearchノードのタイプに応じて、Elasticsearchホストを新しいホストグループに分散します。 たとえば、3つの専用マスターノードと1つの専用データノードが必要な場合、インベントリファイルは次のようになります。

Ansibleホストのインベントリ-完全な例

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

[elasticsearch_master_nodes]
node01
node02
node03

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]
node04

インベントリファイルに目的のElasticsearch(およびVPN)セットアップが反映されたら、保存して終了します。

Elasticsearchクラスターを作成する

`+ site.yml `と ` hosts +`が設定されたので、Playbookを実行してElasticsearchクラスターを作成する準備ができました。

次のコマンドでPlaybookを実行します。

ansible-playbook site.yml

Playbookの実行が完了すると、Elasticsearchクラスターが稼働します。 次のステップは、すべてが適切に機能していることを確認することです。

Elasticsearchクラスターのステータスを確認する

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

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

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

Cluster State:{
 "cluster_name" : "production",
 "version" : 8,
 "state_uuid" : "SgTyn0vNTTu2rdKPrc6tkQ",
 "master_node" : "OzqMzte9RYWSXS6OkGhveA",
 "blocks" : { },
 "nodes" : {
   "OzqMzte9RYWSXS6OkGhveA" : {
     "name" : "node02-node1",
     "transport_address" : "10.0.0.2:9300",
     "attributes" : {
       "data" : "false",
       "master" : "true"
     }
   },
   "7bohaaYVTeeOHvSgBFp-2g" : {
     "name" : "node04-node1",
     "transport_address" : "10.0.0.4:9300",
     "attributes" : {
       "master" : "false"
     }
   },
   "cBat9IgPQwKU_DPF8L3Y1g" : {
     "name" : "node03-node1",
     "transport_address" : "10.0.0.3:9300",
     "attributes" : {
       "master" : "false"
     }
   },
...

これに類似した出力が表示される場合、Elasticsearchクラスターが実行されています! 一部のノードが欠落している場合は、Ansible `+ hosts +`インベントリを確認して、ホストグループが適切に定義されていることを確認してください。

トラブルシューティング

「+ curl:(7)localhost port 9200への接続に失敗しました:接続が拒否されました+」というメッセージが表示された場合、Elasticsearchはそのサーバーで実行されていません。 これは通常、誤った + network.host +`または `+ discovery.zen.ping.unicast.hosts +`エントリなど、 `+ site.yml +`ファイルのElasticsearch設定エラーが原因です。 そのファイルを確認することに加えて、サーバー上のElasticsearchログ( `+ / var / log / elasticsearch / -node1 / production.log +)から手がかりを確認してください。

このチュートリアルに従って作成されたPlaybookの例をご覧になりたい場合は、https://github.com/thisismitch/ansible-tinc-elasticsearch-example [this GitHub repository]をご覧ください。 これは、作業中の `+ site.yml `および ` hosts +`ファイルがどのように見えるかを確認するのに役立ちます。

結論

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

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