Livemigratie naar Azure Managed Instance voor Apache Cassandra met behulp van een dual-write proxy

Waar mogelijk wordt u aangeraden de systeemeigen Apache Cassandra-mogelijkheid te gebruiken om gegevens van uw bestaande cluster te migreren naar Azure Managed Instance voor Apache Cassandra door een hybride cluster te configureren. Deze mogelijkheid maakt op een naadloze manier gebruik van het protocol van Apache Cassandra om gegevens van uw brondatacenter te repliceren naar uw nieuwe beheerde-exemplaardatacenter. Er kunnen echter enkele scenario's zijn waarin de versie van uw brondatabase niet compatibel is, of als het instellen van een hybride cluster anders niet haalbaar is.

In deze zelfstudie wordt beschreven hoe u gegevens live migreert naar Azure Managed Instance voor Apache Cassandra met behulp van een proxy voor dubbele schrijf Apache Spark. De dual-write proxy wordt gebruikt om live wijzigingen vast te leggen, terwijl historische gegevens bulksgewijs worden gekopieerd met behulp van Apache Spark. De voordelen van deze benadering zijn:

  • Minimale toepassingswijzigingen. De proxy kan verbindingen van uw toepassingscode accepteren met weinig of geen configuratiewijzigingen. Alle aanvragen worden doorgeleid naar uw brondatabase en asynchroon schrijf schrijfgegevens worden gerouteerd naar een secundair doel.
  • Afhankelijkheid van client wire-protocol. Omdat deze benadering niet afhankelijk is van back-endresources of interne protocollen, kan deze worden gebruikt met elk bron- of doel-Cassandra-systeem dat het Apache Cassandra-wire-protocol implementeert.

In de volgende afbeelding ziet u de aanpak.

Animatie van de livemigratie van gegevens naar Azure Managed Instance voor Apache Cassandra.

Vereisten

Een Spark-cluster inrichten

U wordt aangeraden Azure Databricks runtimeversie 7.5 te selecteren, die ondersteuning biedt voor Spark 3.0.

Schermopname van het vinden van Azure Databricks runtime-versie.

Spark-afhankelijkheden toevoegen

U moet de bibliotheek Apache Spark Cassandra Connector toevoegen aan uw cluster om verbinding te maken met elk wire-protocol compatibele Apache Cassandra-eindpunten. Selecteer in uw cluster Bibliotheken > Nieuwe > Maven installeren en voeg vervolgens com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 Maven-coördinaten toe.

Belangrijk

Als u tijdens de migratie een vereiste hebt om Apache Cassandra te behouden voor elke rij, raden writetime we u aan dit voorbeeld te gebruiken. De afhankelijkheids-JAR in dit voorbeeld bevat ook de Spark-connector. U moet deze dus installeren in plaats van de bovenstaande connector-assembly. Dit voorbeeld is ook handig als u een rijvergelijkingsvalidatie tussen bron en doel wilt uitvoeren nadat het laden van historische gegevens is voltooid. Zie de secties' Voer het laden van historische gegevens uit'envalideerde bron en het doel hieronder voor meer informatie.

Schermopname van het zoeken naar Maven-pakketten in Azure Databricks.

Selecteer Installeren en start het cluster opnieuw wanneer de installatie is voltooid.

Notitie

Zorg ervoor dat u het cluster Azure Databricks opnieuw opstart nadat de Cassandra Connector-bibliotheek is geïnstalleerd.

De dual-write-proxy installeren

Voor optimale prestaties tijdens dubbele schrijfingen raden we u aan de proxy te installeren op alle knooppunten in uw Cassandra-broncluster.

#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

De dual-write-proxy starten

U wordt aangeraden de proxy te installeren op alle knooppunten in uw Cassandra-broncluster. Voer minimaal de volgende opdracht uit om de proxy op elk knooppunt te starten. Vervang <target-server> door een IP- of serveradres van een van de knooppunten in het doelcluster. Vervang <path to JKS file> door het pad naar een lokaal JKS-bestand en vervang door het <keystore password> bijbehorende wachtwoord.

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>

Bij het op deze manier starten van de proxy wordt ervan uitgenomen dat het volgende waar is:

  • Bron- en doel-eindpunten hebben dezelfde gebruikersnaam en hetzelfde wachtwoord.
  • Bron- en doel-eindpunten implementeren Secure Sockets Layer (SSL).

Als uw bron- en doel-eindpunten niet aan deze criteria kunnen voldoen, leest u verder voor meer configuratieopties.

SSL configureren

Voor SSL kunt u een bestaand keystore implementeren (bijvoorbeeld het certificaat dat door uw broncluster wordt gebruikt) of een zelf-ondertekend certificaat maken met behulp van keytool :

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

U kunt SSL ook uitschakelen voor bron- of doel-eindpunten als deze geen SSL implementeren. Gebruik de --disable-source-tls vlaggen of --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 

Notitie

Zorg ervoor dat uw clienttoepassing dezelfde sleutelstore en hetzelfde wachtwoord gebruikt als de clienttoepassing die wordt gebruikt voor de proxy voor dubbel schrijven wanneer u SSL-verbindingen met de database bouwt via de proxy.

De referenties en poort configureren

Standaard worden de bronreferenties doorgegeven vanuit uw client-app. De proxy gebruikt de referenties voor het maken van verbindingen met de bron- en doelclusters. Zoals eerder vermeld, wordt in dit proces ervan uitgenomen dat de bron- en doelreferenties hetzelfde zijn. Indien nodig kunt u een andere gebruikersnaam en een ander wachtwoord voor het Cassandra-doel-eindpunt afzonderlijk opgeven bij het starten van de proxy:

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>

