Adatok élő migrálása az Apache Cassandrából az Apache Cassandra-hoz készült Azure Cosmos DB-be kettős írású proxy és az Apache Spark használatával
Az Azure Cosmos DB Cassandra API-ja remek választássá vált az Apache Cassandra-on futó nagyvállalati számítási feladatokhoz számos okból, például:
A felügyelet és a monitorozás nem jár többletterheléssel: Kiküszöböli a számos beállítás kezelésével és monitorozásával kapcsolatos többletterhelést az operációs rendszer, a JVM és a Yaml-fájlok és azok interakciói között.
Jelentős költségmegtakarítás: Az Azure Cosmos DB-vel pénzt takaríthat meg, amely magában foglalja a virtuális gépek költségeit, a sávszélességet és a vonatkozó licenceket. Emellett nem kell kezelnie az adatközpontokat, kiszolgálókat, SSD-tárolókat, hálózatkezelési és villamosenergia-költségeket.
Meglévő kód és eszközök használatának lehetősége: Az Azure Cosmos DB vezetékes protokollszintű kompatibilitást biztosít a meglévő Cassandra SDK-kkal és -eszközökkel. Ez a kompatibilitás biztosítja, hogy a meglévő kódbázist az Apache Cassandra-hoz készült Azure Cosmos DB-vel triviális módosításokkal használja.
Az Azure Cosmos DB nem támogatja a natív Apache Cassandra pletyka protokollt a replikációhoz. Ezért, ha a nulla állásidő a migrálás követelménye, más megközelítésre van szükség. Ez az oktatóanyag bemutatja, hogyan migrálhat adatokat az Apache Cassandra-hoz készült Azure Cosmos DB-be egy natív Apache Cassandra-fürtből kettős írású proxy és Apache Spark használatával.
Az alábbi képen a minta látható. A kettős írási proxy az élő módosítások rögzítésére szolgál, míg az előzményadatok tömeges másolása az Apache Spark használatával történik. A proxy csak néhány konfigurációmódosítással fogadhatja el az alkalmazáskódból érkező kapcsolatokat. Az összes kérést a forrásadatbázisba irányítja, és aszinkron módon irányítja át az írásokat a Cassandra API-ba tömeges másolás közben.
Előfeltételek
Tekintse át az Apache Cassandra-hoz készült Azure Cosmos DB-hez való csatlakozás alapjait.
A kompatibilitás biztosításához tekintse át az Apache Cassandra-hoz készült Azure Cosmos DB támogatott funkcióit .
Győződjön meg arról, hogy rendelkezik hálózati kapcsolattal a forrásfürt és a Cassandra-végpont cél API-ja között.
Győződjön meg arról, hogy már migrálta a keyspace/table sémát a forrás Cassandra-adatbázisból a Cassandra-fiók cél API-jába.
Fontos
Ha a migrálás során meg kell őriznie az Apache Cassandrát
writetime
, a táblák létrehozásakor a következő jelzőket kell beállítani:with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true
Például:
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;
Spark-fürt kiépítése
Az Azure Databricks használatát javasoljuk. Használjon olyan futtatókörnyezetet, amely támogatja a Spark 3.0-s vagy újabb verzióját.
Fontos
Győződjön meg arról, hogy az Azure Databricks-fiók hálózati kapcsolattal rendelkezik a forrás Apache Cassandra-fürttel. Ehhez VNet-injektálásra lehet szükség. További információért tekintse meg a cikket itt .
Spark-függőségek hozzáadása
A natív és az Azure Cosmos DB Cassandra-végpontokhoz való csatlakozáshoz hozzá kell adnia az Apache Spark Cassandra Connector-kódtárat a fürthöz. A fürtben válassza a Kódtárak>Új>Maven telepítése lehetőséget, majd adja hozzá com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0
a Maven koordinátáit.
Fontos
Ha a migrálás során minden sorhoz meg kell őriznie az Apache Cassandrát writetime
, javasoljuk , hogy használja ezt a mintát. A mintában szereplő függőségi jar a Spark-összekötőt is tartalmazza, ezért a fenti összekötő-szerelvény helyett ezt kell telepítenie. Ez a minta akkor is hasznos, ha sor-összehasonlítási ellenőrzést szeretne végezni a forrás és a cél között az előzményadatok betöltése után. További részletekért tekintse meg az "előzményadatok betöltésének futtatása" és a "forrás és cél ellenőrzése" című szakaszt.
Válassza a Telepítés lehetőséget, majd a telepítés befejezése után indítsa újra a fürtöt.
Megjegyzés
A Cassandra Connector-kódtár telepítése után mindenképpen indítsa újra az Azure Databricks-fürtöt.
A kettős írású proxy telepítése
A kettős írások optimális teljesítménye érdekében javasoljuk, hogy telepítse a proxyt a forrás Cassandra-fürt összes csomópontjára.
#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
A kettős írású proxy elindítása
Javasoljuk, hogy telepítse a proxyt a forrás Cassandra-fürt összes csomópontjára. Futtassa legalább a következő parancsot a proxy elindításához az egyes csomópontokon. Cserélje le a elemet <target-server>
a célfürt egyik csomópontjának IP-címére vagy kiszolgálócímére. Cserélje le <path to JKS file>
a elemet egy helyi .jks fájl elérési útjára, és cserélje le a elemet <keystore password>
a megfelelő jelszóra.
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>
A proxy ily módon történő elindítása feltételezi, hogy a következők igazak:
- A forrás- és célvégpontok ugyanazzal a felhasználónévvel és jelszóval rendelkeznek.
- A forrás- és célvégpontok a Secure Sockets Layer (SSL) protokollt implementálják.
Ha a forrás- és célvégpontok nem felelnek meg ezeknek a feltételeknek, olvassa el a további konfigurációs lehetőségeket.
Az SSL konfigurálása
SSL esetén implementálhat egy meglévő kulcstárat (például azt, amelyet a forrásfürt használ), vagy létrehozhat egy önaláírt tanúsítványt a használatával keytool
:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Letilthatja az SSL-t a forrás- vagy célvégpontok esetében is, ha nem implementálják az SSL-t. Használja a vagy --disable-target-tls
a --disable-source-tls
jelzőket:
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
Megjegyzés
Győződjön meg arról, hogy az ügyfélalkalmazás ugyanazt a kulcstárat és jelszót használja, mint amelyet a kettős írású proxyhoz használ, amikor SSL-kapcsolatokat hoz létre az adatbázishoz a proxyn keresztül.
A hitelesítő adatok és a port konfigurálása
Alapértelmezés szerint a forrás hitelesítő adatai az ügyfélalkalmazásból lesznek átadva. A proxy a hitelesítő adatokat fogja használni a forrás- és célfürtökhöz való csatlakozáshoz. Ahogy korábban említettük, ez a folyamat feltételezi, hogy a forrás és a cél hitelesítő adatai megegyeznek. A proxy indításakor külön kell megadnia egy másik felhasználónevet és jelszót a Cassandra-végpont cél API-hoz:
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>
Ha nincs megadva alapértelmezett forrás- és célport, az 9042 lesz. Ebben az esetben a Cassandra API a porton 10350
fut, ezért a vagy --target-port
a portszámokat kell használnia--source-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>
A proxy távoli üzembe helyezése
Előfordulhatnak olyan helyzetek, amikor nem szeretné telepíteni a proxyt magukra a fürtcsomópontokra, és inkább egy külön gépre szeretné telepíteni. Ebben a forgatókönyvben meg kell adnia a ip-címét <source-server>
:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Figyelmeztetés
A proxy távoli telepítése és futtatása egy külön gépen (ahelyett, hogy a forrás Apache Cassandra-fürt összes csomópontján futtatja) hatással lenne a teljesítményre az élő migrálás során. Bár működőképes lesz, az ügyfélillesztő nem fogja tudni megnyitni a fürtön belüli összes csomópont kapcsolatait, és a kapcsolatok létrehozásához az egyetlen koordináló csomópontra (ahol a proxy telepítve van) támaszkodik.
Nulla alkalmazáskód-módosítás engedélyezése
Alapértelmezés szerint a proxy a 29042-s porton figyel. Az alkalmazáskódot úgy kell módosítani, hogy erre a portra mutasson. Módosíthatja azonban azt a portot, amelyen a proxy figyel. Ezt akkor teheti meg, ha meg szeretné szüntetni az alkalmazásszintű kódmódosításokat a következő módon:
- Ha a forrás Cassandra-kiszolgáló egy másik porton fut.
- A proxy futtatása a standard Cassandra 9042-s portján.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Megjegyzés
A proxy fürtcsomópontokra való telepítése nem igényli a csomópontok újraindítását. Ha azonban sok alkalmazásügyfelkel rendelkezik, és inkább a standard Cassandra 9042-es porton szeretné futtatni a proxyt az alkalmazásszintű kódmódosítások kiküszöbölése érdekében, módosítania kell az Apache Cassandra alapértelmezett portját. Ezután újra kell indítania a fürt csomópontait, és konfigurálnia kell a forrásportot a forrás Cassandra-fürthöz definiált új portként.
A következő példában úgy módosítjuk a forrás Cassandra-fürtöt, hogy a 3074-ös porton fusson, és a fürtöt a 9042-s porton indítjuk el:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042 --source-port 3074
Kényszerített protokollok
A proxy olyan funkciókkal rendelkezik, amelyek kényszerítik a protokollokat, ami akkor lehet szükséges, ha a forrásvégpont fejlettebb a célnál, vagy más módon nem támogatott. Ebben az esetben megadhatja --protocol-version
--cql-version
és kényszerítheti a protokollt a célnak való megfelelésre:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --protocol-version 4 --cql-version 3.11
A kettős írású proxy futtatása után módosítania kell az alkalmazásügyfél portját, és újra kell indítania. (Vagy módosítsa a Cassandra-portot, és ha ezt a módszert választotta, indítsa újra a fürtöt.) A proxy ezután megkezdi az írások továbbítását a célvégpontra. A proxyeszközben elérhető monitorozásról és metrikákról tájékozódhat.
Az előzményadatok betöltésének futtatása
Az adatok betöltéséhez hozzon létre egy Scala-jegyzetfüzetet az Azure Databricks-fiókjában. Cserélje le a forrás- és cél Cassandra-konfigurációkat a megfelelő hitelesítő adatokra, és cserélje le a forrás- és célkulcstereket és -táblákat. Adjon hozzá további változókat az egyes táblákhoz, ha szükséges, az alábbi mintához, majd futtassa a parancsot. Miután az alkalmazás megkezdte a kérelmek küldését a kettős írású proxynak, készen áll az előzményadatok migrálására.
Fontos
Az adatok migrálása előtt növelje a tároló átviteli sebességét az alkalmazás gyors migrálásához szükséges mennyiségre. A migrálás megkezdése előtt az átviteli sebesség skálázásával kevesebb idő alatt migrálhatja az adatokat. Az előzményadatok betöltése során a sebességkorlátozás elleni védelem érdekében érdemes lehet engedélyezni a kiszolgálóoldali újrapróbálkozások (SSR) használatát a Cassandra API-ban. Az SSR engedélyezéséről további információt és útmutatást itt talál.
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
Megjegyzés
Az előző Scala-mintában megfigyelheti, hogy timestamp
a forrástábla összes adatának beolvasása előtt az aktuális időpontra van beállítva. writetime
Ezután a rendszer ezt a háttéralapú időbélyeget állítja be. Ez biztosítja, hogy az előzményadat-terhelésből a célvégpontra írt rekordok ne írjanak felül olyan frissítéseket, amelyek a kettős írású proxy későbbi időbélyegével érkeznek, miközben az előzményadatok beolvasása folyamatban van.
Fontos
Ha bármilyen okból meg kell őriznie a pontos időbélyegeket, olyan előzményadat-migrálási megközelítést kell alkalmaznia, amely megőrzi az időbélyegeket, például ezt a mintát. A mintában szereplő függőségi jar a Spark-összekötőt is tartalmazza, így nem kell telepítenie a Spark-összekötő korábbi előfeltételekben említett szerelvényét – ha mindkettő telepítve van a Spark-fürtben, ütközéseket fog okozni.
A forrás és a cél ellenőrzése
Az előzményadatok betöltése után az adatbázisoknak szinkronban kell lenniük, és készen kell állniuk az átállásra. Javasoljuk azonban, hogy ellenőrizze a forrást és a célt, hogy biztosan egyezzenek, mielőtt végül átvágja őket.
Megjegyzés
Ha a fent említett cassandra migrálási mintát használta a megőrzése writetime
érdekében, ez magában foglalja a migrálás ellenőrzésének képességét a forrás és a cél sorainak bizonyos tűrések alapján történő összehasonlításával.