Verwendung von Ansible zum Einrichten eines Production Elasticsearch-Clusters

Einführung

In diesem Lernprogramm zeigen wir Ihnen, wie Sie mit Ansible, einem Konfigurationsverwaltungstool, einen Elasticsearch-Produktionscluster unter Ubuntu 14.04 oder CentOS 7 in einer Cloud-Server-Umgebung installieren. Wir werden auf How To Use Ansible and Tinc VPN aufbauen Anleitung zum Sichern Ihrer Serverinfrastruktur, um sicherzustellen, dass Ihre Elasticsearch-Knoten vor Computern außerhalb Ihres eigenen Netzwerks sicher sind.

Elasticsearch ist ein beliebter Open Source-Suchserver, der für die verteilte Echtzeitsuche und Datenanalyse verwendet wird. Wenn Elasticsearch nicht für die Entwicklung verwendet wird, sollte es auf mehreren Servern als Cluster bereitgestellt werden, um die bestmögliche Leistung, Stabilität und Skalierbarkeit zu erzielen.

Voraussetzungen

Sie müssen über mindestens drei Ubuntu 14.04- oder CentOS 7-Server mit privatem Netzwerk verfügen, um dieses Lernprogramm ausführen zu können, da ein Elasticsearch-Cluster mindestens 3 Master-fähige Knoten haben sollte. Wenn Sie dedizierte Master- und Datenknoten haben möchten, benötigen Sie mindestens 3 Server für Master-Knoten sowie zusätzliche Server für alle Datenknoten. Beachten Sie außerdem, dass Ihren Servern mindestens 4 GB Arbeitsspeicher zugewiesen werden sollten, wenn Sie die standardmäßige Elasticsearch-Heap-Größe von 2 GB verwenden möchten.

Konfigurieren Sie Ihre Server nach dem Erhalt für die Verwendung eines Mesh-VPN mit diesem Lernprogramm: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- Serverinfrastruktur [So sichern Sie Ihre Serverinfrastruktur mit Ansible- und Tinc-VPN]. Stellen Sie sicher, dass jeder Server einen eindeutigen Hostnamen für das Ansible-Inventar hat.

Wenn Sie ein privates Netzwerk wie DigitalOcean Private Networking verwenden, können Ihre Server sicher mit anderen Servern desselben Kontos oder Teams in derselben Region kommunizieren. Dies ist besonders wichtig, wenn Sie Elasticsearch verwenden, da die HTTP-Schnittstelle keine Sicherheit enthält.

Annahmen

Wir gehen davon aus, dass alle Server, die Sie als Elasticsearch-Knoten verwenden möchten, über eine VPN-Schnittstelle mit dem Namen "tun0" verfügen, wie im oben verlinkten Lernprogramm beschrieben. Wenn dies nicht der Fall ist und Sie möchten, dass Ihre ES-Knoten auf einer anderen Oberfläche abhören, müssen Sie die entsprechenden Änderungen in der Datei "+ site.yml +" des Playbooks vornehmen.

Wir gehen auch davon aus, dass sich Ihr Playbook in einem Verzeichnis mit dem Namen "+ ansible-tinc +" im Home-Verzeichnis Ihres lokalen Computers befindet.

Lade das ansible-elasticsearch Playbook herunter

Elastic bietet eine Ansible-Rolle, mit der ein Elasticsearch-Cluster einfach eingerichtet werden kann. Um es zu verwenden, müssen wir es einfach in unser "+ ansible-tinc +" - Playbook aufnehmen, einige Hostgruppen definieren und den Gruppen die entsprechenden Rollen zuweisen. Wenn Sie das vorausgesetzte VPN-Lernprogramm noch nicht befolgt haben, finden Sie es unter https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure- Ihre-Server-Infrastruktur [hier].

Wechseln Sie zunächst in das Verzeichnis, in dem sich Ihr Tinc Ansible Playbook befindet:

cd ~/ansible-tinc

Klonen Sie anschließend die Rolle "+ ansible-elasticsearch ", die auf Elastics GitHub-Konto verfügbar ist, in das Verzeichnis " role +" des Playbooks:

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

Benennen Sie die Rolle in "elasticsearch" um:

mv ansible-elasticsearch elasticsearch

Aktualisieren Sie site.yml

Bearbeiten Sie die Master-Playbook-Datei "+ site.yml +", um drei verschiedene Elasticsearch-Rollen drei verschiedenen Ansible-Hostgruppen zuzuordnen. Auf diese Weise können Sie dedizierte Master-, dedizierte Daten- und masterfähige / Daten-Elasticsearch-Knoten erstellen, indem Sie einfach Hosts zu den entsprechenden Gruppen hinzufügen.

Wechseln Sie zurück in das Ansible Playbook-Verzeichnis:

cd ~/ansible-playbook

Bearbeiten Sie in Ihrem bevorzugten Editor eine neue Datei mit dem Namen "+ elasticsearch.yml ". Wir verwenden " vi +":