De standaardbron- en doelpoorten, indien niet opgegeven, zijn 9042. Als het doel- of bron-Cassandra-eindpunt wordt uitgevoerd op een andere poort, kunt u of gebruiken om --source-port --target-port een ander poortnummer op te geven:

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>

De proxy op afstand implementeren

Er kunnen omstandigheden zijn waarin u de proxy niet wilt installeren op de clusterknooppunten zelf en u liever op een afzonderlijke computer installeert. In dat scenario moet u het IP-adres van <source-server> opgeven:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>

Waarschuwing

Het op afstand installeren en uitvoeren van de proxy op een afzonderlijke computer (in plaats van deze uit te laten uitvoeren op alle knooppunten in uw Apache Cassandra-broncluster) heeft invloed op de prestaties tijdens de livemigratie. Hoewel het functioneel werkt, kan het client-stuurprogramma geen verbindingen openen met alle knooppunten in het cluster en is het afhankelijk van één coördinatorknooppunt (waar de proxy is geïnstalleerd) om verbindingen te maken.

Geen wijzigingen in toepassingscode toestaan

De proxy luistert standaard op poort 29042. De toepassingscode moet worden gewijzigd om naar deze poort te wijzen. U kunt echter de poort wijzigen waar de proxy naar luistert. U kunt dit doen als u codewijzigingen op toepassingsniveau wilt elimineren door:

  • De Cassandra-bronserver uitvoeren op een andere poort.
  • De proxy uitvoeren op de standaard Cassandra-poort 9042.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042

Notitie

Als u de proxy op clusterknooppunten installeert, hoeft u de knooppunten niet opnieuw op te starten. Als u echter veel toepassings-clients hebt en de proxy liever wilt uitvoeren op de standaard Cassandra-poort 9042 om eventuele codewijzigingen op toepassingsniveau te elimineren, moet u de standaardpoort van Apache Cassandra wijzigen. Vervolgens moet u de knooppunten in uw cluster opnieuw opstarten en de bronpoort configureren als de nieuwe poort die u hebt gedefinieerd voor uw Cassandra-broncluster.

In het volgende voorbeeld wijzigen we het Cassandra-broncluster om te worden uitgevoerd op poort 3074 en starten we het cluster op poort 9042:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042 --source-port 3074

Protocollen forcen

De proxy heeft functionaliteit om protocollen af te dwingen. Dit kan nodig zijn als het bron-eindpunt geavanceerder is dan het doel of anderszins niet wordt ondersteund. In dat geval kunt u en opgeven om af te dwingen --protocol-version dat het protocol aan het doel --cql-version voldoet:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --protocol-version 4 --cql-version 3.11

Nadat de dual-write proxy wordt uitgevoerd, moet u de poort op uw toepassingsclient wijzigen en opnieuw opstarten. (Of wijzig de Cassandra-poort en start het cluster opnieuw op als u die benadering hebt gekozen.) De proxy begint vervolgens met het doorsturen van schrijf schrijfingen naar het doel-eindpunt. Meer informatie over bewaking en metrische gegevens die beschikbaar zijn in het proxyhulpprogramma.

Het laden van historische gegevens uitvoeren

Als u de gegevens wilt laden, maakt u een Scala-notebook in uw Azure Databricks account. Vervang de cassandra-bron- en doelconfiguraties door de bijbehorende referenties en vervang de bron- en doelsleutelruimten en -tabellen. Voeg meer variabelen toe voor elke tabel, zoals vereist voor het volgende voorbeeld, en voer vervolgens uit. Nadat uw toepassing begint met het verzenden van aanvragen naar de dual-write proxy, bent u klaar om historische gegevens te migreren.

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

Notitie

In het voorgaande Scala-voorbeeld ziet u dat wordt ingesteld op de huidige tijd voordat u alle gegevens timestamp in de brontabel leest. Vervolgens wordt writetime ingesteld op dit tijdstempel met back-to-time. Dit zorgt ervoor dat records die zijn geschreven van de historische gegevensbelasting naar het doel-eindpunt, geen updates kunnen overschrijven die worden geleverd met een later tijdstempel van de proxy voor dubbele schrijfgegevens terwijl historische gegevens worden gelezen.

Belangrijk

Als u om welke reden dan ook exacte tijdstempels wilt behouden, moet u een historische benadering voor gegevensmigratie gebruiken die tijdstempels behoudt,zoals in dit voorbeeld. De afhankelijkheids-JAR in het voorbeeld bevat ook de Spark-connector, dus u hoeft de Spark-connector-assembly die in de eerdere vereisten is genoemd niet te installeren. Als beide zijn geïnstalleerd in uw Spark-cluster, ontstaan er conflicten.

De bron en het doel valideren

Nadat het laden van historische gegevens is voltooid, moeten uw databases zijn gesynchroniseerd en gereed zijn voor cutover. We raden u echter aan om de bron en het doel te valideren om er zeker van te zijn dat ze overeenkomen voordat u uiteindelijk oversnijdt.

Notitie

Als u het bovenstaande cassandra migrator-voorbeeld hebt gebruikt voor het behouden van , omvat dit de mogelijkheid om de migratie te valideren door rijen in de bron en het doel te vergelijken op basis van bepaalde writetime toleranties.

Volgende stappen