Çift yazma ara sunucusu kullanarak Apache Cassandra için Azure Yönetilen Örneği'ne dinamik geçiş

Mümkün olduğunda, karma küme yapılandırarak mevcut kümenizdeki verileri Apache Cassandra için Azure Yönetilen Örneği'ne geçirmek için Apache Cassandra yerel özelliğini kullanmanızı öneririz. Bu özellik, kaynak veri merkezinizdeki verileri yeni yönetilen örnek veri merkezinize sorunsuz bir şekilde çoğaltmak için Apache Cassandra'nın dedikodu protokollerini kullanır. Ancak, kaynak veritabanı sürümünüzün uyumlu olmadığı veya karma küme kurulumunun mümkün olmadığı bazı senaryolar olabilir.

Bu öğreticide , çift yazma ara sunucusu ve Apache Spark kullanarak verileri Apache Cassandra için Azure Yönetilen Örneği'ne canlı bir şekilde geçirme işlemi açıklanmaktadır. Çift yazma ara sunucusu canlı değişiklikleri yakalamak için kullanılırken, geçmiş veriler Apache Spark kullanılarak toplu olarak kopyalanır. Bu yaklaşımın avantajları şunlardır:

  • En az uygulama değişikliği. Ara sunucu, uygulama kodunuzdaki bağlantıları kabul edebilir ve yapılandırmada çok az değişiklik yapabilir veya hiç değişiklik yapamayabilirsiniz. Tüm istekleri kaynak veritabanınıza yönlendirir ve yazmaları zaman uyumsuz olarak ikincil bir hedefe yönlendirir.
  • İstemci kablo protokolü bağımlılığı. Bu yaklaşım arka uç kaynaklarına veya iç protokollere bağımlı olmadığından Apache Cassandra kablo protokollerini uygulayan herhangi bir kaynak veya hedef Cassandra sistemiyle kullanılabilir.

Aşağıdaki görüntüde yaklaşımı gösterilmektedir.

Verilerin Apache Cassandra için Azure Yönetilen Örneği'ne dinamik geçişini gösteren animasyon.

Önkoşullar

Spark kümesi sağlama

Spark 3.0'ı destekleyen Azure Databricks runtime sürüm 7.5'i seçmenizi öneririz.

Azure Databricks çalışma zamanı sürümünü bulmayı gösteren ekran görüntüsü.

Spark bağımlılıkları ekleme

Herhangi bir kablo protokolü uyumlu Apache Cassandra uç noktasına bağlanmak için kümenize Apache Spark Cassandra Bağlayıcı kitaplığını eklemeniz gerekir. Kümenizde Kitaplıklar> YeniMavenYükle'yi> seçin ve ardından Maven koordinatlarını ekleyincom.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0.

Önemli

Geçiş sırasında her satır için Apache Cassandra'yı writetime koruma gereksiniminiz varsa , bu örneği kullanmanızı öneririz. Bu örnekteki bağımlılık jar'ı spark bağlayıcısını da içerir, bu nedenle yukarıdaki bağlayıcı derlemesi yerine bunu yüklemeniz gerekir. Bu örnek, geçmiş veri yükü tamamlandıktan sonra kaynak ve hedef arasında satır karşılaştırma doğrulaması gerçekleştirmek istediğinizde de yararlıdır. Diğer ayrıntılar için aşağıdaki "geçmiş veri yükünü çalıştırma" ve "kaynağı ve hedefi doğrulama" bölümlerine bakın.

Azure Databricks'te Maven paketlerini aramayı gösteren ekran görüntüsü.

Yükle'yi seçin ve yükleme tamamlandığında kümeyi yeniden başlatın.

Not

Cassandra Bağlayıcısı kitaplığı yüklendikten sonra Azure Databricks kümesini yeniden başlattığınızdan emin olun.

Çift yazma ara sunucusunu yükleme

çift yazma sırasında en iyi performans için, proxy'yi kaynak Cassandra kümenizdeki tüm düğümlere yüklemenizi öneririz.

#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

Çift yazma ara sunucusunu başlatma

