Share via


Élő migrálás az Apache Cassandra felügyelt Azure-példányára kettős írású proxy használatával

Ahol lehetséges, javasoljuk, hogy az Apache Cassandra natív funkciójának használatával migrálja az adatokat a meglévő fürtről az Apache Cassandra felügyelt Azure-példányába egy hibrid fürt konfigurálásával. Ez a képesség az Apache Cassandra pletykaprotokolljával zökkenőmentesen replikálja az adatokat a forrás adatközpontból az új felügyelt példány adatközpontjába. Előfordulhatnak azonban olyan forgatókönyvek, amikor a forrásadatbázis verziója nem kompatibilis, vagy a hibrid fürt beállítása egyébként nem lehetséges.

Ez az oktatóanyag bemutatja, hogyan migrálhat adatokat az Apache Cassandra felügyelt Azure-példányára élő módon kettős írású proxy és Apache Spark használatával. A kettős írású 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. Ennek a megközelítésnek az előnyei a következők:

  • Minimális alkalmazásmódosítások. A proxy néhány vagy semmilyen konfigurációmódosítás nélkül képes fogadni az alkalmazáskódból származó kapcsolatokat. Az összes kérést átirányítja a forrásadatbázisba, és aszinkron módon egy másodlagos célhoz irányítja az írásokat.
  • Ügyféldrótprotokoll-függőség. Mivel ez a megközelítés nem függ a háttérerőforrásoktól vagy a belső protokolloktól, bármely olyan forrás- vagy cél Cassandra-rendszerrel használható, amely implementálja az Apache Cassandra drótprotokollt.

Az alábbi képen a megközelítés látható.

Animáció, amely az adatok Azure Managed Instance for Apache Cassandra-ba való élő migrálását mutatja be.

Előfeltételek

Spark-fürt kiépítése

Javasoljuk, hogy válassza az Azure Databricks 7.5-ös verzióját, amely támogatja a Spark 3.0-t.

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

Az Apache Spark Cassandra Connector-kódtárat hozzá kell adnia a fürthöz, hogy bármilyen, drótprotokoll-kompatibilis Apache Cassandra-végponthoz csatlakozzon. 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 található 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 a korábbi adatbetöltés befejezése után. További részletekért lásd az "előzményadatok betöltésének futtatása" és a "forrás és cél érvényesíté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 indítsa újra a fürtöt, amikor a telepítés befejeződött.

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ás során optimális teljesítmény é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 indítása

Javasoljuk, hogy telepítse a proxyt a forrás Cassandra-fürt összes csomópontjára. Legalább futtassa a következő parancsot a proxy elindításához az egyes csomópontokon. Cserélje le a helyére <target-server> a célfürt egyik csomópontjának IP-címét vagy kiszolgálócímét. Cserélje le a elemet <path to JKS file> egy helyi .jks fájl elérési útjára, és cserélje le <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ő indí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 implementálják a Secure Sockets Layer (SSL) protokollt.

Ha a forrás- és célvégpontok nem felelnek meg ezeknek a feltételeknek, olvassa el a további konfigurációs beállításokat.

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 a kettős írású proxyhoz használt, amikor SSL-kapcsolatokat hoz létre az adatbázishoz a proxyn keresztül.

Hitelesítő adatok és 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 használja 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 azonosak. Szükség esetén a proxy indításakor külön megadhat egy másik felhasználónevet és jelszót a cél Cassandra-végponthoz:

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, az alapértelmezett forrás- és célportok a 9042 lesznek. Ha a cél vagy a forrás Cassandra-végpont egy másik porton fut, vagy --source-port--target-port megadhat egy másik portszámot:

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 körülmények, amikor nem szeretné telepíteni a proxyt 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 következő <source-server>IP-címét:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>

Figyelmeztetés

Ha távolról szeretné futtatni a proxyt egy külön gépen (ahelyett, hogy a forrás Apache Cassandra-fürt összes csomópontján futtatja), javasoljuk, hogy a proxyt a fürt csomópontjaival megegyező számú gépre telepítse, és állítsa be a system.peers ip-címeinek helyettesítését az itt említett proxy konfigurációjával. Ha ezt nem teszi meg, az hatással lehet a teljesítményre az élő migrálás során, mivel az ügyfélillesztő nem fog tudni kapcsolatokat megnyitni a fürt összes csomópontja felé.

Alkalmazáskódok nulla módosításának 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 a standard Cassandra 9042-s porton fut.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042

Megjegyzés

A proxy fürtcsomópontokra történő telepítése nem igényli a csomópontok újraindítását. Ha azonban sok alkalmazásügyféllel rendelkezik, és inkább a standard Cassandra-port 9042-es portján 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ópontjait, é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 és --cql-version 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 indítsa újra a fürtöt, ha ezt a megközelítést választotta.) A proxy ezután elkezdi továbbítani az írásokat 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 szükség szerint az alábbi mintához, majd futtassa a parancsot. Miután az alkalmazás megkezdte a kérések küldését a kettős írású proxynak, készen áll az előzményadatok migrálására.

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

Megjegyzés

Az előző Scala-mintában láthatja, hogy timestamp az aktuális időpontra van állítva, mielőtt a forrástáblában lévő összes adatot beolvassa. 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 található 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 okozhat.

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 meggyőződjön arról, hogy megegyeznek, mielőtt végül átvágnánk.

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