Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A API do Cassandra no Azure Cosmos DB é uma ótima opção para cargas de trabalho corporativas executadas no Apache Cassandra por vários motivos:
- Nenhuma sobrecarga de gerenciamento e monitoramento: Elimina a sobrecarga de gerenciar e monitorar uma infinidade de configurações entre sistemas operacionais, máquinas virtuais Java e arquivos yaml e suas interações.
- Redução significativa de custos: Você pode economizar custos com o Azure Cosmos DB, que inclui o custo de máquinas virtuais, largura de banda e quaisquer licenças aplicáveis. Você não precisa gerenciar os data centers, servidores, armazenamento SSD, rede e custos de eletricidade.
- Capacidade de usar o código e as ferramentas existentes: o Azure Cosmos DB fornece compatibilidade no nível de protocolo com as ferramentas e os SDKs existentes do Cassandra. Essa compatibilidade garante que seja possível usar a base de código existente com o Azure Cosmos DB for Apache Cassandra com alterações básicas.
O Azure Cosmos DB não dá suporte ao "gossip protocol" nativo do Apache Cassandra para replicação. Quando o tempo de inatividade zero é um requisito para a migração, uma abordagem diferente é necessária. Este tutorial descreve como migrar dados dinâmicos para o Azure Cosmos DB for Apache Cassandra de um cluster Apache Cassandra nativo usando um proxy de gravação dupla e o Apache Spark.
A imagem a seguir ilustra o padrão. O proxy de gravação dupla é usado para capturar alterações ao vivo. Os dados históricos são copiados em massa usando o Apache Spark. O proxy pode aceitar conexões do código do aplicativo com pouca ou nenhuma alteração de configuração. Ele roteia todas as solicitações para o banco de dados de origem e roteia as gravações de forma assíncrona para a API do Cassandra enquanto a cópia em massa está acontecendo.
Pré-requisitos
- Provisionar uma conta do Azure Cosmos DB for Apache Cassandra.
- Examinar os conceitos básicos da conexão com um Azure Cosmos DB for Apache Cassandra.
- Examinar os recursos com suporte no Azure Cosmos DB for Apache Cassandra para garantir a compatibilidade.
- Use cqlsh para validação.
- Verifique se você tem conectividade de rede entre o cluster de origem e o ponto de extremidade da API para Cassandra de destino.
- Certifique-se de ter migrado anteriormente o esquema de keyspace/tabela do banco de dados do Cassandra de origem para a sua conta da API de destino do Cassandra.
Importante
Se você tiver um requisito para preservar Apache Cassandra durante a migraçãowritetime os seguintes sinalizadores devem ser definidos ao criar tabelas:
with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true
Por exemplo:
CREATE KEYSPACE IF NOT EXISTS migrationkeyspace WITH REPLICATION= {'class': 'org.apache.> cassandra.locator.SimpleStrategy', 'replication_factor' : '1'};
CREATE TABLE IF NOT EXISTS migrationkeyspace.users (
name text,
userID int,
address text,
phone int,
PRIMARY KEY ((name), userID)) with cosmosdb_cell_level_timestamp=true and > cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true;
Provisionar um cluster Spark
Recomendamos que você use o Azure Databricks. Use um tempo de execução compatível com o Spark 3.0 ou superior.
Importante
Você precisa garantir que sua conta do Azure Databricks tenha conectividade de rede com seu cluster de origem Apache Cassandra. Essa configuração pode exigir injeção de rede virtual. Para obter mais informações, confira Implantar o Azure Databricks na sua rede virtual do Azure.
Adicionar dependências do Spark
Adicione a biblioteca do Conector do Apache Spark Cassandra ao cluster para se conectar aos pontos de extremidade nativos e do Cassandra do Azure Cosmos DB. No cluster, selecione Bibliotecas>Instalar novo>Maven e, em seguida, adicione com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 nas coordenadas do Maven.
Importante
Se você tiver um requisito para preservar o writetime do Apache Cassandra para cada linha durante a migração, recomendamos usar esta amostra. O JAR de dependência neste exemplo também contém o conector do Spark, portanto, você deve instalar essa versão em vez do assembly do conector descrito anteriormente.
Este exemplo também será útil, se você quiser executar uma validação de comparação de linha entre a origem e o destino, após a conclusão da carga de dados histórica. Para obter mais informações, consulte Executar a carga de dados históricos e validar a origem e o destino.
Selecione Instalar e reinicie o cluster quando a instalação for concluída.
Observação
Verifique se reinicia o cluster do Azure Databricks após a instalação da biblioteca do Cassandra Connector.
Instalar o proxy de gravação dupla
Para obter um desempenho ideal durante gravações duplas, recomendamos que você instale o proxy em todos os nós no cluster do Cassandra de origem.
#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
Iniciar o proxy de gravação dupla
Recomendamos instalar o proxy em todos os nós do cluster do Cassandra de origem. No mínimo, execute o comando a seguir para iniciar o proxy em cada nó. Substitua <target-server> por um endereço IP ou de servidor de um dos nós no cluster de destino. Substitua <path to JKS file> pelo caminho para um arquivo .jks local e <keystore password> pela senha correspondente.
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>
Ao iniciar o proxy dessa maneira, pressupõe-se que o seguinte é verdadeiro:
- O nome de usuário e a senha dos pontos de extremidade de origem e de destino são iguais.
- Os pontos de extremidade de origem e destino implementam protocolo SSL.
Se os pontos de extremidade de origem e destino não atenderem a esses critérios, continue lendo para obter mais opções de configuração.
Configurar SSL
Para SSL, você pode implementar um repositório de chaves existente, por exemplo, aquele que o cluster de origem usa ou criar um certificado autoassinado usando keytool:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Você também poderá desabilitar o SSL para pontos de extremidade de origem ou de destino caso eles não implementem o SSL. Use os sinalizadores --disable-source-tls ou --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
Observação
Verifique se o aplicativo cliente usa o mesmo repositório de chaves e senha que os usados para o proxy de gravação dupla ao criar conexões SSL com o banco de dados por meio do proxy.
Configurar as credenciais e a porta
Por padrão, seu aplicativo cliente passa as credenciais de origem. O proxy usa as credenciais para fazer conexões com os clusters de origem e de destino. Como mencionado antes, esse processo pressupõe que as credenciais de origem e de destino são as mesmas. Você deve especificar um nome de usuário e uma senha diferentes separadamente para a API de destino e para o endpoint do Cassandra ao iniciar o proxy.
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>
As portas de origem e destino padrão, quando não especificadas, são 9042. Nesse caso, a API para Cassandra é executada na porta 10350. Use --source-port ou --target-port para especificar números de porta:
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>
Implantar o proxy remotamente
Pode haver circunstâncias em que você não deseja instalar o proxy nos próprios nós de cluster. Talvez você prefira instalá-lo em um computador separado. Nesse cenário, especifique o endereço IP de <source-server>:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar <source-server> <destination-server>
Aviso
Instalar e executar o proxy remotamente em um computador separado em vez de executá-lo em todos os nós no cluster do Apache Cassandra de origem afeta o desempenho enquanto a migração ao vivo ocorre. Embora essa configuração funcione funcionalmente, o driver cliente não pode abrir conexões para todos os nós dentro do cluster. O cliente depende do nó de coordenador único em que o proxy está instalado para fazer conexões.
Permitir alterações de código de aplicativo zero
Por padrão, o proxy escuta na porta 29042. Altere o código do aplicativo para apontar para essa porta. Em vez disso, você pode alterar a porta na qual o proxy escuta. Você poderá fazer essa alteração se quiser eliminar as alterações de código no nível do aplicativo:
- Fazendo com que o servidor Cassandra de origem seja executado em uma porta diferente.
- Fazendo com que o proxy seja executado na porta Cassandra padrão 9042.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Observação
A instalação do proxy em nós de cluster não requer a reinicialização dos nós. Se você tiver muitos clientes de aplicativo e preferir executar o proxy na porta cassandra padrão 9042 para eliminar as alterações de código no nível do aplicativo, altere a porta padrão do Apache Cassandra. Em seguida, você precisa reiniciar os nós em seu cluster e configurar a porta de origem para ser a nova porta que você definiu para o cluster cassandra de origem.
No exemplo a seguir, alteramos o cluster Cassandra de origem para execução na porta 3074 e iniciamos o cluster na porta 9042:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server \
--proxy-port 9042 --source-port 3074
Forçar protocolos
O proxy tem funcionalidade para forçar protocolos, as quais podem ser necessárias se o ponto de extremidade de origem for mais avançado do que o de destino ou ele se não tiver suporte. Nesse caso, você pode especificar que --protocol-version e --cql-version forcem o protocolo a obedecer ao destino:
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server \
--protocol-version 4 --cql-version 3.11
Depois que o proxy de gravação dupla estiver em execução, você precisará alterar a porta no cliente do aplicativo e reiniciar. Ou altere a porta do Cassandra e reinicie o cluster, se você escolher essa abordagem. O proxy inicia o encaminhamento de gravações para o ponto de extremidade de destino. Para obter informações, consulte monitoramento e métricas.
Executar o carregamento de dados históricos
Para carregar os dados, crie um notebook Scala em sua conta do Azure Databricks. Substitua as configurações do Cassandra de origem e de destino pelas credenciais correspondentes e substitua os keyspaces e as tabelas de origem e de destino. Adicione mais variáveis para cada tabela conforme necessário para o exemplo a seguir e faça a execução. Depois que o aplicativo começar a enviar solicitações para o proxy de gravação dupla, estará tudo pronto para a migração de dados históricos.
Importante
Antes de migrar os dados, aumente a taxa de transferência do contêiner para o valor necessário para que seu aplicativo migre rapidamente. Dimensionar a taxa de transferência antes de iniciar a migração ajuda você a migrar seus dados em menos tempo. Para ajudar a proteger contra a limitação de taxa durante a carga de dados históricos, você pode habilitar novas tentativas do servidor (SSR) na API do Cassandra. Para obter instruções sobre como habilitar o SSR e mais informações, consulte Evitar erros de limitação de taxa para operações do Azure Cosmos DB para Apache Cassandra.
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
Observação
Na amostra do Scala anterior, você percebe que timestamp está sendo definido para o momento atual antes de ler todos os dados na tabela de origem. Em seguida, writetime será definido para esse carimbo de data/hora retroativo. Essa abordagem garante que os registros gravados da carga de dados históricos para o ponto de extremidade de destino não possam substituir as atualizações que chegam com um carimbo de data/hora posterior do proxy de gravação dupla enquanto os dados históricos estão sendo lidos.
Importante
Se você precisar preservar os carimbos de data/hora exatos por algum motivo, deverá adotar uma abordagem de migração de dados históricos que preserve os carimbos de data/hora, como este exemplo. O arquivo JAR de dependência no exemplo também contém o conector Spark, então não é necessário instalar o conjunto do conector Spark mencionado nos pré-requisitos anteriores. Ter ambos instalados em seu cluster Spark causa conflitos.
Validar a origem e o destino
Após o carregamento de dados históricos ser concluído, seus bancos de dados deverão estar em sincronia e prontos para a substituição. Recomendamos que você valide a origem e o destino para garantir que eles correspondam entre si antes de finalmente transferir.
Observação
Se você tiver usado a amostra do migrador do Cassandra mencionada anteriormente para preservar writetime, este exemplo incluirá a capacidade de validar a migração comparando linhas na origem e no destino com base em determinadas tolerâncias.