Proxy'yi kaynak Cassandra kümenizdeki tüm düğümlere yüklemenizi öneririz. Her düğümde ara sunucuyu başlatmak için en azından aşağıdaki komutu çalıştırın. değerini hedef kümedeki düğümlerden birinin IP veya sunucu adresiyle değiştirin <target-server> . değerini <path to JKS file> yerel bir .jks dosyasının yoluyla değiştirin ve yerine karşılık gelen parolayı yazın <keystore password> .

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>

Proxy'yi bu şekilde başlatmak, aşağıdakilerin doğru olduğunu varsayar:

  • Kaynak ve hedef uç noktaları aynı kullanıcı adı ve parolaya sahiptir.
  • Kaynak ve hedef uç noktalar Güvenli Yuva Katmanı (SSL) uygular.

Kaynak ve hedef uç noktalarınız bu ölçütleri karşılayamazsa diğer yapılandırma seçenekleri için okumaya devam edin.

SSL yapılandırma

SSL için, mevcut bir anahtar deponuzu (örneğin, kaynak kümenizin kullandığı anahtar deposu) uygulayabilir veya kullanarak keytoolotomatik olarak imzalanan bir sertifika oluşturabilirsiniz:

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

Ayrıca, SSL uygulamazlarsa kaynak veya hedef uç noktalar için SSL'yi devre dışı bırakabilirsiniz. --disable-source-tls veya --disable-target-tls bayraklarını kullanın:

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 

Not

İstemci uygulamanızın, ara sunucu aracılığıyla veritabanına SSL bağlantıları oluştururken çift yazma ara sunucusu için kullanılanlarla aynı anahtar deposunu ve parolayı kullandığından emin olun.

Kimlik bilgilerini ve bağlantı noktasını yapılandırma

Varsayılan olarak, kaynak kimlik bilgileri istemci uygulamanızdan geçirilir. Proxy, kaynak ve hedef kümelerle bağlantı oluşturmak için kimlik bilgilerini kullanır. Daha önce belirtildiği gibi, bu işlem kaynak ve hedef kimlik bilgilerinin aynı olduğunu varsayar. Gerekirse, ara sunucuyu başlatırken hedef Cassandra uç noktası için ayrı olarak farklı bir kullanıcı adı ve parola belirtebilirsiniz:

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>

Belirtilmediğinde varsayılan kaynak ve hedef bağlantı noktaları 9042 olacaktır. Hedef veya kaynak Cassandra uç noktası farklı bir bağlantı noktasında çalışıyorsa veya --target-port kullanarak farklı bir bağlantı noktası numarası belirtebilirsiniz--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>

Ara sunucuyu uzaktan dağıtma

Proxy'yi küme düğümlerine yüklemek istemediğiniz durumlar olabilir ve bunu ayrı bir makineye yüklemeyi tercih edebilirsiniz. Bu senaryoda, ip adresini <source-server>belirtmeniz gerekir:

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

Uyarı

Proxy'yi ayrı bir makinede uzaktan çalıştırmayı tercih ediyorsanız (bunu kaynak Apache Cassandra kümenizdeki tüm düğümlerde çalıştırmak yerine), proxy'yi kümenizdeki düğümlerle aynı sayıda makineye dağıtmanızı ve burada belirtilen ara sunucudaki yapılandırmayı kullanarak system.peers içinde IP adresleri için bir değiştirme ayarlamanızı öneririz. Bunu yapmazsanız, istemci sürücüsü küme içindeki tüm düğümlere bağlantıları açamayacağından, dinamik geçiş gerçekleşirken performansı etkileyebilir.

Sıfır uygulama kodu değişikliğine izin ver

Varsayılan olarak, ara sunucu 29042 numaralı bağlantı noktasını dinler. Uygulama kodunun bu bağlantı noktasına işaret etmesi için değiştirilmesi gerekir. Ancak, proxy'nin dinleyebileceği bağlantı noktasını değiştirebilirsiniz. Uygulama düzeyi kod değişikliklerini ortadan kaldırmak için şunları yapabilirsiniz:

  • Kaynak Cassandra sunucusunun farklı bir bağlantı noktasında çalıştırılması.
  • Proxy'nin standart Cassandra bağlantı noktası 9042 üzerinde çalıştırılması.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042

