Migrace dat z Apache Cassandry za provozu do služby Azure Cosmos DB pro Apache Cassandra pomocí proxy serveru se dvěma zápisy a Apache Sparku
Rozhraní API pro Cassandra ve službě Azure Cosmos DB se stalo skvělou volbou pro podnikové úlohy běžící na Apache Cassandře z různých důvodů, jako jsou:
Žádné režijní náklady na správu a monitorování: Eliminuje režijní náklady na správu a monitorování nesčetných nastavení v souborech OS, JVM a yaml a jejich interakcích.
Významné úspory nákladů: Díky službě Azure Cosmos DB můžete ušetřit náklady, které zahrnují náklady na virtuální počítače, šířku pásma a všechny příslušné licence. Navíc nemusíte spravovat datacentra, servery, úložiště SSD, sítě a náklady na elektřinu.
Schopnost používat existující kód a nástroje: Azure Cosmos DB poskytuje kompatibilitu na úrovni přenosového protokolu se stávajícími sadami SDK a nástroji Cassandra. Tato kompatibilita zajišťuje, že můžete používat stávající základ kódu se službou Azure Cosmos DB for Apache Cassandra s triviálními změnami.
Azure Cosmos DB nepodporuje nativní protokol Apache Cassandra gossip pro replikaci. Proto tam, kde je nulový výpadek požadavkem pro migraci, je nutný jiný přístup. Tento kurz popisuje, jak za provozu migrovat data do služby Azure Cosmos DB for Apache Cassandra z nativního clusteru Apache Cassandra pomocí proxy serveru se dvěma zápisy a Apache Sparku.
Následující obrázek znázorňuje tento vzor. Proxy server se dvěma zápisy se používá k zachycení živých změn, zatímco historická data se kopírují hromadně pomocí Apache Sparku. Proxy server může přijímat připojení z kódu aplikace s několika změnami konfigurace nebo bez nich. Bude směrovat všechny požadavky do zdrojové databáze a asynchronně směrovat zápisy do rozhraní API pro Cassandra, zatímco probíhá hromadné kopírování.
Požadavky
Projděte si základy připojení ke službě Azure Cosmos DB for Apache Cassandra.
Projděte si podporované funkce ve službě Azure Cosmos DB pro Apache Cassandra , abyste zajistili kompatibilitu.
Ujistěte se, že máte síťové připojení mezi zdrojovým clusterem a cílovým koncovým bodem rozhraní API pro Cassandra.
Ujistěte se, že jste již migrovali schéma prostoru klíčů a tabulek ze zdrojové databáze Cassandra do cílového účtu rozhraní API pro Cassandra.
Důležité
Pokud máte požadavek na zachování Apache Cassandry
writetime
během migrace, musí být při vytváření tabulek nastaveny následující příznaky:with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true
Příklad:
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;
Zřízení clusteru Spark
Doporučujeme Azure Databricks. Použijte modul runtime, který podporuje Spark 3.0 nebo vyšší.
Důležité
Musíte zajistit, aby váš účet Azure Databricks byl připojen k síti se zdrojovým clusterem Apache Cassandra. To může vyžadovat injektáž virtuální sítě. Další informace najdete v tomto článku.
Přidání závislostí Sparku
Abyste se mohli připojit k nativním koncovým bodům Cassandra i k nativním koncovým bodům Cassandra služby Azure Cosmos DB, musíte do clusteru přidat knihovnu konektoru Apache Spark Cassandra. V clusteru vyberte Knihovny>Nainstalovat nový>Maven a pak přidejte com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0
souřadnice Mavenu.
Důležité
Pokud máte požadavek na zachování Apache Cassandry writetime
pro každý řádek během migrace, doporučujeme použít tuto ukázku. Soubor JAR závislostí v této ukázce obsahuje také konektor Spark, takže byste ho měli nainstalovat místo výše uvedeného sestavení konektoru. Tato ukázka je užitečná také v případě, že po dokončení načítání historických dat chcete provést ověření porovnání řádků mezi zdrojem a cílem. Další podrobnosti najdete v částech "Spuštění načtení historických dat" a "ověření zdroje a cíle" níže.
Vyberte Nainstalovat a po dokončení instalace restartujte cluster.
Poznámka
Po instalaci knihovny konektoru Cassandra nezapomeňte cluster Azure Databricks restartovat.
Instalace proxy serveru se dvěma zápisy
Pro zajištění optimálního výkonu při duálním zápisu doporučujeme nainstalovat proxy server na všechny uzly ve zdrojovém clusteru Cassandra.
#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
Spuštění proxy serveru se dvěma zápisy
Doporučujeme nainstalovat proxy server na všechny uzly ve zdrojovém clusteru Cassandra. Spuštěním minimálně následujícího příkazu spusťte proxy server na každém uzlu. Nahraďte <target-server>
ip adresou nebo adresou serveru z jednoho z uzlů v cílovém clusteru. Nahraďte <path to JKS file>
cestou k místnímu souboru .jks a nahraďte <keystore password>
odpovídajícím heslem.
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>
Spuštění proxy serveru tímto způsobem předpokládá, že platí následující:
- Zdrojové a cílové koncové body mají stejné uživatelské jméno a heslo.
- Zdrojové a cílové koncové body implementují protokol SSL (Secure Sockets Layer).
Pokud zdrojová a cílová koncové body nemůžou splňovat tato kritéria, přečtěte si další možnosti konfigurace.
Konfigurace SSL
V případě SSL můžete buď implementovat existující úložiště klíčů (například úložiště, které používá váš zdrojový cluster), nebo vytvořit certifikát podepsaný svým držitelem pomocí keytool
příkazu :
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Můžete také zakázat SSL pro zdrojové nebo cílové koncové body, pokud ssl neimplementují. --disable-source-tls
Použijte příznaky nebo--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
Poznámka
Ujistěte se, že klientská aplikace používá stejné úložiště klíčů a heslo jako pro proxy server se dvěma zápisy, když vytváříte připojení SSL k databázi prostřednictvím proxy serveru.
Konfigurace přihlašovacích údajů a portu
Ve výchozím nastavení se přihlašovací údaje ke zdroji předávají z klientské aplikace. Proxy server použije přihlašovací údaje pro vytváření připojení ke zdrojovému a cílovému clusteru. Jak už bylo zmíněno dříve, tento proces předpokládá, že zdrojové a cílové přihlašovací údaje jsou stejné. Při spuštění proxy serveru bude nutné zadat pro cílové rozhraní API pro koncový bod Cassandra samostatně jiné uživatelské jméno a heslo:
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>
Výchozí zdrojový a cílový port, pokud není zadaný, bude 9042. V tomto případě běží rozhraní API pro Cassandra na portu 10350
, takže musíte použít --source-port
nebo --target-port
zadat čísla portů:
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>
Vzdálené nasazení proxy serveru
Můžou nastat okolnosti, kdy nechcete proxy server instalovat na samotné uzly clusteru a chcete ho nainstalovat na samostatný počítač. V tomto scénáři musíte zadat IP adresu :<source-server>
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Upozornění
Instalace a vzdálené spuštění proxy serveru na samostatném počítači (místo jeho spuštění na všech uzlech ve zdrojovém clusteru Apache Cassandra) ovlivní výkon migrace za provozu. I když bude fungovat funkčně, klientský ovladač nebude moct otevírat připojení ke všem uzlům v rámci clusteru a bude se spoléhat na jeden koordinační uzel (kde je nainstalovaný proxy server).
Povolit nulové změny kódu aplikace
Ve výchozím nastavení proxy naslouchá na portu 29042. Kód aplikace musí být změněn tak, aby odkazovat na tento port. Můžete ale změnit port, na který proxy naslouchá. Můžete to udělat, pokud chcete eliminovat změny kódu na úrovni aplikace:
- Spuštění zdrojového serveru Cassandra na jiném portu
- Spuštění proxy serveru na standardním portu Cassandra 9042
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Poznámka
Instalace proxy serveru na uzly clusteru nevyžaduje restartování uzlů. Pokud ale máte mnoho klientů aplikací a dáváte přednost tomu, aby proxy server běžel na standardním portu Cassandra 9042, abyste eliminovali jakékoli změny kódu na úrovni aplikace, musíte změnit výchozí port Apache Cassandra. Pak musíte restartovat uzly v clusteru a nakonfigurovat zdrojový port tak, aby byl nový port, který jste definovali pro zdrojový cluster Cassandra.
V následujícím příkladu změníme zdrojový cluster Cassandra tak, aby běžel na portu 3074, a cluster spustíme na portu 9042:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042 --source-port 3074
Vynutit protokoly
Proxy server má funkci, která vynucuje protokoly, což může být nezbytné, pokud je zdrojový koncový bod pokročilejší než cíl nebo je jinak nepodporovaný. V takovém případě můžete zadat --protocol-version
a --cql-version
vynutit, aby protokol odpovídal cíli:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --protocol-version 4 --cql-version 3.11
Po spuštění proxy serveru se dvěma zápisy budete muset změnit port v klientovi aplikace a restartovat ho. (Nebo změňte port Cassandra a restartujte cluster, pokud jste zvolili tento přístup.) Proxy pak začne přesměrovávat zápisy do cílového koncového bodu. Informace o monitorování a metrikách , které jsou k dispozici v nástroji proxy, najdete tady.
Spuštění načítání historických dat
Pokud chcete načíst data, vytvořte poznámkový blok Scala ve svém účtu Azure Databricks. Nahraďte zdrojovou a cílovou konfiguraci Cassandra odpovídajícími přihlašovacími údaji a nahraďte zdrojové a cílové prostory klíčů a tabulky. Přidejte další proměnné pro každou tabulku podle potřeby do následující ukázky a pak spusťte příkaz . Jakmile vaše aplikace začne odesílat požadavky do proxy serveru se dvěma zápisy, můžete migrovat historická data.
Důležité
Před migrací dat zvyšte propustnost kontejneru na úroveň potřebnou k rychlé migraci vaší aplikace. Škálování propustnosti před zahájením migrace vám pomůže migrovat data za kratší dobu. Pokud chcete zajistit ochranu před omezováním rychlosti při načítání historických dat, můžete v rozhraní API pro Cassandra povolit opakování na straně serveru (SSR). Další informace a pokyny k povolení SSR najdete v našem článku.
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
Poznámka
V předchozí ukázce Scala si všimnete, že timestamp
se před čtením všech dat ve zdrojové tabulce nastavuje aktuální čas. writetime
Pak se nastavuje na toto backdatované časové razítko. Tím se zajistí, že záznamy zapsané z historického načtení dat do cílového koncového bodu nebudou moct při čtení historických dat přepsat aktualizace, které přicházejí s pozdějším časovým razítkem z proxy serveru se dvěma zápisy.
Důležité
Pokud potřebujete z nějakého důvodu zachovat přesná časová razítka, měli byste použít přístup k migraci historických dat, který zachová časová razítka, jako je tato ukázka. Soubor JAR závislostí v ukázce obsahuje také konektor Spark, takže nemusíte instalovat sestavení konektoru Sparku uvedené v předchozích požadavcích – když budete mít oba nainstalované v clusteru Spark, způsobíte konflikty.
Ověření zdroje a cíle
Po dokončení načítání historických dat by vaše databáze měly být synchronizované a připravené k přímé migraci. Doporučujeme ale ověřit zdroj a cíl, abyste měli jistotu, že se shodují, než se nakonec přeškrtnou.
Poznámka
Pokud jste k zachování writetime
použili výše uvedený vzorek migrace cassandra , zahrnuje to možnost ověřit migraciporovnáním řádků ve zdroji a cíli na základě určitých tolerancí.