Çift yazma proxy 'si kullanarak Apache Cassandra için Azure yönetilen örneği 'ne dinamik geçiş

Mümkün olduğunda, karma bir kümeyapılandırarak, mevcut kümenizdeki verileri Apache Cassandra Için Azure yönetilen örneğine geçirmek üzere Apache Cassandra Native özelliğini kullanmanızı öneririz. Bu özellik Apache Cassandra 'nın GOSSIP protokolünü kullanarak verileri kaynak veri merkezinizden yeni yönetilen örnek veri merkezinize sorunsuz bir şekilde çoğaltabilir. Ancak, kaynak veritabanı sürümünüzün uyumlu olmadığı bazı senaryolar olabilir veya karma küme kurulumu başka bir şekilde uygulanamaz.

Bu öğreticide, bir Çift yazma ara sunucusu ve Apache Spark kullanarak, korumalı bir biçimde Apache Cassandra Için Azure yönetilen örneği 'ne nasıl veri geçirileceği açıklanmaktadır. İkili yazma proxy, canlı değişiklikleri yakalamak için kullanılır, ancak geçmiş verileri Apache Spark kullanılarak toplu olarak kopyalanır. Bu yaklaşımın avantajları şunlardır:

  • En az uygulama değişikliği. Proxy, birkaç yapılandırma değişikliği yapmadan uygulama kodunuzla bağlantıları kabul edebilir. Tüm istekleri kaynak veritabanınıza yönlendirir ve zaman uyumsuz rota bir ikincil hedefe yazar.
  • İstemci kablo protokolü bağımlılığı. Bu yaklaşım arka uç kaynaklarına veya iç protokollere bağlı olmadığından, Apache Cassandra kablo protokolünü uygulayan herhangi bir kaynak veya hedef Cassandra sistemiyle birlikte kullanılabilir.

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

Apache Cassandra için Azure yönetilen örneğine verilerin dinamik geçişini gösteren animasyon.

Önkoşullar

Spark kümesi sağlama

Spark 3,0 ' yi destekleyen Azure Databricks Runtime sürüm 7,5 ' ı 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ı Ekle

Kablolu protokol ile uyumlu Apache Cassandra uç noktalarına bağlanmak için Apache Spark Cassandra bağlayıcı kitaplığını kümenize eklemeniz gerekir. Kümenizde, Kitaplıklar > Yeni > Maven'i yükleyip Maven koordinatları ' nı seçin com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 .

Önemli

Geçiş sırasında her satır için Apache Cassandra koruma gereksiniminiz varsa writetime , Bu örneğikullanmanızı öneririz. Bu örnekteki bağımlılık jar, Spark bağlayıcısını de içerir, bu nedenle yukarıdaki bağlayıcı derlemesi yerine bunu yüklemelisiniz. Bu örnek, geçmiş veri yüklemesi tamamlandıktan sonra kaynak ve hedef arasında bir satır karşılaştırma doğrulaması gerçekleştirmek istiyorsanız da yararlıdır. Daha ayrıntılı bilgi için "Geçmiş veri yükünü Çalıştır" ve "kaynağı ve hedefi doğrula" bölümlerine bakın.

Azure Databricks 'de Maven paketleri aramasını gösteren ekran görüntüsü.

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

Not

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

Çift yazma proxy 'sini yükler

İkili yazma işlemleri 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 proxy 'sini başlatma

Proxy 'yi, kaynak Cassandra kümenizdeki tüm düğümlere yüklemenizi öneririz. En azından, her düğümde proxy 'yi başlatmak için aşağıdaki komutu çalıştırın. <target-server>Hedef kümedeki düğümlerden bırının IP veya sunucu adresiyle değiştirin. <path to JKS file>Bir yerel. JKS dosyasının yoluyla değiştirin ve öğesini <keystore password> karşılık gelen parolayla değiştirin.

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 'nin bu şekilde başlatılması, 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şılamıyorsa, daha fazla yapılandırma seçeneği için okumaya devam edin.

SSL yapılandırma

SSL için, var olan bir anahtar deposu 'u (örneğin, kaynak kümenizin kullandığı) uygulayabilir veya kullanarak otomatik olarak imzalanan bir sertifika oluşturabilirsiniz keytool :

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

SSL uygularsa, kaynak veya hedef uç noktalar için de SSL 'yi devre dışı bırakabilirsiniz. --disable-source-tlsOr bayraklarını kullanın --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 

Not

İstemci uygulamanızın, proxy aracılığıyla veritabanına SSL bağlantısı oluştururken, Çift yazma proxy 'si için kullanılanlar ile aynı anahtar deposunu ve parolayı kullandığından emin olun.

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

