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

Önemli

Apache Cassandra için Azure Yönetilen Örneği şu anda genel önizlemededir. Önizleme sürümü bir hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yüklerinde kullanılması önerilmez. Bazı özellikler desteklenmiyor olabileceği gibi özellikleri sınırlandırılmış da olabilir. Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Mümkün olduğunca, karma bir küme yapılandırarak mevcut kümeden Apache Cassandra için Azure Yönetilen Örneği'ne veri geçirmek için Apache Cassandra yerel özelliğinin kullanılması önerilir. Bu, kaynak veri merkezinize ait verileri yeni yönetilen örnek veri merkezinize sorunsuz bir şekilde çoğaltmak için Apache Cassandra'nın protokolünü kullanır. Ancak, kaynak veritabanı sürümünüz uyumlu olmayan veya karma küme kurulumunun mümkün olmayan bazı senaryolar olabilir. Bu makalede, çift yazma proxy'si ve uygulama adı kullanarak verileri Apache Cassandra için Azure Yönetilen Örneği'ne nasıl canlı bir şekilde Apache Spark. Bu yaklaşımın avantajları:

  • en az uygulama değişikliği - Ara sunucu çok az yapılandırma değişikliğiyle veya hiç yapılandırma değişikliğiyle uygulama kodunuzdan gelen bağlantıları kabul eder ve tüm istekleri kaynak veritabanınıza yönlendirebilir ve yazmaları zaman uyumsuz olarak ikincil bir hedefe yönlendirebilir.
  • istemci kablo protokolüne bağımlı - Bu yaklaşım arka uç kaynaklarına veya iç protokollere bağımlı değildir, Apache Cassandra kablo protokolünü uygulayan herhangi bir kaynak veya hedef Cassandra sistemiyle kullanılabilir.

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

Apache Cassandra için Azure Yönetilen Örneği, Apache Cassandra için yönetilen bir hizmettir.

Önkoşullar

  • Azure portal veya Azure CLI kullanarak Apache Cassandra için Azure Yönetilen Örneği sağlama ve CQLSHile kümenize bağlana olduğundan emin olun.

  • Yönetilen Cassandra Azure Databricks içinde bir hesap sağlama. Kaynak Cassandra kümenize de ağ erişimi olduğundan emin olun. Bu hesapta, eski veri yükü için bir Spark kümesi oluşturuz.

  • Anahtar alanı/tablo düzenini kaynak Cassandra veritabanınıza hedef Cassandra Yönetilen Örneği veritabanınıza zaten geçirmiştiniz.

Spark kümesi sağlama

Spark 3.0 Azure Databricks çalışma zamanı sürüm 7.5'i seçmenizi öneririz.

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

Spark bağımlılıkları ekleme

Hem yerel hem de Apache Spark Cassandra uç noktalarına bağlanmak için kümenize Azure Cosmos DB eklemeniz gerekir. Kümenize Kitaplıklar Yeni > Maven Yükle'yi seçin ve ardından > com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 Maven koordinatlarına ekleyin.

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 Databricks kümesi yeniden başlatıldığından emin olun.

Çift yazma proxy'lerini yükleme

Çift yazma sırasında en iyi performans için, kaynak Cassandra kümenizin tüm düğümlerine proxy'yi 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

İkili yazma ara sunucusunu başlatma

Proxy'nin kaynak Cassandra kümenizin tüm düğümlerine yüklemeniz önerilir. Her düğümde ara sunucu başlatmak için en azından aşağıdaki komutu çalıştırmanız gerekir. yerine <target-server> hedef kümedeki düğümlerden birinin IP veya sunucu adresini yazın. yerine <path to JKS file> yerel bir jks dosyasının yolunu, yerine <keystore password> de karşılık gelen parolayı yazın:

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>

SSL için, mevcut bir anahtar deposu (örneğin, kaynak kümeniz tarafından kullanılan) uygulayabilirsiniz veya keytool kullanarak otomatik olarak imzalanan sertifika oluşturabilirsiniz:

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

Not

İstemci uygulamanın, ara sunucu aracılığıyla veritabanına SSL bağlantıları oluşturması için çift yazma proxy'si için kullanılan anahtar deposu ve parolanın aynısını kullandığından emin olun.

Ara sunucu bu şekilde başlayarak aşağıdakilerin doğru olduğunu varsaymaktadır:

  • kaynak ve hedef uç noktaları aynı kullanıcı adı ve parolaya sahip
  • kaynak ve hedef uç noktalar SSL uygulama