Not

Proxy'yi küme düğümlerine yüklemek için düğümlerin yeniden başlatılması gerekmez. Ancak, birçok uygulama istemciniz varsa ve uygulama düzeyindeki kod değişikliklerini ortadan kaldırmak için proxy'nin standart Cassandra bağlantı noktası 9042'de çalışmasını tercih ediyorsanız , Apache Cassandra varsayılan bağlantı noktasını değiştirmeniz gerekir. Ardından kümenizdeki düğümleri yeniden başlatmanız ve kaynak bağlantı noktasını kaynak Cassandra kümeniz için tanımladığınız yeni bağlantı noktası olacak şekilde yapılandırmanız gerekir.

Aşağıdaki örnekte kaynak Cassandra kümesini 3074 numaralı bağlantı noktasında çalışacak şekilde değiştiriyoruz ve kümeyi 9042 numaralı bağlantı noktasında başlatıyoruz:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042 --source-port 3074

Protokolleri zorlama

Ara sunucu, protokolleri zorlama işlevselliğine sahiptir. Bu, kaynak uç nokta hedeften daha gelişmişse veya başka bir şekilde desteklenmiyorsa gerekli olabilir. Bu durumda, protokolü hedefe uymaya zorlamak için ve --cql-version belirtebilirsiniz--protocol-version:

java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --protocol-version 4 --cql-version 3.11

Çift yazma ara sunucusu çalıştırıldıktan sonra, uygulama istemcinizde bağlantı noktasını değiştirmeniz ve yeniden başlatmanız gerekir. (Ya da Cassandra bağlantı noktasını değiştirin ve bu yaklaşımı seçtiyseniz kümeyi yeniden başlatın.) Ardından ara sunucu yazmaları hedef uç noktaya iletmeye başlar. Proxy aracında bulunan izleme ve ölçümler hakkında bilgi edinebilirsiniz.

Geçmiş veri yükünü çalıştırma

Verileri yüklemek için Azure Databricks hesabınızda bir Scala not defteri oluşturun. Kaynak ve hedef Cassandra yapılandırmalarınızı karşılık gelen kimlik bilgileriyle değiştirin ve kaynak ve hedef anahtar alanlarını ve tabloları değiştirin. Aşağıdaki örne gereken şekilde her tablo için daha fazla değişken ekleyin ve ardından komutunu çalıştırın. Uygulamanız çift yazma ara sunucusuna istek göndermeye başladıktan sonra geçmiş verileri geçirmeye hazırsınız demektir.

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

Not

Önceki Scala örneğinde, kaynak tablodaki tüm verileri okumadan önce geçerli saate ayarlandığını fark timestamp edeceksiniz. Ardından, writetime bu yedeklenmiş zaman damgasına ayarlanıyor. Bu, geçmiş veri yükünden hedef uç noktaya yazılan kayıtların, geçmiş veriler okunurken çift yazma proxy'sinden daha sonraki bir zaman damgasıyla gelen güncelleştirmelerin üzerine yazamasını sağlar.

Önemli

Herhangi bir nedenle tam zaman damgalarını korumanız gerekiyorsa, bu örnek gibi zaman damgalarını koruyan bir geçmiş veri geçişi yaklaşımını benimsemeniz gerekir. Örnekteki bağımlılık jar'ı spark bağlayıcısını da içerir, bu nedenle önceki önkoşullarda bahsedilen Spark bağlayıcı derlemesini yüklemeniz gerekmez; her ikisinin de Spark kümenizde yüklü olması çakışmalara neden olur.

Kaynağı ve hedefi doğrulama

Geçmiş veri yükü tamamlandıktan sonra veritabanlarınız eşitlenmiş ve tam geçiş için hazır olmalıdır. Ancak, son olarak kesmeden önce eşleşmelerini sağlamak için kaynağı ve hedefi doğrulamanızı öneririz.

Not

korumak writetimeiçin yukarıda belirtilen cassandra geçişi örneğini kullandıysanız, bu, kaynak ve hedefteki satırları belirli toleranslara göre karşılaştırarakgeçişi doğrulama özelliğini içerir.

Sonraki adımlar