Dieser Artikel wurde maschinell übersetzt.

Programmiererpraxis

Cassandra – die NoSQL-Datenbank, Teil 3: Clusterbildung

Ted Neward

 

Ted NewardDas letzte Mal ich untersuchte Apache Cassandra, die "open-Source, verteilte, dezentrale, elastisch skalierbare, hochverfügbare, fehlertolerante, tuneably konsistent, spaltenorientiert Datenbank, die seine Verteilung-Gestaltung auf Amazon Dynamo und seine Datenmodell auf Google Bigtable, gründet" wie beschrieben in dem Buch, "Cassandra: The Definitive Guide"(O' Reilly Media, 2010). Genauer gesagt, nach der Installation Cassandra (im ersten Teil dieser Serie), ich schaute auf wie zu Programm, um es aus dem Microsoft .NET Framework, die grundlegende Bits der Daten lesen und schreiben zu tun. Nichts Spektakuläres.

In der Tat ist Teil des Cassandras "spektakulär" in seine Fähigkeiten, auch cluster eingewickelt geben Cassandra einfach skalieren. Dies bedeutet es "lächerlich" Größen heraus wachsen kann — in den meisten Fällen mit wenig bis kein administrativer Aufwand – insbesondere im Vergleich gegen das Werk von die meisten relationalen Datenbanken zum Speichern der entsprechenden Größen benötigt. Als Beispiel einer lokalen Tech-Firma hier in Redmond, Washington (wo ich lebe), behauptete in einer jüngsten Start-Meetup war es Speichern von mehr als 50PB von Daten in Kassandra.

Auch mit Übertreibung und Übertreibung, nur ein Zehntel davon (5PB, oder mehr als 5, 000TB) ist eine ziemlich heftige Datenmenge. Um fair zu sein, der Cassandra-Website (cassandra.apache.org) heißt es, "Die größte bekannte Cassandra Cluster hat über 300 Terabyte an Daten in mehr als 400 Maschinen," die immer noch ziemlich schwer zu tun mit einem relationalen Out-of-Box-Setup.

Aber der Schlüssel zu diesem Speicher ist im Cluster, und zwar immer einen Cluster von dieser Größe eingerichtet, in der Produktion wahrscheinlich würde den Rahmen dieses Artikels sprengen, können wir zumindest beginnen, mit ihm zu spielen, indem man einen Multi-Node Cluster unter für Entwicklungsarbeit. Es erfordert einige Schritte, so dass ich durch sie nötig werden einen Schritt nach dem anderen. (Übrigens DataStax hat eine einfache Installation für Cassandra, aber als nahe wie kann ich sagen es fehlt die Möglichkeit zum Einrichten einer Verbindung mit eines Multi-Node Clusters auf einer Box; Das ist der einzige Nachteil, die ich bisher sehen kann.)

Recap zu installieren

Im ersten Artikel dieser Serie (msdn.microsoft.com/magazine/jj553519), ging ich durch den (manchmal qualvolle) Schmerz Cassandra aus der .zip-Datei und die Befehlszeile einrichten: Sicherstellen, dass eine Java-Laufzeitumgebung installiert ist und auf dem Weg; Stellen Sie sicher, dass eine JAVA_HOME-Umgebungsvariable konfiguriert ist; Entpacken Sie die Cassandra-Distribution in ein Verzeichnis; und starten Sie dann die Datei "cassandra.bat" aus dem "bin" Verzeichnis auf den Server zum laufen zu bringen.

Zur Zeit kann schien es wirklich anachronistische, dies zu tun, aber zwei positive Dinge tut die Installation so herkommen. Zunächst erhalten Sie einige Erfahrung im Installieren von einen Server in Java geschrieben (und das entpuppt sich als eine ziemlich nützliche Fähigkeit gegeben haben, wie viele der verschiedenen NoSQL-Implementierungen in Java geschrieben sind). Zweitens musst du ", dass das Setup auf einem ziemlich niedrigen Niveau Cassandra mehrfach ausgeführt wird, auf einem einzigen Computer zu bekommen machen Sie".

Sie sehen, Cassandras Begriff der Skalierbarkeit von einem "Ring" der Server kommt: mehrere Instanzen der Cassandra Dienst auf mehreren Feldern jeweils einen Teil der gesamten Datenmenge speichern. Dann, wenn neue Daten auf dem Ring, Cassandra "Klatsch" geschrieben werden (das ist der eigentliche Fachausdruck dafür) zwischen den verschiedenen Knoten in den Ring an der richtigen Stelle innerhalb des Rings die Daten abzulegen. Cassandra wird die Daten zwischen den Knoten in einem Fondsbranche Ring gleichmäßig ausgeglichen. Cassandra hat eine Anzahl von unterschiedlichen Strategien für das Schreiben der Daten zwischen den Knoten, und es ist immer möglich, eine neue benutzerdefinierte Strategie zu schreiben (angenommen, Sie sind komfortable Schreiben Java), aber jetzt werde ich mit den Standardeinstellungen, die Dinge einfacher zu halten.

Ein Ring, sie zu regieren alle...

Normalerweise ist die einfachste Möglichkeit zum Einrichten einer Cassandra-Clusters haben mehrere Maschinen und natürlich eine Möglichkeit zu tun, die auf einem einzigen Laptop ist die Einrichtung mehrere virtuelle Maschinen-Instanzen gleichzeitig ausgeführt. Aber, dass Get unhandlich und Amp die Hardwareanforderungen ziemlich schnell einrichten können, besonders wenn Sie einer der Entwickler, wer alles macht ausschalten einen Laptop (wie mich).

Also der zweite Weg, um mehrere Knoten, Cassandra mehrmals auf der gleichen Box, Speichern von Daten in mehreren Orten und verschiedenen Sockets abhört ausgeführt zu haben. Das bedeutet Eintauchen in Cassandras Konfigurationsdateien zwei (oder mehr) andere Konfiguration-Installationen einrichten sowie die Einführung von jedem.

Angenommen, eine Cassandra 1.1 zu installieren (die neueste Version zum Zeitpunkt des Schreibens), speichert Cassandra alle ihre Informationen in die Schema.XML-Verzeichnis. In diesem Verzeichnis gibt es zwei Dateien vor allem, was ich zu bearbeiten: log4j-server.properties und cassandra.yaml. Ich muss auch herauszufinden, wo die Knoten Daten und Protokolle sind zu gehen, so dass ich werde weitermachen und erstellen Sie einfach zwei Unterverzeichnisse der Kassandra-Installationsverzeichnis. Vorausgesetzt Sie Cassandra am C:\Prg\apache-cassandra-1.1.0 installiert haben (wie ich), dann möchten Sie zwei neue Verzeichnisse unterhalb, die man für jeden Knoten zu erstellen, Sie gehen zu erstellen: C:\Prg\apache-Cassandra-1.1.0\node1 und \node2.

Kopieren Sie in diesen zwei Verzeichnissen über den Inhalt des Verzeichnisses Schema.XML Cassandra, die über diese beiden Dateien bringen wird, die Sie brauchen. Möchten Sie auch Kopieren über die cassandra.bat-Datei aus/bin, denn das ist, wo die dritte und Letzte Änderung geschehen, um Cassandra sagen, wo die Konfigurationsdateien braucht sie ausgeführt werden, muss.

Ist nicht dies Java Sachen Spaß?

Die erste Datei, log4j-server.properties, ist eine Konfigurationsdatei für das log4j-Diagnoseprotokollierung open-Source-Projekt. (Java verwendet "Properties" Dateien, ähnlich wie Windows "ini" Dateien wieder in den Tag verwendet.) Hier Ihr Hauptinteresse ist es, sicherzustellen, dass jeder Knoten Cassandra eine diagnostische Log-Datei in einen anderen Ort als den anderen Knoten schreibt. Persönlich möchte ich alle Daten für jeden Knoten in diesen Verzeichnissen \node1 und \node2 zu sein, so möchte ich die Linie innen log4j-server.properties zu finden, die wie folgt lautet:

log4j.Appender.R.file=/var/log/Cassandra/System.log

Dann will ich sie um etwas mehr zu verändern Windows-ish und weitere \node1-ish, wie folgt:

log4j.Appender.R.file=C:/PRG/Apache-Cassandra-1.1.0/Node1/Log/System.log

Das Verzeichnis muss nicht vorhanden sein, bevor Cassandra beginnt — sie werden es schaffen, wenn es nicht vorhanden ist. Übrigens, stellen Sie sicher, dass die Schrägstriche sind nach vorn, dass Schrägstriche hier mich nur auf diesen einen Vertrauen; Es wird funktionieren. (Java erkennt sie, egal, ob sie vorwärts oder umgekehrte Schrägstriche, aber die Eigenschaften-Dateisyntax verwendet umgekehrte Schrägstriche als Escape-Sequenz-Zeichen Art wie wie sie in c# Zeichenfolgen arbeiten.)

Zweitens müssen Sie knacken öffnen Sie die Datei "cassandra.yaml", um den nächsten Satz von Änderungen zu machen. Die Syntax ".yaml" ist "Noch ein anderes Markup Language" und – ja, Sie ahnen es — es ist eine andere .ini-Stil Konfigurationssyntax. Java nie standardisiert, so ist es durchaus üblich, mehrere andere Konfiguration-Stile, die alle zu sehen verbunden zusammen in einem Projekt (wie Cassandra).

Insbesondere müssen Sie einige Einstellungen hier zu ändern; Dies sind die Datei verstreut (die übrigens übersät ist mit Tonnen von Kommentaren, so dass sie wirklich etwas selbsterklärend, wenn Sie über alles lesen):

cluster_name: 'Test Cluster'
data_file_directories:
  - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
listen_address: localhost
rpc_address: localhost

Die "Clustername" ist optional, aber es ist keine schlechte Sache wie auch immer, vielleicht zu etwas wie "MeinCluster" oder "Große Cluster O Spaß." ändern Die restlichen Einstellungen, allerdings müssen geändert werden. Die Einträge "Verzeichnisse" müssen bzw. auf die Verzeichnisse \node1 und \node2 zeigen.

Ein Ring, sie zu finden alle...

Die letzten beiden Einstellungen müssen aus verschiedenen Gründen geändert werden. Erinnern Sie Cassandra, instinktiv will führen als ein Dienst pro Maschine, damit sie davon ausgeht, dass es ist OK nur TCP/IP Socket binden an "Localhost" ein. Aber wenn zwei oder mehr Dienste, die auf der gleichen Box ausgeführt, das geht nicht, zu arbeiten. Sie müssen also ihr binden an Adressen, die in der gleichen Box effektiv aufgelöst werden, obwohl sie möglicherweise unterschiedliche Werte sagen. Glücklicherweise können Sie dies tun, indem man explizit 127.0.0.1 für node1 127.0.0.2 für node2 und So weiter.

(Sie könnten fragen warum dies funktioniert; die Antwort ist, würde den Rahmen dieses Artikels sprengen, aber gute Referenz für TCP/IP sollte in der Lage, es zu erklären. Wenn Sie nicht überzeugt sind, versuchen Sie "Ping 127.0.0.1" und "Ping 127.0.0.2" auf Ihrem Rechner. Beide sollten gut lösen. Wenn Sie nicht mögen, diese Werte angeben, können Sie immer diese Namen in Ihrer "Hosts" Datei im Verzeichnis C:\Windows\System32\drivers\etc zuordnen.)

Einer der Gründe, dass Cassandra dieser Netzwerkkonfiguration ausgearbeitet braucht ist, weil sie geht zu "entdecken" den Ring durch die erste Verbindung zu einem "Saatgut" Knoten, der dann diese Instanz, über die anderen Knoten im Ring sagen wird. All ist dies Teil des Klatsch-Protokolls, die sie verwendet, um wichtige Informationen rund um den Ring zu vermitteln. Wenn wir den Ring einrichten waren, auf verschiedenen Computern ausgeführt, Cassandra müssten die "Samen"-Konfigurationseinstellung zu einem aktiven Knoten, aber in diesem Fall darauf — weil wir alle auf der gleichen Box laufen — Standard 127.0.0.1 funktioniert prima.

Nach all den Änderungen sollte die cassandra.yaml-Datei im \node1 wie folgt aussehen:

cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node1/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node1/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node1/saved_caches
listen_address: localhost
rpc_address: localhost
For \node2, the file should look like this:
cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node2/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node2/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node2/saved_caches
listen_address: 127.0.0.2
rpc_address: 127.0.0.2

Schließlich muss Cassandra erzählt werden, wenn sie startet, wo Dateien, die Konfiguration zu finden und sie tut dies normalerweise durch einen Blick entlang der Java-CLASSPATH (die vage ähnlich dem Montage-Auflösung-Mechanismus in das .NET Framework, sondern über einem halben Jahrzehnt mehr Primitive, stumpf sein). Sie will auch einige Management und Überwachung von Informationen zu JMX (die Java entspricht PerfMon oder Windows-Verwaltungsinstrumentation) über einen TCP/IP Port offen zu legen, und beide Dienste nicht denselben Port verwenden. Daher müssen die letzten Änderungen an cassandra.bat:

REM stellen Sie sicher, dass benutzerdefinierte CLASSPATH-Variablen nicht beim Start verwendet werden
set CLASSPATH="%CASSANDRA_HOME%\node1"

Und für die cassandra.bat in \node2:

REM stellen Sie sicher, dass benutzerdefinierte CLASSPATH-Variablen nicht beim Start verwendet werden
set CLASSPATH="%CASSANDRA_HOME%\node2"

Wie auch die folgende Zeile in \node2:

-Dcom.sun.management.jmxremote.port=7299^

Im Original wird der Port "7199." lesen.

Wie gesagt, dies ist nicht Java Sachen Spaß?

… Und in der Dunkelheit binden

Aber sobald alles Konfiguration aus dem Weg bekommt, der Spaß beginnt. Feuer auf ein Eingabeaufforderungsfenster (eins mit Umgebungsvariablen JAVA_HOME und CASSANDRA_HOME auf die Wurzel des JDK und Cassandra-Installationsverzeichnisse, zeigen nicht vergessen), und wechseln Sie Verzeichnis über das \node1-Verzeichnis, Sie aus Täuschung gewesen habe. "Cassandra -f" an der Eingabeaufforderung, und beobachten die diagnostische Info-Blättern von feuern. Dies ist die erste Instanz, und vorausgesetzt alle Konfigurationseinstellungen sind gut (kein Tippfehler), sollten Sie den Text scrollen und Enden sehen mit "Listening für Sparsamkeit Kunden..."

Nun in einem zweiten Fenster der Eingabeaufforderung, wechseln Sie über zu \node2 und das gleiche tun. Diesmal, wie es bis Brände, Sie sehen auch andere Aktivitäten geschehen in wenigen Minuten im Fenster \node1 — was dort geschieht, ist, dass nach die \node2-Instanz aufsteht und ausgeführt, es verbindet sich mit der \node1-Instanz (der "Samen") und die beiden im wesentlichen einander konfigurieren, um gemeinsam in einem Ring zu starten. Suchen Sie insbesondere die beiden Zeilen "JOINING: Ring und Schemainformationen warten"und"Knoten-/127.0.0.1 ist jetzt Teil des Clusters"werden im Fenster" \node2 ", und"Knoten-/127.0.0.2 ist nun Teil des Clusters"und"InetAddress-/127.0.0.2 ist jetzt "im Fenster \node1.

Aber wenn Sie verpasst haben, sehen diese Nachrichten, Cassandra hat eine weitere Überraschung für Sie auf Lager. In einem dritten Eingabeaufforderungsfenster, gehen Sie zu der ursprünglichen Cassandra \bin Verzeichnis und starten "Nodetool Ring h 127.0.0.1", und Sie sollten sehen, dass so etwas wie Abbildung 1.

Two Cassandra Instances, Each Owning 50 Percent of the Data
Abbildung 1 zwei Cassandra Instanzen, jede besitzende 50 Prozent der Daten

Das ist wirklich spannende Sachen, weil Sie aus der Owns-Spalte sehen, die beiden Cassandra-Instanzen bereits herausgefunden, die jeweils eigenen 50 Prozent der Daten, ohne zusätzliche Konfiguration an Ihrem Teil arbeiten sollte. Sweet!

Der beste Teil ist, wenn Sie den Code aus dem vorherigen Artikel ausführen, werden die Daten über den Cluster ohne zusätzlichen Änderungen verteilt.

Es ist eine Ergänzung, kein Ersatz

Wie einige der anderen Datenbank tools diese Spalte hat erkundet (MongoDB und SQLite), Cassandra sollte nicht als Ersatz für eine relationale Datenbank Großhandel betrachtet werden, sondern als eine ergänzende Technologie, die sein können entweder für Bereiche verwendet, wo das Feature für Set, eine relationale Datenbank passt einfach nicht gut (Zwischenspeichern oder speichern sehr unstrukturierten Daten in den Sinn kommen, zum Beispiel), oder als Hybridsystem in Verbindung mit einer relationalen Datenbank. Beispielsweise kann ein Unternehmen einen "festen" Satz von Datenelementen in einer relationalen Datenbank speichern und beinhalten die relationalen Spalten einen Cassandra-Schlüssel, um die verbleibenden, unstrukturierten Daten abzurufen. Die relationale Datenbank kann dann bleiben, strukturierte und relationale (gehorchen die meisten oder alle Regeln Normal-Form), aber das System insgesamt haben die Flexibilität, zusätzliche unvorhergesehene Datenelemente zu speichern, die Nutzer scheinen immer das System, wie es Alter hinzufügen möchten.

Ein weiteres Beispiel betrachten Sie Webseite Daten getroffen, die würden immer außerhalb der Seite selbst eingegeben werden, doch würde leicht in die Millionen oder Milliarden von Elementen der Daten aufzuspüren. Ein URL-Verkürzung-Service (z. B. bit.ly) wäre hier zu tun, weil der minimierte URL-Pfad (der "Foobar" Teil in http://bit.ly/foobar) wäre der Schlüssel und Daten Statistiken schlagen trivial — sowie eine optionale Beschreibung und vielleicht sogar einen periodischen Snapshot des umgeleiteten URLs — für Cassandra gemacht werden würde. Und so weiter.

Cassandra ist nicht zu übernehmen, das Rechenzentrum jederzeit schnell, noch sollte es. Aber wenn Intelligent verwendet, es ist ein leistungsfähiges neues Werkzeug in der Werkzeugpalette und Entwickler wäre töricht zu ignorieren. Es gibt noch viel mehr über Cassandra zu erkunden, aber es ist Zeit, die Trojanische Prophetin gehen und zu anderem übergehen zu lassen.

Viel Spaß beim Programmieren!

Ted Neward ist Berater für Softwarearchitektur bei Neudesic LLC. Er hat mehr als 100 Artikel geschrieben und hat mehrere Bücher allein und in Zusammenarbeit mit anderen geschrieben, darunter „Professional F# 2.0“ (Wrox 2010). Er ist bekannter Java-Experte und F#-MVP und spricht auf Java und .NET Konferenzen auf der ganzen Welt. Er berät und Mentoren regelmäßig — Sie erreichen ihn unter ted@tedneward.com oder Ted.Neward@neudesic.com Wenn Sie ihn kommen mit Ihrem Team arbeiten möchten. Er Blogs auf blogs.tedneward.com und kann auf Twitter bei twitter.com/tedneward.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Kelly Sommers