Migrace za provozu do spravované instance Azure pro Apache Cassandra s využitím proxy se dvěma zápisy
Pokud je to možné, doporučujeme použít nativní schopnost Apache Cassandra k migraci dat z existujícího clusteru do spravované instance Azure pro Apache Cassandra konfigurací hybridního clusteru. Tato funkce používá k bezproblémové replikaci dat ze zdrojového datacentra do nového datacentra spravované instance protokol kerberos apache cassandra. Můžou se ale zobrazit situace, kdy verze zdrojové databáze není kompatibilní nebo jinak není možné nastavit hybridní cluster.
Tento kurz popisuje, jak živě migrovat data do spravované instance Azure pro Apache Cassandra pomocí proxy serveru pro duální zápis a Apache Spark. Proxy se dvěma zápisy se používá k zachycení živých změn, zatímco historická data se hromadně kopírují pomocí Apache Spark. Výhody tohoto přístupu:
- Minimální změny aplikace. Proxy server může přijímat připojení z kódu vaší aplikace s malými nebo žádnými změnami konfigurace. Směruje všechny požadavky do zdrojové databáze a asynchronně směruje zápisy do sekundárního cíle.
- Závislost přenosového protokolu klienta. Vzhledem k tomu, že tento přístup není závislý na back-endových zdrojích ani interních protokolech, je možné ho použít s libovolným zdrojovým nebo cílovým systémem Cassandra, který implementuje přenosový protokol Apache Cassandra.
Následující obrázek znázorňuje přístup.
Požadavky
Zřízení spravované instance Azure pro cluster Apache Cassandra pomocí Azure Portal nebo Azure CLI. Ujistěte se, že se ke clusteru můžete připojit pomocí CQLSH.
Zřízení účtu Azure Databricks ve vaší virtuální síti Managed Cassandra. Ujistěte se, že má účet síťový přístup ke zdrojovému clusteru Cassandra. V tomto účtu vytvoříme cluster Spark pro historické načtení dat.
Ujistěte se, že jste už migroval schéma prostoru klíčů nebo tabulek ze zdrojové databáze Cassandra do cílové databáze spravované instance Cassandra.
Zřízení clusteru Spark
Doporučujeme vybrat modul runtime Azure Databricks verze 7.5, který podporuje Spark 3.0.
Přidání závislostí Sparku
Pokud se chcete připojit ke koncovým bodům Apache Cassandra kompatibilním s protokolem přenosu, musíte do clusteru přidat knihovnu konektoru Cassandra Apache Spark. V clusteru vyberte Libraries > Install New Maven (Knihovny – nainstalovat > nový Maven) a pak přidejte souřadnice com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 Mavenu.
Důležité
Pokud máte požadavek na zachování Apache Cassandra pro každý řádek writetime 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 chcete provést ověření porovnání řádků mezi zdrojem a cílem po dokončení načtení historických dat. Další podrobnostinajdete níže včástechSpuštění načtení historických 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 restartovat cluster Azure Databricks clusteru.
Instalace proxy 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 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 se dvěma zápisy
Doporučujeme nainstalovat proxy server na všechny uzly ve zdrojovém clusteru Cassandra. Spuštěním následujícího příkazu minimálně spusťte proxy server na každém uzlu. Nahraďte IP adresou nebo serverovou adresou z jednoho <target-server> z uzlů v cílovém clusteru. Nahraďte <path to JKS file> cestou k místnímu souboru .jks a <keystore password> nahraďte 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í SSL (Secure Sockets Layer) (SSL).
Pokud vaše zdrojové a cílové koncové body tato kritéria nesplňuje, přečtěte si další možnosti konfigurace.
Konfigurace SSL
Pro SSL můžete buď implementovat existující úložiště klíčů (například to, které používá váš zdrojový cluster), 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
Můžete také zakázat SSL pro zdrojové nebo cílové koncové body, pokud neimplementují SSL. Použijte --disable-source-tls 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 vaše klientská aplikace používá stejné úložiště klíčů a heslo jako pro proxy se dvěma zápisy při vytváření 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á z klientské aplikace. Proxy server použije přihlašovací údaje pro připojení ke zdrojovému a cílovému clusteru. Jak už bylo zmíněno dříve, tento proces předpokládá, že přihlašovací údaje ke zdroji a cíli jsou stejné. V případě potřeby můžete při spouštění proxy serveru zadat samostatné uživatelské jméno a heslo pro cílový 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é porty, pokud nejsou zadané, budou 9042. Pokud cíl nebo zdrojový koncový bod Cassandra běží na jiném portu, můžete použít nebo --source-port --target-port a zadat jiné číslo portu:
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 se zobrazit okolnosti, kdy nechcete proxy server instalovat na samotné uzly clusteru a dáváte přednost jeho instalaci na samostatný počítač. V tomto scénáři je potřeba 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 spuštění na všech uzlech ve zdrojovém clusteru Apache Cassandra) bude mít vliv na výkon při migraci za provozu. I když bude fungovat funkčně, klientský ovladač nebude moct otevřít připojení ke všem uzlům v rámci clusteru a při naskupování připojení bude spoléhat na jeden uzel souřadnice (kde je nainstalován proxy server).
Povolit nulové změny kódu aplikace
Ve výchozím nastavení proxy server naslouchá na portu 29042. Kód aplikace je nutné změnit tak, aby odkazl na tento port. Můžete ale změnit port, na který proxy server naslouchá. To můžete udělat, pokud chcete eliminovat změny kódu na úrovni aplikace pomocí:
- Zdrojový server Cassandra běží na jiném portu.
- Mít proxy server spuštěný 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 uzlech 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, aby se eliminly všechny změny kódu na úrovni aplikace, musíte změnit výchozí port Apache Cassandra. Pak je potřeba restartovat uzly ve vašem clusteru a nakonfigurovat zdrojový port jako nový port, který jste definovali pro zdrojový cluster Cassandra.
V následujícím příkladu změníme zdrojový cluster Cassandra tak, aby se spouštěl 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 pro vynucení protokolů, což může být nezbytné, pokud je zdrojový koncový bod pokročilejší než cíl nebo pokud není jinak nepodporovaný. V takovém případě můžete zadat a a --protocol-version --cql-version vynutit, aby protokol dodržoval cíl:
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 se dvěma zápisy budete muset změnit port v klientovi aplikace a restartovat ho. (Případně změňte port Cassandra a restartujte cluster, pokud jste zvolili tento přístup.) Proxy pak začne předá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.
Spuštění načtení historických dat
Pokud chcete načíst data, vytvořte ve svém účtu Azure Databricks Scala. Nahraďte zdrojové a cílové konfigurace Cassandra odpovídajícími přihlašovacími údaji a nahraďte zdrojové a cílové prostory klíčů a tabulky. Podle potřeby přidejte do následující ukázky další proměnné pro každou tabulku a pak spusťte příkaz . Jakmile vaše aplikace začne odesílat požadavky na proxy se dvěma zápisy, jste připraveni migrovat historická data.
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
Poznámka
V předchozí ukázce Scala si všimnete, že se před načtením všech dat ve zdrojové tabulce nastaví na timestamp aktuální čas. Potom se writetime nastaví na toto zastaralé časové razítko. Tím se zajistí, že záznamy zapsané z historického načtení dat do cílového koncového bodu nepřepíšou aktualizace, které se dodá s pozdějším časovým razítkem z proxy duálního zápisu, zatímco se načítá historická data.
Důležité
Pokud z nějakého důvodu potřebujete zachovat přesná časová razítka, měli byste při migraci historických dat zachovat časová razítka, například v této ukázce. Soubor JAR závislostí v ukázce obsahuje také konektor Spark, takže není nutné instalovat sestavení konektoru Spark uvedené v předchozích předpokladech – pokud máte oba nainstalované v clusteru Spark, způsobí to 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řechodu. Doporučujeme však ověřit zdroj a cíl, abyste zajistili, že se shodují, než se nakonec přehodí.
Poznámka
Pokud jste pro zachování použili výše uvedenou ukázku migrace Cassandra, zahrnuje to možnost ověřit migraci porovnáním řádků ve zdroji a cíli na základě writetime určitých tolerancí.