Varsayılan olarak, kaynak kimlik bilgileri istemci uygulamanıza geçiri ve ara sunucu tarafından kaynak ve hedef kümelere bağlantı yapmak için kullanılır. Gerekirse, ara sunucuya başlayarak hedef Cassandra uç noktasının kullanıcı adını ve parolasını ayrı ayrı 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>

Belirtilmedikse varsayılan kaynak ve hedef bağlantı noktaları 9042 olur. Hedef veya kaynak Cassandra uç noktaları farklı bir bağlantı noktası üzerinde çalıştırıyorsa, farklı bir bağlantı noktası --source-port numarası belirtmek için veya --target-port 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>

SSL uygulamazsa, kaynak veya hedef uç noktalar için SSL'yi de devre dışı abilirsiniz. veya --disable-source-tls bayraklarını --disable-target-tls 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 

Proxy'yi küme düğümlerine yüklemek istemeyseniz ve bunu ayrı bir makineye yüklemek istediğiniz durumlar olabilir. Bu senaryoda, IP'sini belirtmeniz <source-server> gerekir:

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

Not

Proxy'yi yerel bir Apache Cassandra kümesinde tüm düğümlerde yükp çalıştırmayacaksanız, istemci sürücüsü küme içindeki tüm düğümlere bağlantı açamayay olarak uygulama performansınızı etkiler.

Varsayılan olarak, ara sunucu 29042 bağlantı noktasını dinler. Ancak ara sunucu tarafından dinleme yapılan bağlantı noktasını da değiştirebilirsiniz. Kaynak Cassandra sunucusunun farklı bir bağlantı noktası üzerinde çalışmasına ve proxy'nin standart Cassandra bağlantı noktası üzerinde çalışmasına sahip olarak uygulama düzeyindeki kod değişikliklerini ortadan kaldırmak isterseniz bunu yapmak istiyor olabilirsiniz:

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ına gerek yok. Ancak, çok sayıda 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ışıyor olmasını tercih ediyorsanız kümenizi yeniden başlatmanız gerekir.

Ara sunucu, hedeften sonra kaynak uç nokta daha gelişmişse gerekli olabilir, protokolleri zorlamaya yönelik bazı işlevlere sahip olur. Bu durumda ve --protocol-version --cql-version belirtesiniz:

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

Çift yazma proxy'sini çalıştırdıktan sonra, uygulama istemcinizin bağlantı noktasını değiştirmeli ve yeniden başlatabilirsiniz (veya bu yaklaşımı seçtiyebilirsiniz Cassandra bağlantı noktasını ve kümeyi yeniden başlatabilirsiniz). Ara sunucu daha sonra yazmaları hedef uç noktasına iletmeye başlar. Proxy aracında kullanılabilen izleme ve ölçümler hakkında bilgi edinebilirsiniz.

Eski veri yükünü çalıştırın.

Verileri yüklemek için Databricks hesabınızla bir Scala not defteri oluşturun. Kaynak ve hedef Cassandra yapılandırmalarınızı ilgili kimlik bilgileriyle, kaynak ve hedef anahtar alanlarınızı ve tablolarınızı değiştirin. Aşağıdaki örnek için gereken şekilde her tablo için daha fazla değişken ekleyin ve çalıştırın. Uygulamanız çift yazma ara sunucusuna istek göndermeye başladıktan sonra, eski verileri geçirmeye hazır olur.

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

Yukarıdaki Scala örneğinde, kaynak tablodaki tüm verileri okumadan önce geçerli zamana ayarlandı ve ardından bu geriye doğru zaman damgası olarak timestamp writetime ayarlandı. Bu, eski veri yükünden hedef uç noktasına yazılan kayıtların, önceki veriler okunurken çift yazma proxy'sinde daha sonraki bir zaman damgasıyla gelen güncelleştirmelerin üzerine yazamamasıdır. Herhangi bir nedenle tam zaman damgasını korumanız gerekirse, bu örnekte olduğu gibi zaman damgasını koruyan bir veri geçişi yaklaşımı benimseyebilirsiniz.

Doğrulama

Eski veri yükü tamamlandıktan sonra veritabanlarınız eşitli olmalı ve tam yük için hazır olmalıdır. Ancak, son olarak kesmeden önce istek sonuçlarının eş olduğundan emin olmak için kaynak ve hedef doğrulamasını gerçekleştirin.

Sonraki adımlar