Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní API pro Cassandra ve službě Azure Cosmos DB je skvělou volbou pro podnikové úlohy, které běží na Apache Cassandře z různých důvodů:
- Bez režijních nákladů na správu a monitorování: Eliminuje režii při správě a monitorování řadu nastavení napříč operačními systémy, virtuálními počítači Java a soubory yaml a jejich interakcemi.
- Výrazné úspory nákladů: S Azure Cosmos DB můžete ušetřit náklady, včetně nákladů na virtuální počítače, šířku pásma a všechny příslušné licence. Nemusíte spravovat datacentra, servery, úložiště SSD, sítě a náklady na elektřinu.
- Možnost využívat stávají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žít stávající základ kódu se službou Azure Cosmos DB pro Apache Cassandra s triviálními změnami.
Azure Cosmos DB nepodporuje nativní protokol Apache Cassandra gossip pro replikaci. Pokud je nulový výpadek požadavkem na migraci, je nutný jiný přístup. Tento kurz popisuje, jak migrovat data do služby Azure Cosmos DB pro 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 vzor. Proxy s duálním zápisem se používá k zachycení živých změn. Historická data se hromadně kopírují 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. Během hromadného kopírování směruje všechny požadavky do zdrojové databáze a asynchronně směruje zápisy do rozhraní API pro Cassandru.
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 pro Apache Cassandra.
- Projděte si podporované funkce ve službě Azure Cosmos DB pro Apache Cassandra a zajistěte 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 rozhraním API pro koncový bod Cassandra.
- Ujistěte se, že jste dříve migrovali schéma prostoru klíčů nebo tabulky ze zdrojové databáze Cassandra do cílového rozhraní API pro účet Cassandra.
Důležité
Pokud během migrace potřebujete zachovat Apache Cassandra writetime , musí se při vytváření tabulek nastavit 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 používat Azure Databricks. Použijte modul runtime, který podporuje Spark 3.0 nebo vyšší.
Důležité
Musíte se ujistit, že váš účet Azure Databricks má síťové připojení ke zdrojovému clusteru Apache Cassandra. Toto nastavení může vyžadovat injektáž virtuální sítě. Další informace najdete v tématu Nasazení Azure Databricks ve virtuální síti Azure.
Přidání závislostí Sparku
Přidejte do clusteru knihovnu konektoru Apache Spark Cassandra pro připojení k nativním i koncovým bodům Cassandra služby Azure Cosmos DB. V clusteru vyberte > a pak přidejte souřadnice Mavenu.
Důležité
Pokud máte požadavek na zachování Apache Cassandra 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 Sparku, takže byste měli tuto verzi nainstalovat místo dříve popsaného sestavení konektoru.
Tato ukázka je užitečná také v případě, že chcete po dokončení historického načtení dat provést ověření porovnání řádků mezi zdrojem a cílem. Další informace najdete v tématu Spuštění historického načtení dat a Ověření zdroje a cíle.
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
Pokud chcete dosáhnout optimálního výkonu při dvou zápisech, 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 na všechny uzly ve zdrojovém clusteru Cassandra. Minimálně spuštěním následujícího příkazu spusťte proxy server na každém uzlu. Nahraďte <target-server> IP adresou nebo serverovou adresou 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 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 vaše zdrojové a cílové koncové body nesplňují tato kritéria, přečtěte si další možnosti konfigurace.
Konfigurace SSL
Pro protokol SSL můžete buď implementovat existující úložiště klíčů, například úložiště klíčů, které váš zdrojový cluster používá, nebo vytvořit certifikát podepsaný svým držitelem pomocí keytool:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Ssl můžete také zakázat pro zdrojové nebo cílové koncové body, pokud neimplementují SSL. Použijte příznaky--disable-source-tls:--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 vaše klientská aplikace používá stejné úložiště klíčů a heslo jako ty, které se používají pro proxy s duálním zápisem při sestavování připojení SSL k databázi prostřednictvím proxy serveru.
Konfigurace přihlašovacích údajů a portu
Ve výchozím nastavení vaše klientská aplikace předává zdrojové přihlašovací údaje. Proxy server pomocí přihlašovacích údajů vytvoří připojení ke zdrojovému a cílovému clusteru. Jak už jsme zmínili 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 musíte zadat jiné uživatelské jméno a heslo cílového rozhraní API pro koncový bod Cassandra:
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ý, je 9042. V tomto případě rozhraní API pro Cassandra běží na portu 10350. Použijte --source-port nebo --target-port zadejte čí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 situace, kdy nechcete nainstalovat proxy server do samotných uzlů clusteru. Můžete ho raději nainstalovat na samostatný počítač. V tomto scénáři zadejte IP adresu <source-server>:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Upozorňující
Instalace a spuštění proxy serveru vzdáleně na samostatném počítači, nikoli na všech uzlech ve zdrojovém clusteru Apache Cassandra, má vliv na výkon při migraci za provozu. Přestože tato konfigurace funguje funkčně, klientský ovladač nemůže otevřít připojení ke všem uzlům v clusteru. Klient spoléhá na jeden koordinační uzel, na kterém je nainstalovaný proxy server, k navazování připojení.
Povolit žádné změny kódu aplikace
Ve výchozím nastavení proxy naslouchá na portu 29042. Změňte kód aplikace tak, aby odkazoval na tento port. Místo toho můžete změnit port, na který proxy server naslouchá. Pokud chcete odstranit změny kódu na úrovni aplikace, můžete tuto změnu provést takto:
- Zdrojový server Cassandra běží na jiném portu.
- Proxy server běží 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 máte mnoho klientů aplikací a dáváte přednost spuštění proxy na standardním portu Cassandra 9042, abyste vyloučili změny kódu na úrovni aplikace, změňte výchozí port Apache Cassandra. Pak musíte restartovat uzly v clusteru a nakonfigurovat zdrojový port tak, aby byl novým portem, 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
Vynucení protokolů
Proxy server má funkce vynucení protokolů, které můžou 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 byl protokol v souladu s cílem:
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 je potřeba změnit port v klientovi aplikace a restartovat ho. Nebo změňte port Cassandra a restartujte cluster, pokud zvolíte tento přístup. Proxy začne předávat zápisy do cílového koncového bodu. Informace najdete v tématu Monitorování a metriky.
Spuštění načítání historických dat
Pokud chcete načíst data, vytvořte ve svém účtu Azure Databricks poznámkový blok Scala. Nahraďte konfigurace zdrojové a cílové 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 spusťte ji. Jakmile vaše aplikace začne odesílat požadavky na proxy s duálním zápisem, jste připraveni migrovat historická data.
Důležité
Před migrací dat zvyšte propustnost kontejneru na množství potřebné k rychlé migraci vaší aplikace. Škálování propustnosti před zahájením migrace vám pomůže migrovat data za kratší dobu. Aby byla zajištěna ochrana před omezením rychlosti při historické zátěži dat, můžete v rozhraní API pro Cassandru povolit opakování na úrovni serveru. Pokyny k povolení služby SSR a další informace najdete v tématu Prevence chyb omezování rychlosti pro operace Azure Cosmos DB pro Apache Cassandra.
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 je před čtením všech dat ve zdrojové tabulce nastavená na aktuální čas.
writetime Pak je nastaveno na toto zastaralé časové razítko. Tento přístup zajišťuje, že záznamy napsané během načítání historických dat do cílového koncového bodu nemohou přepsat aktualizace, které přicházejí s pozdějším časovým razítkem z proxy serveru pro dvojité zapisování, zatímco se čtou historická data.
Důležité
Pokud z nějakého důvodu potřebujete zachovat přesná časová razítka, měli byste použít historický přístup k migraci dat, který zachovává časová razítka, jako je tato ukázka. Soubor JAR se závislostmi v ukázce také obsahuje konektor pro Spark, takže není nutné instalovat sestavení konektoru pro Spark uvedené v předchozích požadavcích. Obě instalace v clusteru Spark způsobují konflikty.
Ověření zdroje a cíle
Po dokončení načítání historických dat by se vaše databáze měly synchronizovat a připravené k přímé migraci. Doporučujeme ověřit zdroj a cíl, abyste se ujistili, že se shodují, než nakonec přejdete.
Poznámka:
Pokud jste k zachování writetime použili ukázkový migrátor Cassandra uvedený dříve, tato ukázka zahrnuje schopnost ověřit migraci pomocí porovnání řádků ve zdrojovém a cílovém umístění na základě určitých tolerancí.