vi site.yml

Ordnen Sie der Gruppe eine dedizierte Master-Rolle für Elasticsearch zu

Ordnen Sie am Ende der Datei die dedizierte Master-Rolle "+ elasticsearch " der Gruppe " elasticsearch_master_nodes +" zu, indem Sie die folgenden Zeilen hinzufügen:

site.yml - Dedizierte Masterknoten

- 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"

Diese Rolle erstellt dedizierte Masterknoten, da sie die Knoten mit den folgenden Werten konfiguriert: + node.master: true + und + node.data: false +.

Achten Sie darauf, die hervorgehobenen Hostnamen in der Variablen "+ discovery.zen.ping.unicast.hosts " so zu aktualisieren, dass sie mit den Ansible-Inventar-Hostnamen (oder VPN-IP-Adressen) einiger Ihrer Elasticsearch-Server übereinstimmen. Auf diese Weise können diese Knoten den Elasticsearch-Cluster erkennen. In diesem Beispiel verwenden wir " node01 ", " node02 " und " node03 ", da dies die Hostnamen waren, die im vorausgesetzten VPN-Lernprogramm verwendet wurden. Wenn Ihre VPN-Schnittstelle einen anderen Namen als "tun0" hat, aktualisieren Sie die Variable " network.host" entsprechend.

Wenn Sie eine andere Version von Elasticsearch verwenden möchten, aktualisieren Sie + es_version +. Beachten Sie, dass diese Konfiguration für Versionen vor 2.2 nicht funktioniert, da ältere Versionen keine durch Kommas getrennten Listen für die Variable "+ network.host +" akzeptieren.

Aktualisieren Sie + es_heap_size + auf einen Wert, der ungefähr der Hälfte des freien Speichers auf Ihren dedizierten Masterservern entspricht. Wenn auf Ihrem Server beispielsweise ungefähr 4 GB frei sind, setzen Sie die Heap-Größe auf "2 g".

Alle Hosts, die zur Ansible-Hostgruppe "+ elasticsearch_master_nodes +" gehören, werden nun als dedizierte Master-Elasticsearch-Knoten konfiguriert.

Ordnen Sie die Stamm- / Datenrolle von Elasticsearch der Gruppe zu

Ordnen Sie am Ende der Datei der Gruppe "+ elasticsearch_data_nodes " die Rolle " elasticsearch +" für den Master und die Daten zu, indem Sie die folgenden Zeilen hinzufügen:

site.yml - Master-fähige / Datenknoten

- 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"

Diese Rolle erstellt Datenknoten, die für den Master geeignet sind, da sie die Knoten mit den folgenden Werten konfigurieren: + node.master: true + und + node.data: true +.

Achten Sie darauf, die hervorgehobenen Hostnamen in der Variablen "+ discovery.zen.ping.unicast.hosts " so zu aktualisieren, dass sie mit den Ansible-Inventar-Hostnamen (oder VPN-IP-Adressen) einiger Ihrer Elasticsearch-Server übereinstimmen. Wenn Ihre VPN-Schnittstelle einen anderen Namen als "tun0" hat, aktualisieren Sie die Variable " network.host" entsprechend.

Setzen Sie "+ es_version +" auf denselben Wert, den Sie für die dedizierte Masterrolle verwendet haben.

Aktualisieren Sie + es_heap_size + auf einen Wert, der ungefähr der Hälfte des freien Speichers auf Ihren Master-berechtigten / Datenservern entspricht.

Alle Hosts, die zur Ansible-Hostgruppe "+ elasticsearch_master_data_nodes +" gehören, werden nun als Datenknoten konfiguriert, die für den Master geeignet sind.

Ordnen Sie die dedizierte Datenrolle von Elasticsearch der Gruppe zu

Ordnen Sie am Ende der Datei die Rolle "+ elasticsearch " für die dedizierten Daten der Gruppe " elasticsearch_data_nodes +" zu, indem Sie die folgenden Zeilen hinzufügen:

site.yml - Dedizierte Datenknoten

- 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"

Diese Rolle erstellt dedizierte Datenknoten, da sie die Knoten mit den folgenden Werten konfiguriert: + node.master: false + und + node.data: true +.

Achten Sie darauf, die hervorgehobenen Hostnamen in der Variablen "+ discovery.zen.ping.unicast.hosts " so zu aktualisieren, dass sie mit den Ansible-Inventar-Hostnamen (oder VPN-IP-Adressen) einiger Ihrer Elasticsearch-Server übereinstimmen. Wenn Ihre VPN-Schnittstelle einen anderen Namen als "tun0" hat, aktualisieren Sie die Variable " network.host" entsprechend.

Setzen Sie "+ es_version +" auf denselben Wert, den Sie in den vorherigen Rollen verwendet haben.

Aktualisieren Sie + es_heap_size + auf einen Wert, der ungefähr der Hälfte des freien Speichers auf Ihren dedizierten Datenservern entspricht.

