Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Suchen Sie nach einer Datenbanklösung für hochskalige Szenarien mit einer Vereinbarung über verfügbarkeitsbasierte Servicelevels (Service Level Agreement, SLA) von 99,999% Verfügbarkeit, sofortige Automatische Skalierung und automatisches Failover über mehrere Regionen hinweg? Betrachten Sie Azure Cosmos DB für NoSQL.
Möchten Sie eine vorhandene Apache Cassandra-Anwendung migrieren? Betrachten Sie die von Azure verwaltete Instanz für Apache Cassandra.
API für Cassandra in Azure Cosmos DB ist eine großartige Wahl für Enterprise-Workloads, die aus verschiedenen Gründen auf Apache Cassandra ausgeführt werden:
- Kein Aufwand für die Verwaltung und Überwachung: Dadurch wird der Aufwand für die Verwaltung und Überwachung einer Vielzahl von Einstellungen auf allen Betriebssystemen, virtuellen Java-Computern und Yaml-Dateien und deren Interaktionen beseitigt.
- Erhebliche Kosteneinsparungen: Sie können Kosten mit Azure Cosmos DB sparen, einschließlich der Kosten für virtuelle Computer, Bandbreite und alle anwendbaren Lizenzen. Sie müssen die Rechenzentren, Server, SSD-Speicher, Netzwerk- und Stromkosten nicht verwalten.
- Möglichkeit zur Verwendung von vorhandenem Code und vorhandenen Tools: Azure Cosmos DB bietet auf der Verbindungsprotokollebene Kompatibilität mit bestehenden Cassandra-SDKs und -Tools. Durch diese Kompatibilität ist sichergestellt, dass Sie die vorhandene Codebasis mit Azure Cosmos DB for Apache Cassandra mit nur geringfügigen Änderungen verwenden können.
Azure Cosmos DB unterstützt nicht das native Apache Cassandra Gossip-Protokoll für die Replikation. Wenn keine Ausfallzeiten für die Migration erforderlich sind, ist ein anderer Ansatz erforderlich. In diesem Tutorial wird beschrieben, wie Sie Daten live mithilfe eines Proxys für duales Schreiben und von Apache Spark aus einem nativen Apache Cassandra-Cluster in Azure Cosmos DB for Apache Cassandra migrieren.
Die Vorgehensweise ist in der folgenden Abbildung dargestellt. Der Dual-Write-Proxy wird verwendet, um Liveänderungen zu erfassen. Historische Daten werden mithilfe von Apache Spark in Massen kopiert. Damit der Proxy Verbindungen von Ihrem Anwendungscode akzeptiert, sind wenig bis keine Konfigurationsänderungen nötig. Sie leitet alle Anforderungen an Ihre Quelldatenbank weiter und leitet Schreibvorgänge asynchron an die API für Cassandra weiter, während der Massenkopiervorgang läuft.
Voraussetzungen
- Stellen Sie ein Azure Cosmos DB for Apache Cassandra-Konto bereit.
- Überprüfen Sie die Grundlagen der Verbindung mit Azure Cosmos DB for Apache Cassandra.
- Überprüfen Sie die in Azure Cosmos DB for Apache Cassandra unterstützten Features, um die Kompatibilität sicherzustellen.
- Verwenden Sie cqlsh für die Überprüfung.
- Stellen Sie sicher, dass Netzwerkkonnektivität zwischen Ihrem Quellcluster und dem API für Cassandra-Zielendpunkt besteht.
- Stellen Sie sicher, dass Sie zuvor das Keyspace-/Tabellenschema aus Ihrer Cassandra-Quelldatenbank zu Ihrer Ziel-API für Ihr Cassandra-Konto migriert haben.
Wichtig
Wenn Sie bei der Migration die Anforderung haben, Apache Cassandra writetime zu behalten, müssen beim Erstellen von Tabellen die folgenden Kennzeichen festgelegt werden:
with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true
Beispiel:
CREATE KEYSPACE IF NOT EXISTS migrationkeyspace WITH REPLICATION= {'class': 'org.apache.> cassandra.locator.SimpleStrategy', 'replication_factor' : '1'};
CREATE TABLE IF NOT EXISTS migrationkeyspace.users (
name text,
userID int,
address text,
phone int,
PRIMARY KEY ((name), userID)) with cosmosdb_cell_level_timestamp=true and > cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true;
Bereitstellen eines Spark-Clusters
Es wird empfohlen, Azure Databricks zu verwenden. Verwenden Sie eine Laufzeit, die Spark 3.0 oder höher unterstützt.
Wichtig
Sie müssen sicherstellen, dass Ihr Azure Databricks-Konto über Netzwerkkonnektivität mit Ihrem Apache Cassandra-Quellencluster verfügt. Für dieses Setup ist möglicherweise eine Einfügung des virtuellen Netzwerks erforderlich. Weitere Informationen finden Sie unter Bereitstellen von Azure Databricks in Ihrem virtuellen Azure-Netzwerk.
Hinzufügen von Spark-Abhängigkeiten
Fügen Sie dem Cluster die Apache Spark-Cassandra-Connectorbibliothek hinzu, um eine Verbindung mit nativen und Azure Cosmos DB-Cassandra-Endpunkten herzustellen. Wählen Sie in Ihrem Cluster Bibliotheken>Neue>Maveninstallieren und fügen Sie dann com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 in Maven-Koordinaten hinzu.
Wichtig
Wenn Sie die Anforderung haben, Apache Cassandra writetime für jede Zeile während der Migration zu erhalten, empfehlen wir dieses Beispiel zu benutzen. Die Abhängigkeits-JAR in diesem Beispiel enthält auch den Spark-Connector, daher sollten Sie diese Version anstelle der zuvor beschriebenen Konnektorassembly installieren.
Dieses Beispiel ist auch nützlich, wenn Sie eine Zeilenvergleichsvalidierung zwischen Quelle und Ziel durchführen möchten, nachdem das Laden der Verlaufsdaten abgeschlossen ist. Weitere Informationen finden Sie unter Ausführen des Ladens der historischen Daten und Überprüfen der Quelle und des Ziels.
Wählen Sie Installieren aus, und starten Sie den Cluster nach Abschluss der Installation neu.
Hinweis
Stellen Sie sicher, dass Sie den Azure Databricks-Cluster neu starten, nachdem die Cassandra-Connectorbibliothek installiert wurde.
Installieren Sie den Proxy für duales Schreiben.
Für eine optimale Leistung bei dualen Schreibvorgängen empfehlen wir, den Proxy auf allen Knoten in Ihrem Quell-Cassandra-Cluster zu installieren.
#assuming you do not have git already installed
sudo apt-get install git
#assuming you do not have maven already installed
sudo apt install maven
#clone repo for dual-write proxy
git clone https://github.com/Azure-Samples/cassandra-proxy.git
#change directory
cd cassandra-proxy
#compile the proxy
mvn package
Starten eines Proxys für duales Schreiben
Es wird empfohlen, den Proxy auf allen Knoten in Ihrem Cassandra-Quellcluster zu installieren. Führen Sie mindestens den folgenden Befehl aus, um den Proxy auf allen Knoten zu starten. Ersetzen Sie <target-server> durch eine IP- oder Serveradresse eines der Knoten im Zielcluster. Ersetzen Sie <path to JKS file> durch den Pfad zu einer lokalen .jks-Datei und <keystore password> durch das entsprechende Kennwort.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar localhost <target-server> --proxy-jks-file <path to JKS file> --proxy-jks-password <keystore password>
Wenn Sie den Proxy auf diese Weise starten, muss Folgendes zutreffen:
- Quell- und Zielendpunkte besitzen denselben Benutzernamen und dasselbe Kennwort.
- Quell- und Zielendpunkte implementieren Secure Sockets Layer (SSL).
Wenn Ihre Quell- und Zielendpunkte diese Kriterien nicht erfüllen können, finden Sie nachfolgend weitere Konfigurationsoptionen.
Konfigurieren von SSL
Bei SSL können Sie entweder einen vorhandenen Schlüsselspeicher verwenden, z. B. den von Ihrem Quellcluster verwendeten, oder ein selbstsigniertes Zertifikat mithilfe von keytool erstellen.
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Wenn die Quell- oder Zielendpunkte SSL nicht implementieren, können Sie dieses auch deaktivieren. Verwenden Sie hierzu die Flags --disable-source-tls oder --disable-target-tls:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar localhost <target-server> \
--source-port 9042 --target-port 10350 --proxy-jks-file <path to JKS file> \
--proxy-jks-password <keystore password> --target-username <username> \
--target-password <password> --disable-source-tls true --disable-target-tls true
Hinweis
Stellen Sie sicher, dass Ihre Clientanwendung denselben Schlüsselspeicher und dasselbe Kennwort wie die für den Dual-Write-Proxy verwendeten verwendet, wenn Sie SSL-Verbindungen mit der Datenbank über den Proxy erstellen.
Konfigurieren der Anmeldeinformationen und des Ports
Standardmäßig übergibt Ihre Client-App die Quellanmeldeinformationen. Der Proxy verwendet die Anmeldeinformationen, um Verbindungen mit den Quell- und Zielclustern herzustellen. Wie bereits erwähnt, wird bei diesem Prozess davon ausgegangen, dass die Quell- und Zielanmeldeinformationen identisch sind. Sie müssen beim Starten des Proxys für die Ziel-API des Cassandra-Endpunkts einen anderen Benutzernamen und ein anderes Kennwort getrennt angeben.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar localhost <target-server> \
--proxy-jks-file <path to JKS file> --proxy-jks-password <keystore password> \
--target-username <username> --target-password <password>
Der voreingestellte Wert für die Quell- und Zielports, wenn nicht angegeben, ist 9042. In diesem Fall wird DIE API für Cassandra auf Port 10350ausgeführt. Verwenden Sie --source-port oder --target-port, um Portnummern anzugeben.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar localhost <target-server> \
--source-port 9042 --target-port 10350 --proxy-jks-file <path to JKS file> \
--proxy-jks-password <keystore password> --target-username <username> --target-password <password>
Remote-Bereitstellung des Proxymoduls
Es kann Situationen geben, in denen Sie den Proxy nicht selbst auf den Clusterknoten installieren möchten. Möglicherweise möchten Sie es auf einem separaten Computer installieren. Geben Sie in diesem Szenario die IP-Adresse von <source-server>:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Warnung
Wenn Sie den Proxy remote auf einem separaten Computer installieren und ausführen, anstatt ihn auf allen Knoten in Ihrem Quell-Apache Cassandra-Cluster auszuführen, wirkt sich dies auf die Leistung aus, während die Livemigration erfolgt. Während diese Konfiguration funktionsfähig ist, kann der Clienttreiber keine Verbindungen mit allen Knoten innerhalb des Clusters öffnen. Der Client basiert auf dem einzelnen Koordinatorknoten, auf dem der Proxy installiert ist, um Verbindungen herzustellen.
Keine Änderungen am Anwendungscode zulassen
Der Proxy lauscht standardmäßig an Port 29042. Ändern Sie den Anwendungscode so, dass er auf diesen Port verweist. Sie können stattdessen den Port ändern, auf den der Proxy lauscht. Sie können diese Änderung vornehmen, wenn Sie Codeänderungen auf Anwendungsebene beseitigen möchten, indem Sie:
- Das Ausführen des Cassandra-Quellservers auf einem anderen Port.
- den Proxy auf dem Cassandra-Standardport 9042 ausführen.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Hinweis
Für die Installation des Proxys auf Clusterknoten ist kein Neustart der Knoten erforderlich. Wenn Sie über viele Anwendungsclients verfügen und den Proxy lieber auf dem Standardmäßigen Cassandra-Port 9042 ausführen möchten, um Codeänderungen auf Anwendungsebene zu beseitigen, ändern Sie den Apache Cassandra-Standardport. Anschließend müssen Sie die Knoten in Ihrem Cluster neu starten und den Quellport so konfigurieren, dass es sich um den neuen Port handeln soll, den Sie für Den Cassandra-Quellcluster definiert haben.
Im folgenden Beispiel ändern wir den Cassandra-Quellcluster so, dass er auf dem Port 3074 ausgeführt wird, und wir starten den Cluster auf Port 9042:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server \
--proxy-port 9042 --source-port 3074
Erzwingen von Protokollen
Der Proxy kann Protokolle erzwingen, die möglicherweise erforderlich sind, wenn der Quellendpunkt moderner ist als der Zielendpunkt, oder wenn der Quellendpunkt anderweitig nicht unterstützt wird. In diesem Fall können Sie --protocol-version und --cql-version festlegen, um die Übereinstimmung des Protokolls mit dem Zielendpunkt zu erzwingen:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server \
--protocol-version 4 --cql-version 3.11
Nachdem der Dual-Write-Proxy ausgeführt wurde, müssen Sie den Port auf dem Anwendungsclient ändern und neu starten. Oder ändern Sie den Cassandra-Port, und starten Sie den Cluster neu, wenn Sie diesen Ansatz auswählen. Der Proxy startet die Weiterleitung von Schreibvorgängen an den Zielendpunkt. Weitere Informationen finden Sie unter Überwachung und Metriken.
Starten Sie den Verlaufsdaten-Ladevorgang
Erstellen Sie zum Laden der Daten ein Scala-Notebook in Ihrem Azure Databricks-Konto. Ersetzen Sie Ihre Quell- und Zielkonfigurationen für Cassandra durch die entsprechenden Anmeldeinformationen sowie die Quell-und Zielkeyspaces und -tabellen. Fügen Sie im folgenden Beispiel nach Bedarf für jede Tabelle weitere Variablen hinzu, und führen Sie den Code anschließend aus. Nachdem Ihre Anwendung mit dem Senden von Anfragen an den Proxy für duales Schreiben begonnen hat, können Sie die historischen Daten migrieren.
Wichtig
Bevor Sie die Daten migrieren, erhöhen Sie den Containerdurchsatz auf die Menge, die für ihre Anwendung erforderlich ist, um schnell zu migrieren. Durch die Skalierung des Durchsatzes vor dem Starten der Migration können Sie Ihre Daten in kürzerer Zeit migrieren. Zum Schutz vor einer Ratenbegrenzung während des Ladens historischer Daten können Sie in der API für Cassandra serverseitige Wiederholungen (Server-Side Retries, SSR) aktivieren. Anweisungen zum Aktivieren von SSR und weiteren Informationen finden Sie unter "Verhindern von Fehlern beim Einschränken von Raten für Azure Cosmos DB für Apache Cassandra-Vorgänge".
import com.datastax.spark.connector._
import com.datastax.spark.connector.cql._
import org.apache.spark.SparkContext
// source cassandra configs
val sourceCassandra = Map(
"spark.cassandra.connection.host" -> "<Source Cassandra Host>",
"spark.cassandra.connection.port" -> "9042",
"spark.cassandra.auth.username" -> "<USERNAME>",
"spark.cassandra.auth.password" -> "<PASSWORD>",
"spark.cassandra.connection.ssl.enabled" -> "true",
"keyspace" -> "<KEYSPACE>",
"table" -> "<TABLE>"
)
//target cassandra configs
val targetCassandra = Map(
"spark.cassandra.connection.host" -> "<Source Cassandra Host>",
"spark.cassandra.connection.port" -> "10350",
"spark.cassandra.auth.username" -> "<USERNAME>",
"spark.cassandra.auth.password" -> "<PASSWORD>",
"spark.cassandra.connection.ssl.enabled" -> "true",
"keyspace" -> "<KEYSPACE>",
"table" -> "<TABLE>",
//throughput related settings below - tweak these depending on data volumes.
"spark.cassandra.output.batch.size.rows"-> "1",
"spark.cassandra.output.concurrent.writes" -> "1000",
"spark.cassandra.connection.remoteConnectionsPerExecutor" -> "1",
"spark.cassandra.concurrent.reads" -> "512",
"spark.cassandra.output.batch.grouping.buffer.size" -> "1000",
"spark.cassandra.connection.keep_alive_ms" -> "600000000"
)
//set timestamp to ensure it is before read job starts
val timestamp: Long = System.currentTimeMillis / 1000
//Read from source Cassandra
val DFfromSourceCassandra = sqlContext
.read
.format("org.apache.spark.sql.cassandra")
.options(sourceCassandra)
.load
//Write to target Cassandra
DFfromSourceCassandra
.write
.format("org.apache.spark.sql.cassandra")
.options(targetCassandra)
.option("writetime", timestamp)
.mode(SaveMode.Append)
.save
Hinweis
Im vorherigen Scala-Beispiel stellen Sie fest, dass timestamp vor dem Lesen aller Daten in der Quelltabelle auf die aktuelle Uhrzeit festgelegt wird. Dann wird writetime auf diesen rückdatierten Zeitstempel festgelegt. Durch diesen Ansatz wird sichergestellt, dass Datensätze, die aus den Verlaufsdaten auf den Zielendpunkt geschrieben werden, keine Updates mit einem späteren Zeitstempel aus dem Proxy für duales Schreiben überschreiben können, während die Verlaufsdaten gelesen werden.
Wichtig
Falls Sie jedoch die genauen Zeitstempel beibehalten müssen, sollten Sie die Verlaufsdaten auf eine Weise migrieren, bei der die Zeitstempel beibehalten werden, wie etwa in diesem Beispiel. Die Abhängigkeits-JAR im Beispiel enthält auch den Spark-Connector, sodass Sie die Spark-Connectorassembly, die in den früheren Voraussetzungen erwähnt wurde, nicht installieren müssen. Wenn beide in Ihrem Spark-Cluster installiert sind, treten Konflikte auf.
Überprüfen der Quelle und des Ziels
Nachdem die historische Datenladung abgeschlossen ist, sollten Ihre Datenbanken synchronisiert und bereit für den Umstieg sein. Vor der endgültigen Übernahme wird eine Überprüfung der Quelle und des Ziels empfohlen, um sicherzustellen, dass beide übereinstimmen.
Hinweis
Wenn Sie das zuvor erwähnte Cassandra-Migrationsbeispiel zur Erhaltung writetimeverwendet haben, enthält dieses Beispiel die Möglichkeit, die Migration zu überprüfen , indem Zeilen in Quelle und Ziel anhand bestimmter Toleranzen verglichen werden.