Varsayılan olarak, kaynak kimlik bilgileri istemci uygulamanızdan geçirilir. Proxy, kaynak ve hedef kümelere bağlantı yapmak için kimlik bilgilerini kullanır. Daha önce belirtildiği gibi, bu işlem kaynak ve hedef kimlik bilgilerinin aynı olduğunu varsayar. Gerekirse, proxy 'yi başlatırken hedef Cassandra uç noktası için 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, --source-port --target-port farklı bir bağlantı noktası numarası belirtmek için ya da kullanabilirsiniz:

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>

Proxy 'yi uzaktan dağıtma

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

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

Uyarı

Proxy 'yi ayrı bir makineye uzaktan yükleme ve çalıştırma (kaynak Apache Cassandra kümenizdeki tüm düğümlerde çalıştırmak yerine), dinamik geçiş gerçekleştiğinde performansı etkiler. Çalışır duruma kadar, istemci sürücü, küme içindeki tüm düğümlere bağlantıları açamaz ve bağlantı kurmak için tek Co-Ordinator düğümüne (proxy 'nin yüklendiği) güvenir.

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

Varsayılan olarak, proxy 29042 numaralı bağlantı noktasını dinler. Uygulama kodu, bu bağlantı noktasını gösterecek şekilde değiştirilmelidir. Ancak, proxy 'nin dinlediği bağlantı noktasını değiştirebilirsiniz. Uygulama düzeyi kod değişikliklerini kaldırmak istiyorsanız bunu yapabilirsiniz:

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

Not

Küme düğümlerine proxy yükleme, düğümlerin yeniden başlatılmasını gerektirmez. Ancak, birçok uygulama istemciniz varsa ve herhangi bir uygulama düzeyi kod değişikliğini ortadan kaldırmak üzere proxy 'nin standart Cassandra bağlantı noktası 9042 üzerinde çalışmasını tercih ediyorsanız, Apache Cassandra varsayılan bağlantı noktasınıdeğiştirmeniz gerekir. Daha sonra 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ştiririz ve küme bağlantı noktası 9042 ' de başlatılır:

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

Protokolleri zorla

Proxy 'nin, kaynak uç noktasının hedeften daha gelişmiş olması veya başka türlü desteklenmiyorsa, protokolleri zorlama işlevselliği vardır. Bu durumda, --protocol-version --cql-version Protokolü hedefle uyumlu olacak şekilde belirtebilir ve kullanabilirsiniz:

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

Çift yazma proxy 'si çalıştıktan sonra, uygulama istemcinizdeki bağlantı noktasını değiştirmeniz ve yeniden başlatmanız gerekir. (Veya Cassandra bağlantı noktasını değiştirip bu yaklaşımı seçtiyseniz kümeyi yeniden başlatın.) Proxy daha sonra yazmaları hedef uç noktaya iletmeyi başlatır. 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ı ilgili kimlik bilgileriyle değiştirin ve kaynak ve hedef anahtar alanlarını ve tabloları değiştirin. Aşağıdaki örneğe gereken her tablo için daha fazla değişken ekleyin ve ardından öğesini çalıştırın. Uygulamanız çift yazma proxy 'sine 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, timestamp kaynak tablodaki tüm verileri okumadan önce geçerli saate ayarlanmakta olduğunu fark edeceksiniz. Ardından, writetime Bu arka arkaya zaman damgasına ayarlanır. Bu, geçmiş veri yükünün hedef uç noktasına yazılmasını sağlayan kayıtların, geçmiş veriler okunurken ikili yazma proxy 'sinden sonraki bir zaman damgasıyla birlikte gelen güncelleştirmelerin üzerine yazılmasına neden olur.

Önemli

Her nedenden dolayı tam zaman damgalarını korumanız gerekiyorsa, Bu örnekgibi zaman damgalarını koruyan bir geçmiş veri geçiş yaklaşımı almalısınız. Örnekteki bağımlılık jar, Spark bağlayıcısını de içerir, bu nedenle önceki ön koşullar bölümünde bahsedilen Spark bağlayıcı derlemesini yüklemeniz gerekmez-Spark kümenizde her ikisi de yüklü olduğunda, çakışmaların oluşmasına neden olur.

Kaynağı ve hedefi doğrulama

Geçmiş veri yüklemesi tamamlandıktan sonra, veritabanlarınızın eşitlenmiş ve cutover için hazırlanmalıdır. Ancak, son uygulamadan önce eşleştiğinden emin olmak için kaynağı ve hedefi doğrulamanız önerilir.

Not

Koruma için yukarıda belirtilen Cassandra Migrator örneğini kullandıysanız writetime , bu, belirli toleranslar temelinde kaynak ve hedefteki satırları karşılaştırarak geçişi doğrulama özelliğini içerir.

Sonraki adımlar