Wie Sie Ihre Ruby-Anwendung von OpenSearch zu Elasticsearch migrieren

Eine Anleitung zur Migration einer Ruby-Codebasis vom OpenSearch-Client zum Elasticsearch-Client.

Testen Sie Elasticsearch: Sehen Sie sich unsere Beispiel-Notebooks an, starten Sie eine kostenlose Cloud-Testversion oder testen Sie Elastic jetzt auf Ihrem lokalem Gerät.

Der OpenSearch Ruby-Client wurde in Version 7.x vom Elasticsearch Ruby-Client abgeleitet, daher sind die Codebasen relativ ähnlich. Das bedeutet, dass beim Migrieren einer Ruby-Codebasis von OpenSearch zu Elasticsearch der Code aus den jeweiligen Clientbibliotheken sehr vertraut aussehen wird. In diesem Blogbeitrag zeige ich eine Beispiel-Ruby-Anwendung, die OpenSearch verwendet, und die Schritte zur Migration dieses Codes zu Elasticsearch.

Beide Clients werden unter der weit verbreiteten Apache-Lizenz 2.0 veröffentlicht und sind somit Open Source und freie Software. Die Lizenz von Elasticsearch wurde kürzlich aktualisiert, und der Kern von Elasticsearch und Kibana wird seit Version 8.16 unter der von der OSI genehmigten Open-Source-Lizenz AGPL veröffentlicht.

Bei der Migration einer Ruby-Anwendung die Elasticsearch-Version berücksichtigen

Bei der Migration ist es unter anderem zu berücksichtigen, welche Version von Elasticsearch verwendet werden soll. Wir empfehlen die Verwendung der neuesten stabilen Version, die zum Zeitpunkt der Erstellung dieses Dokuments 8.17.0 ist. Die Nebenversionen des Elasticsearch Ruby Clients orientieren sich an den Nebenversionen von Elasticsearch. Für Elasticsearch 8.17.x können Sie also Version 8.17.x des Ruby-Gems verwenden.

OpenSearch ist ein Fork von Elasticsearch 7.10.2. Daher können sich die APIs geändert haben und es können unterschiedliche Funktionen auf beiden Plattformen genutzt werden. Das würde jedoch den Rahmen dieses Beitrags sprengen, und ich werde mich daher nur mit den häufigsten Operationen in einer Beispielanwendung befassen.

Für Ruby on Rails können Sie den offiziellen Elasticsearch-Client oder die Rails-Integrationsbibliotheken verwenden. Wir empfehlen, auf die jeweils neueste stabile Version von Elasticsearch und des Clients zu migrieren. Die Gem-Version elasticsearch-rails 8.0.0 unterstützt Rails 6.1, 7.0 und 7.1 sowie Elasticsearch 8.x.

Der Code

In diesem Beispiel bin ich den Schritten zur Installation von OpenSearch aus einem Tarball gefolgt. Nach dem Herunterladen und Entpacken des Tarballs musste ich ein anfängliches Administratorpasswort festlegen, das ich später zur Instanziierung des Clients verwenden werde.

Ich habe ein Verzeichnis mit Gemfile erstellt, das folgendermaßen aussieht:

Nach dem Ausführen von bundle install ist das Gem für mein Projekt installiert. Es wurde opensearch-ruby Version 3.4.0 installiert, und die Version von OpenSearch, die ich verwende, ist 2.18.0. Ich habe den Code in einer example_code.rb -Datei im selben Verzeichnis geschrieben. Der initiale Code in dieser Datei ist die Instanziierung eines OpenSearch-Clients:

Der Parameter „Transportoption ssl: { verify: false} wird gemäß Benutzerhandbuch übergeben, um das Testen zu vereinfachen. Im Produktionsbetrieb sollte dies je nach Bereitstellung von OpenSearch konfiguriert werden.

Seit Version 2.12.0 von OpenSearch muss die Umgebungsvariable OPENSEARCH_INITIAL_ADMIN_PASSWORD beim Ausführen des Installationsskripts auf ein sicheres Passwort gesetzt werden. Nachdem ich die Schritte zur Installation von OpenSearch aus einem Tarball befolgt hatte, exportierte ich die Variable in meiner Konsole und sie steht nun meinem Ruby-Skript zur Verfügung.

Eine einfache API, um sicherzustellen, dass der Client eine Verbindung zu OpenSearch herstellt, verwendet die cluster.health API:

Und es funktioniert tatsächlich:

