22 Juni 2016 Engineering

Elasticsearch auf AWS betreiben

Von Kosho OwaDara Gies

Teil 1 – EC2-Instanzen bereitstellen

Wir sprechen mit unseren Kunden oft über den Betrieb von Elasticsearch-Clustern auf Amazon Web Services (AWS). AWS ist eine bequeme und schnelle Möglichkeit zur Bereitstellung und Skalierung von Systemen, wenn sich die Anforderungen verändern. Elasticsearch verwendet diese On-Demand-Systemarchitektur von EC2, sodass EC2-Instanzen und entsprechende Elasticsearch-Nodes bei schwankenden Kapazitäts- und Performance-Bedürfnissen hinzugefügt und entfernt werden können.

IIn diesem Artikel zeigen wir euch, wie ihr Elasticsearch 2.3.3 auf Amazon EC2 betreibt. Dabei werden wir einen Elasticsearch-Cluster mit drei Nodes konfigurieren.

Schritt 1: Wählt ein Amazon Machine Image (AMI) aus

Elasticsearch läuft auf verschiedenen Betriebssystemen wie CentOS, Redhat, Ubuntu und Amazon Linux. Wir empfehlen euch die neueste Version von Amazon Linux AMI – „Amazon Linux AMI 2016.03.0 (HVM), SSD Volume Type“.

Choose an Amazon Machine Image (AMI).png

Schritt 2: Wählt einen Instanztyp

Ein passender Instanztyp für den Anfang ist m3.2xlarge, der mit 8 vCPUs, 30 GB RAM und 2 x 80 GB SSD-Laufwerken aufwarten kann und jede Menge Netzwerk-Performance liefert. Solid-State-Laufwerke werden für eine bessere IO bei Indizierung und Merges bevorzugt; außerdem ist eine hohe Netzwerk-Performance essenziell für die Cluster-Performance und die Zuverlässigkeit.

Natürlich ist m3.2xlarge nur eine allgemeine Empfehlung. Wenn ihr wissen wollt, ob dieser Instanztyp wirklich der richtige für euch ist, solltet ihr einen Benchmark-Test mit eurer Lösung durchführen, um zu prüfen, ob er die Performance- und Skalierungsanforderungen erfüllt.

Klickt auf die Schaltfläche „Next: Configure Instance Details“.

Choose an Instance Type.png

Schritt 3: Instanzdetails konfigurieren

Jede Elasticsearch-Node läuft auf einer dedizierten EC2-Instanz. Deshalb müsst ihr die Instanzanzahl auf 3 setzen.

Beachtet, dass alle AWS-Konten, die nach dem 4. Dezember 2013 erstellt wurden, nur EC2-VPC unterstützen. Die Option Network“ für „Launch“ into EC2-Classic“ ist dann also nicht mehr verfügbar und sollte sowieso nicht aktiviert werden.

Es empfiehlt sich, die Option „Enable termination protection“ auszuwählen, damit Nodes und ihre Daten nicht versehentlich gelöscht werden können.

In den anderen Feldern lasst ihr die Standardwerte stehen und klickt auf die Schaltfläche „Next: Add Storage“.

Configure Instance Details.png

Schritt 4: Speicher hinzufügen

Belassen wir den Speicher erst einmal bei 8 GB. Wenn ihr eure Index-Speicheranforderungen jetzt schon kennt, könnt ihr den Speicher bereits anpassen. Belasst den Datenträgertyp auf Allzweck-SSD.

Klickt auf die Schaltfläche „Next: Tag Instance“.

Add Storage.png

Schritt 5: Instanz kennzeichnen

In diesem Feld gebt ihr ein Paar aus Schlüssel und Wert an, zum Beispiel „name“ und „esonaws“, um das Abrufen der EC2-Instanzen zu vereinfachen.

Klickt auf die Schaltfläche „Next: Configure Security Group“.

Step 5 Tag Instance.png

Schritt 6: Sicherheitsgruppe konfigurieren

