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í.

Animace znázorňující migraci dat za provozu do služby Azure Managed Instance for Apache Cassandra

Požadavky

  • Zřízení účtu Služby Azure Cosmos DB pro Apache Cassandra

  • 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.

  • K ověření použijte cqlsh.

  • 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.

Snímek obrazovky znázorňující vyhledání verze modulu runtime Azure Databricks

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.

Snímek obrazovky znázorňující hledání balíčků Maven v Azure Databricks

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í keytoolpří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í writetimepouž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í.

Další kroky