Alle Hosts, die zur Ansible-Hostgruppe "+ elasticsearch_data_nodes +" gehören, werden jetzt als dedizierte Daten-Elasticsearch-Knoten konfiguriert.

Speichern und schließen

Nachdem Sie die drei Rollen definiert und Hostgruppen zugeordnet haben, können Sie "+ site.yml +" speichern und beenden.

Sie können später weitere Elasticsearch-Rollen und Hostgruppen-Zuordnungen hinzufügen.

Aktualisieren Sie die Host-Inventardatei

Nachdem die neuen Elasticsearch-Rollen Hostgruppen zugeordnet wurden, können Sie verschiedene Arten von Elasticsearch-Knoten erstellen, indem Sie die Hosts einfach den entsprechenden Hostgruppen hinzufügen.

Bearbeiten Sie die Ansible + hosts + Inventardatei:

vi hosts

Wenn Sie das Lernprogramm für die Voraussetzungen befolgt haben, sollte Ihre Datei ungefähr so ​​aussehen (mit Ihren Server-Hostnamen und IP-Adressen):

Ansible Hosts Inventar - Originaldatei

[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]

Fügen Sie nun drei Gruppen hinzu, die den Zuordnungen entsprechen, die wir in + site.yml + definiert haben.

Ansible hostet Inventar - Elasticsearch-Gruppen

[elasticsearch_master_nodes]

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]

Verteilen Sie nun Ihre Elasticsearch-Hosts auf die neuen Hostgruppen, je nachdem, aus welchen Arten von Elasticsearch-Knoten Ihr Cluster bestehen soll. Wenn Sie beispielsweise drei dedizierte Masterknoten und einen einzelnen dedizierten Datenknoten möchten, sieht Ihre Inventardatei folgendermaßen aus:

Ansible Hosts Inventar - Vollständiges Beispiel

[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

Sobald Ihre Inventardatei die gewünschte Elasticsearch- (und VPN-) Konfiguration enthält, speichern und beenden Sie sie.

Elasticsearch-Cluster erstellen

Nachdem "+ site.yml " und " hosts +" eingerichtet wurden, können Sie Ihr Elasticsearch-Cluster erstellen, indem Sie das Playbook ausführen.

Führen Sie das Playbook mit folgendem Befehl aus:

ansible-playbook site.yml

Nachdem das Playbook ausgeführt wurde, sollte Ihr Elasticsearch-Cluster betriebsbereit sein. Der nächste Schritt besteht darin, zu überprüfen, ob alles ordnungsgemäß funktioniert.

Überprüfen Sie den Elasticsearch-Clusterstatus

Führen Sie auf einem Ihrer Elasticsearch-Server diesen Befehl aus, um den Status des Clusters zu drucken:

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

Es sollte eine Ausgabe angezeigt werden, die angibt, dass ein Cluster mit dem Namen "production" ausgeführt wird. Es sollte auch anzeigen, dass alle von Ihnen konfigurierten Knoten Mitglieder sind:

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"
     }
   },
...

Wenn Sie eine ähnliche Ausgabe sehen, wird Ihr Elasticsearch-Cluster ausgeführt! Wenn einige Ihrer Knoten fehlen, überprüfen Sie Ihr Ansible-Hosts-Inventar, um sicherzustellen, dass Ihre Hostgruppen richtig definiert sind.

Fehlerbehebung

Wenn Sie "+ curl" erhalten: (7) Verbindung zum lokalen Host-Port 9200 konnte nicht hergestellt werden: Verbindung abgelehnt "", wird Elasticsearch auf diesem Server nicht ausgeführt. Dies wird normalerweise durch Elasticsearch-Konfigurationsfehler in der Datei " site.yml " verursacht, z. B. falsche " network.host " - oder " discovery.zen.ping.unicast.hosts " -Einträge. Überprüfen Sie nicht nur diese Datei, sondern auch die Elasticsearch-Protokolle auf Ihren Servern (` / var / log / elasticsearch / -node1 / production.log +`) auf Hinweise.

Wenn Sie ein Beispiel für das Playbook sehen möchten, das anhand dieses Tutorials erstellt wurde, lesen Sie this GitHub repository. Dies sollte Ihnen helfen zu sehen, wie eine funktionierende "+ site.yml " - und " hosts +" - Datei aussieht.

Fazit

Ihr Elasticsearch-Cluster sollte in einem fehlerfreien Zustand ausgeführt und mit einigen grundlegenden Optimierungen konfiguriert werden!

Elasticsearch bietet viele andere Konfigurationsoptionen, die hier nicht behandelt wurden, z. B. Index-, Shard- und Replikationseinstellungen. Es wird empfohlen, dass Sie Ihre Konfiguration später zusammen mit der offiziellen Dokumentation erneut überprüfen, um sicherzustellen, dass Ihr Cluster Ihren Anforderungen entsprechend konfiguriert ist.