Dieses Konfigurations-Panel ermöglicht es euch, einige Firewall-Regeln für den Zugriff auf eure Instanz festzulegen. Standardmäßig öffnet Elasticsearch den TCP-Port 9200 für den Zugriff der REST API und den TCP-Port 9300 für die interne Cluster-Kommunikation. Ihr solltet erwägen, Regeln für die Verbindung zum TCP-Port 9200 von gewünschten Subnetzen (üblicherweise private Subnetze) und zum TCP-Port 9300 von den Subnetzen zu ermöglichen, in denen Elasticsearch-Nodes aktiv sind. Wenn ihr die Standard-Porteinstellungen in elasticsearch.yml ändern wollt, solltet ihr die Regeln für diese Ports und nicht für die TCP-Ports 9200 und 9300 konfigurieren.

Außerdem solltet ihr eine Regel hinzufügen, die SSH-Verbindungen am Port 22 zulässt, damit ihr später die Verbindung zur Instanz herstellen könn

Klickt auf die Schaltfläche „Review and Launch“.

Configure Security Group.png

Schritt 7: Instanz überprüfen und starten

Beachtet eventuelle Warnungen und prüft die Instanz-Starteinstellungen. Wenn ihr bereit seid, klickt ihr auf die Schaltfläche „Launch“.

Review Instance Launch.png

Jetzt werdet ihr aufgefordert, ein Schlüsselpaar zu hinterlegen oder ein neues Paar zu erstellen.

Select Key Pair.png

Das braucht ihr, um den SSH-Zugang zur EC2-Instanz zu aktivieren. Wenn ihr Hilfe beim Einrichten eines Schlüsselpaares braucht, findet ihr im Artikel Schlüsselpaare für Amazon EC2 eine Übersicht und eine Anleitung für die Erstellung neuer Schlüsselpaare.

Startet die EC2-Instanzen und notiert euch die zugewiesenen privaten IP-Adressen, die wir in einem weiteren Schritt brauchen werden.


Teil 2 – Elasticsearch installieren

RPM

Meldet euch in jeder EC2-Instanz per SSH an.

$ ssh -v -i /pathto/[certfilename].pem ec2-user@[ec2hostname]

Dann installiert ihr das Elasticsearch RPM-Paket in jeder EC2-Instanz wie unten beschrieben.

$ sudo rpm -i https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.3/elasticsearch-2.3.3.rpm

Andere Elasticsearch-Versionen sind hier verfügbar. Für eine Installation mit yum gibt es den Leitfaden.

Stellt sicher, dass Elasticsearch auch nach einem Reboot des Systems wieder gestartet wird.

$ sudo chkconfig --add elasticsearch

Plugins installieren

Ihr müsst in jeder EC2-Instanz im Cluster das Lizenz-Plugin und das AWS-Cloud-Plugin installieren.

$ cd /usr/share/elasticsearch/ 
$ sudo bin/plugin install cloud-aws

Wenn ihr noch weitere Plugins benötigt (zum Beispiel Marvel für die Überwachung oder ICU für die Unterstützung weiterer Sprachen), ist jetzt ein guter Zeitpunkt für deren Installation.

Elasticsearch konfigurieren

Die maximale JVM-Heap-Größe sollte sich nach dem verfügbaren Hauptspeicher der Instanz richten. Öffnet in jeder EC2-Instanz die Datei „/etc/sysconfig/elasticsearch“ mit eurem bevorzugten Editor und stellt die Parameter „ES_HEAP_SIZE“ und „MAX_LOCKED_MEMORY“ ein. Die folgende Konfiguration gilt für eine m3.2xlarge-Instanz. Der Parameter „ES_HEAP_SIZE“ sollte die Hälfte des Speichers betragen, aber nicht mehr als 32 GB.

ES_HEAP_SIZE=15g 
MAX_LOCKED_MEMORY=unlimited

Öffnet auf jedem System „/etc/elasticsearch/elasticsearch.yml“ und bearbeitet folgende Einstellungen.

cluster.name:esonaws 
bootstrap.mlockall: true 
discovery.zen.ping.unicast.hosts: [_ip_address_,…] 
network.host: [_ip_address_]

"discovery.zen.ping.unicast.hosts" listet alle privaten IP Adressen der EC2-Instanzen auf. Alle potentielle Master-Nodes müssen angeführt werden. In einem kleinen Cluster können alle Instanzen sowohl als Daten- als auch als Master-Node konfiguriert werden. "network.host" ist die private IP Adresse der EC2-Instanz, die mit den anderen Nodes im Cluster geteilt wird.

Die private IP Adresse ist nicht notwendig, wenn der Cluster aus einer einzelnen Instanz besteht. "_site_" und "_local_" repräsentieren die private Adress und die lokale Loopback-Adresse "127.0.0.1", die entfernten Zugriff darauf erlauben.

Starten und überprüfen

Wenn ihr mehrere Elasticsearch-Nodes einrichtet, müssen alle dieselbe Version, dieselben Plugins und gleichwertige Konfigurationen haben. Startet Elasticsearch in jeder EC2-Instanz.

$ sudo service elasticsearch start

Nach dem Start können wir den Elasticsearch-Cluster mit der Statusabfrage curl überprüfen.

$ curl localhost:9200/_cluster/health?pretty

Bei einem erfolgreichen Start ist der Status des Clusters mit „green“ angegeben (oder „yellow“, falls es nur eine Node ist). Der Wert „number_of_nodes“ sollte die Anzahl der gestarteten Nodes anzeigen. Abhängig von eurer Index-Konfiguration benötigt ihr mindestens zwei Nodes, damit der "status" des Clusters "green" wird. Mindestens drei Nodes werden empfohlen um Konflikte bei der Master-Wahl zu vermeiden. Wenn „status“ nicht „green“ ist, könnt ihr auch die Konfiguration der Security Group prüfen; oder ihr durchsucht die Logs unter „/var/log/elasticsearch“ nach Fehlern.

{ 
  “cluster_name” : “esonaws”, 
  “status” : “green”, 
  “timed_out” : false, 
  “number_of_nodes” : 3, 
  “number_of_data_nodes” : 3, 
  “active_primary_shards” : 8, 
  “active_shards” : 16, 
  “relocating_shards” : 0, 
  “initializing_shards” : 0, 
  “unassigned_shards” : 0, 
  “delayed_unassigned_shards” : 0, 
  “number_of_pending_tasks” : 0, 
  “number_of_in_flight_fetch” : 0, 
  “task_max_waiting_in_queue_millis” : 0, 
  “active_shards_percent_as_number” : 100.0 
}

Euer Elasticsearch-Cluster ist bereit!

Zusammenfassung

Die Implementierung eines Elasticsearch-Clusters auf Amazon EC2 ist relativ einfach, erfordert aber einige Konfigurationsschritte, Kenntnisse in SSH und Schlüsselpaarverwaltung, und wir gehen davon aus, dass ihr die Systeme selbst verwaltet.

Wenn ihr lieber einen Managed-Service mit mehr Benutzerfreundlichkeit haben wollt, ist Elastic Cloud, das offiziell von Elastic gehostete Elasticsearch- und Kibana-Angebot auf AWS, eine gute Wahl. Mit wenigen Klicks könnt ihr so Cluster zusammenstellen. Elastic Cloud bietet außerdem Security Features, Kibana, Unterstützung aller offiziellen Plugins, On-Demand-Clusterskalierung, automatische Backups und mehr.

elastic cloud is easy vi.gif

Elastic Cloud erlaubt eine kostenlose Testperiode ist kostenlos und es ist keine Kreditkarte zur Registrierung erforderlich. Hier ist ein Link zu einem kurzen Video, in dem die Elastic Cloud etwas detaillierter beschrieben wird.