Ich habe einige der gängigen Beispiele aus der Elasticsearch Ruby-Client-Dokumentation getestet, und sie funktionieren wie erwartet:

Migration einer Ruby-Anwendung zu Elasticsearch

Der erste Schritt besteht darin, elasticsearch-ruby in die Gemfile einzufügen. Nach dem Ausführen von bundle install wird das Elasticsearch Ruby Client Gem installiert. Wenn Sie Ihren Code vor der vollständigen Migration testen möchten, können Sie das opensearch-ruby Gem zunächst dort belassen.

Der nächste wichtige Schritt wird die Client-Instanziierung sein. Das hängt davon ab, wie Sie Elasticsearch betreiben. Um bei diesen Beispielen eine ähnliche Vorgehensweise beizubehalten, folge ich den Schritten unter Elasticsearch herunterladen und lokal ausführen.

Beim Ausführen von bin/elasticsearch startet Elasticsearch mit automatisch konfigurierten Sicherheitsfunktionen. Stellen Sie sicher, dass Sie das Passwort für den Elastic-Benutzer kopieren (Sie können es aber durch Ausführen bin/elasticsearch-reset-password -u elastic zurücksetzen). Wenn Sie diesem Beispiel folgen, stellen Sie sicher, dass Sie OpenSearch beenden, bevor Sie Elasticsearch starten, da beide auf demselben Port laufen.

Am Anfang von example_code.rb habe ich die OpenSearch-Client-Instanziierung auskommentiert und die Instanziierung für einen Elasticsearch-Client hinzugefügt:

Wie Sie sehen können, ist der Code in diesem Testszenario nahezu identisch. Dies hängt von der Art der Elasticsearch-Implementierung und der gewählten Verbindungs- und Authentifizierungsmethode ab. Dasselbe gilt hier wie bei OpenSearch in Bezug auf die Sicherheit: Die Option, SSL nicht zu überprüfen, dient nur zu Testzwecken und sollte nicht in der Produktion verwendet werden.

Sobald der Client eingerichtet ist, führe ich den Code erneut aus mit: bundle exec ruby example_code.rb. Und alles funktioniert einfach!

Behebung von Migrationsproblemen

Je nachdem, welche APIs Ihre Anwendung verwendet, besteht die Möglichkeit, dass Sie beim Ausführen Ihres Codes gegen Elasticsearch einen Fehler erhalten, wenn die APIs von OpenSearch voneinander abweichen. Die Dokumentation der REST-APIs ist eine unverzichtbare Referenz für detaillierte Informationen zur Verwendung der APIs. Bitte prüfen Sie die Dokumentation für die Version von Elasticsearch, die Sie verwenden. Sie können auch auf die Referenz Elasticsearch::API verweisen.

Mögliche Fehler bei Elasticsearch sind beispielsweise:

  • ArgumentError: Required argument '<ARGUMENT>' missing - Dies ist ein Clientfehler, der auftritt, wenn einer Anfrage ein erforderlicher Parameter fehlt.
  • Elastic::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/example/_doc] contains unrecognized parameter: [test]"}]... Dieser Fehler stammt von Elasticsearch und bedeutet, dass der Client-Code einen Parameter verwendet, den Elasticsearch für die verwendete API nicht erkennt.

Der Elasticsearch-Client wird Fehler von Elasticsearch mit der detaillierten Fehlermeldung, die vom Server gesendet wird, melden. Selbst bei nicht unterstützten Parametern oder Endpunkten sollte die Fehlermeldung darüber informieren, was anders ist.

Fazit

Wie wir anhand dieses Beispielcodes gezeigt haben, ist die Migration einer Ruby-Anwendung von OpenSearch zu Elasticsearch von der Ruby-Seite her nicht allzu komplex. Sie müssen sich über die Versionsverwaltung und mögliche Unterschiede in den APIs der Suchmaschinen im Klaren sein. Bei den häufigsten Aktionen besteht die größte Änderung bei der Migration von Clients jedoch in der Instanziierung. In dieser Hinsicht ähneln sie sich beide, aber die Art und Weise, wie Host und Anmeldeinformationen definiert werden, variiert je nachdem, wie der Stack bereitgestellt wird. Sobald der Client eingerichtet ist und Sie überprüft haben, dass er eine Verbindung zu Elasticsearch herstellt, können Sie den OpenSearch-Client nahtlos durch den Elasticsearch-Client ersetzen.

Zugehörige Inhalte

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus