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.

Animáció, amely bemutatja az adatok élő migrálását az Apache Cassandra felügyelt Azure-példányára.

Előfeltételek

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 .

Képernyőkép az Azure Databricks futtatókörnyezet verziójának megkereséséről.

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.

Képernyőkép a Maven-csomagok Keresésről az Azure Databricksben.

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 10350fut, 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.

Következő lépések