Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Waar mogelijk raden we u aan om 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 gebruik van het gossip-protocol van Apache Cassandra om gegevens van uw brondatacenter op een naadloze manier te repliceren naar uw nieuwe datacenter met beheerde exemplaren.
Er zijn mogelijk enkele scenario's waarin de versie van uw brondatabase niet compatibel is of een hybride clusterinstallatie 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 schrijfbewerkingen en Apache Spark. De dual-write-proxy wordt gebruikt om live wijzigingen vast te leggen, terwijl historische gegevens bulksgewijs worden gekopieerd met Apache Spark. De voordelen van deze aanpak zijn:
- Minimale toepassingswijzigingen. De proxy kan verbindingen van uw toepassingscode accepteren met enkele of geen configuratiewijzigingen. Hiermee worden alle aanvragen naar uw brondatabase gerouteerd en worden schrijfbewerkingen asynchroon gerouteerd naar een secundair doel.
- Afhankelijkheid van clientdraadprotocol. Omdat deze benadering niet afhankelijk is van back-endbronnen of interne protocollen, kan deze worden gebruikt met elk bron- of doelsysteem van Cassandra dat het Apache Cassandra-wire-protocol implementeert.
In de volgende afbeelding ziet u de benadering.
Vereisten
Richt een Azure Managed Instance in voor Een Apache Cassandra-cluster met behulp van Azure Portal of de Azure CLI. Zorg ervoor dat u verbinding kunt maken met uw cluster met CQLSH.
Richt een Azure Databricks-account in uw virtuele Cassandra-netwerk in. Zorg ervoor dat het account netwerktoegang heeft tot uw cassandra-broncluster. In dit voorbeeld wordt een Spark-cluster in dit account gemaakt voor het laden van historische gegevens.
Zorg ervoor dat u het keyspace-/tabelschema al hebt gemigreerd van uw Cassandra-brondatabase naar de doeldatabase van een beheerde Cassandra-instantie.
Een Spark-cluster inrichten
U wordt aangeraden Azure Databricks Runtime versie 7.5 te selecteren, die ondersteuning biedt voor Spark 3.0.
Spark-afhankelijkheden toevoegen
U moet de Apache Spark Cassandra Connector-bibliotheek toevoegen aan uw cluster om verbinding te maken met eventuele met wire protocol compatibele Apache Cassandra-eindpunten. Selecteer > toe.
Belangrijk
Als u een vereiste hebt om Apache Cassandra writetime voor elke rij tijdens de migratie te behouden, raden we u aan dit voorbeeld te gebruiken. De jar voor afhankelijkheden in dit voorbeeld bevat ook de Spark-connector, dus installeer deze versie in plaats van de connectorassembly.
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 historische gegevens laden en de bron en het doel valideren.
Selecteer Installeren en start het cluster opnieuw wanneer de installatie is voltooid.
Notitie
Start het Azure Databricks-cluster opnieuw nadat de Cassandra Connector-bibliotheek is geïnstalleerd.
De dual-write-proxy installeren
Voor optimale prestaties tijdens dubbele schrijfbewerkingen raden we u aan de proxy op alle knooppunten in uw broncluster van Cassandra te installeren.
#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 door <target-server> 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 dit door <keystore password> het 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>
Als u de proxy op deze manier start, wordt ervan uitgegaan dat het volgende waar is:
- Bron- en doeleindpunten hebben dezelfde gebruikersnaam en hetzelfde wachtwoord.
- Bron- en doeleindpunten implementeren Secure Sockets Layer (SSL).
Als uw bron- en doeleindpunten niet aan deze criteria kunnen voldoen, leest u verder voor verdere configuratieopties.
SSL configureren
Voor SSL kunt u een bestaand sleutelarchief implementeren, bijvoorbeeld het sleutelarchief dat door uw broncluster wordt gebruikt, of een zelfondertekend 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 doeleindpunten als ze geen SSL implementeren. Gebruik de --disable-source-tls of --disable-target-tls vlaggen:
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 sleutelopslag en hetzelfde wachtwoord gebruikt als het wachtwoord dat wordt gebruikt voor de proxy voor dubbele schrijfbewerkingen wanneer u SSL-verbindingen bouwt met de database die gebruikmaakt van 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, gaat dit proces ervan uit dat de bron- en doelreferenties hetzelfde zijn. Indien nodig kunt u een andere gebruikersnaam en een ander wachtwoord opgeven voor het Cassandra-doeleindpunt wanneer u de proxy start:
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 het cassandra-broneindpunt wordt uitgevoerd op een andere poort, kunt --source-port u een ander poortnummer opgeven of --target-port opgeven:
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 extern implementeren
Mogelijk wilt u de proxy niet installeren op de clusterknooppunten zelf. U wilt deze installeren op een afzonderlijke computer. Geef in dat scenario het IP-adres op van <source-server>:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Waarschuwing
Mogelijk wilt u de proxy extern uitvoeren op een afzonderlijke computer in plaats van deze uit te voeren op alle knooppunten in uw Apache Cassandra-broncluster. Zo ja, dan raden we u aan om de proxy te implementeren op hetzelfde aantal computers als knooppunten in uw cluster. Stel een vervanging in voor hun IP-adressen in system.peers. Gebruik deze configuratie in de proxy. Als u deze methode niet gebruikt, kan dit van invloed zijn op de prestaties terwijl de livemigratie plaatsvindt, omdat het clientstuurprogramma geen verbindingen kan openen met alle knooppunten in het cluster.
Wijzigingen in toepassingscode nul toestaan
Standaard luistert de proxy op poort 29042. U moet de toepassingscode wijzigen zodat deze naar deze poort verwijst. U kunt ook de poort wijzigen waarop de proxy luistert. U kunt deze methode gebruiken als u codewijzigingen op toepassingsniveau wilt elimineren door:
- Als de Cassandra-bronserver op een andere poort wordt uitgevoerd.
- De proxy wordt uitgevoerd op de standaard Cassandra-poort 9042.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Notitie
Het installeren van de proxy op clusterknooppunten vereist geen herstart van de knooppunten. Als u veel toepassingsclients hebt en de proxy liever uitvoert op de standaard Cassandra-poort 9042 om codewijzigingen op toepassingsniveau te elimineren, wijzigt u de standaardpoort van Apache Cassandra. Vervolgens moet u de knooppunten in uw cluster opnieuw opstarten en de bronpoort configureren als de nieuwe poort die u hebt gedefinieerd voor uw bron-Cassandra-cluster.
In het volgende voorbeeld wijzigen we het Cassandra-broncluster zodat het wordt 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 afdwingen
De proxy heeft functionaliteit om protocollen af te dwingen. Dit kan nodig zijn als het broneindpunt geavanceerder is dan het doel of anderszins niet wordt ondersteund. In dat geval kunt u het protocol opgeven --protocol-version en --cql-version afdwingen dat het voldoet aan het doel:
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, wijzigt u de poort op de toepassingsclient en start u deze opnieuw. Of wijzig de Cassandra-poort en start het cluster opnieuw op als u die aanpak hebt gekozen. De proxy begint met het doorsturen van schrijfbewerkingen naar het doeleindpunt. 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 uw bron- en doelconfiguraties van Cassandra door de bijbehorende referenties en vervang de bron- en doelsleutelruimten en -tabellen. Voeg indien nodig meer variabelen toe voor elke tabel aan het volgende voorbeeld en voer deze uit. Nadat uw toepassing aanvragen naar de proxy voor dubbele schrijfbewerkingen verzendt, 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 timestamp wordt deze ingesteld op de huidige tijd voordat alle gegevens in de brontabel worden gelezen.
writetime Vervolgens wordt deze backdated tijdstempel ingesteld. Deze aanpak zorgt ervoor dat records die zijn geschreven vanuit de historische gegevensinvoer naar het doeleindpunt, geen updates kunnen overschrijven die worden geleverd met een latere tijdstempel van de dual-write proxy terwijl historische gegevens worden gelezen.
Belangrijk
Als u om welke reden dan ook exacte tijdstempels wilt behouden, moet u een historische gegevensmigratiebenadering gebruiken die tijdstempels behoudt, zoals dit voorbeeld. Het JAR-bestand voor afhankelijkheden in het voorbeeld bevat ook de Spark-connector, dus u hoeft de Spark-connector-assembly die in de eerdere vereisten wordt vermeld, 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 gesynchroniseerd zijn en klaar zijn voor cutover. We raden u aan om de bron en het doel te valideren om ervoor te zorgen dat deze overeenkomen voordat u definitief overstapt.
Notitie
Als u het cassandra-migratievoorbeeld hebt gebruikt dat in de vorige secties is genoemd voor behoud writetime, hebt u de mogelijkheid om de migratie te valideren door rijen in de bron en het doel te vergelijken op basis van bepaalde toleranties.