Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A API para Cassandra no Azure Cosmos DB é uma ótima opção para cargas de trabalho corporativas executadas no Apache Cassandra por vários motivos:
- Sem despesas gerais de gestão e monitorização: Ele 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.
- Poupanças de custos significativas: 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 utilizar código e ferramentas existente: o Azure Cosmos DB oferece compatibilidade ao nível do protocolo de transmissão com SDKs e ferramentas do Cassandra existentes. Essa compatibilidade garante que você possa usar sua base de código existente com o Azure Cosmos DB para Apache Cassandra com alterações triviais.
O Azure Cosmos DB não suporta o protocolo de fofocas Apache Cassandra nativo para replicação. Nos casos em que o tempo de inatividade zero é um requisito para a migração, é necessária uma abordagem diferente. Este tutorial descreve como migrar dados ao vivo para o Azure Cosmos DB para 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 em tempo real. Os dados históricos são copiados em massa usando o Apache Spark. O proxy pode aceitar conexões do código do seu aplicativo com poucas ou nenhuma alteração de configuração. Ele roteia todas as solicitações para o seu banco de dados de origem e, de forma assíncrona, roteia as gravações para a API do Cassandra enquanto ocorre a cópia em massa.
Pré-requisitos
- Provisione uma conta do Azure Cosmos DB para Apache Cassandra.
- Analise as noções básicas de conexão a um Azure Cosmos DB para Apache Cassandra.
- Analise os recursos com suporte no Azure Cosmos DB para Apache Cassandra para garantir a compatibilidade.
- Use cqlsh para validação.
- Certifique-se de ter conectividade de rede entre o cluster de origem e a API de destino para o ponto de extremidade Cassandra.
- Certifique-se de que você migrou anteriormente o esquema de chave/tabela do seu banco de dados Cassandra de origem para sua API de destino para a conta Cassandra.
Importante
Se você tiver um requisito para preservar o Apache Cassandra writetime durante a migração, 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 do Spark
Recomendamos que você use o Azure Databricks. Use um tempo de execução que suporte o Spark 3.0 ou superior.
Importante
Você precisa garantir que sua conta do Azure Databricks tenha conectividade de rede com seu cluster Apache Cassandra de origem. Essa configuração pode exigir injeção de rede virtual. Para obter mais informações, consulte Implantar o Azure Databricks em sua rede virtual do Azure.
Adicionar dependências do Spark
Adicione a biblioteca Apache Spark Cassandra Connector ao cluster para se conectar aos pontos de extremidade Cassandra nativos e do Azure Cosmos DB. No cluster, selecione > e adicione as coordenadas do Maven.
Importante
Se você tiver um requisito para preservar o Apache Cassandra writetime para cada linha durante a migração, recomendamos usar este exemplo. O JAR de dependência neste exemplo também contém o conector Spark; deve-se instalar esta versão em vez da montagem do conector descrita anteriormente.
Este exemplo também é útil se você quiser executar uma validação de comparação de linha entre origem e destino após a conclusão do carregamento de dados históricos. 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 estiver concluída.
Nota
Certifique-se de reiniciar o cluster do Azure Databricks após a instalação da biblioteca Cassandra Connector.
Instalar o proxy de gravação dupla
Para um desempenho ideal durante gravações duplas, recomenda-se a instalação do proxy em todos os nós do cluster 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
Inicie o proxy de gravação dupla
Recomendamos que você instale o proxy em todos os nós do cluster Cassandra de origem. No mínimo, execute o seguinte comando para iniciar o proxy em cada nó. Substitua <target-server> por um IP ou endereço de servidor de um dos nós no cluster de destino. Substitua <path to JKS file> pelo caminho para um arquivo .jks local e substitua <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>
Iniciar o proxy dessa maneira pressupõe que o seguinte seja verdadeiro:
- Os pontos de extremidade de origem e de destino têm o mesmo nome de usuário e senha.
- Os endpoints de origem e destino implementam Secure Sockets Layer (SSL).
Se seus pontos de extremidade de origem e de destino não puderem atender a esses critérios, continue lendo para obter mais opções de configuração.
Configurar o SSL
Para SSL, você pode implementar um armazenamento 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 pode desabilitar o SSL para pontos de extremidade de origem ou de destino se eles não implementarem SSL. Use as --disable-source-tls bandeiras 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
Nota
Certifique-se de que seu aplicativo cliente usa o mesmo armazenamento de chaves e senha que os usados para o proxy de gravação dupla quando você cria conexões SSL para 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 anteriormente, esse processo pressupõe que as credenciais de origem e de destino são as mesmas. Deve especificar um nome de utilizador e uma senha diferentes para a API de destino no endpoint Cassandra, separadamente, 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. Neste 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 queira instalar o proxy nos próprios nós do cluster. Você pode preferir instalá-lo em uma máquina separada. 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 uma máquina separada, em vez de executá-lo em todos os nós do cluster Apache Cassandra de origem, afeta o desempenho enquanto ocorre a migração ao vivo. Embora essa configuração funcione funcionalmente, o driver do cliente não pode abrir conexões com todos os nós dentro do cluster. O cliente depende do nó coordenador único onde o proxy está instalado para fazer conexões.
Permitir zero alterações no código do aplicativo
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ê pode fazer essa alteração se quiser eliminar as alterações de código no nível do aplicativo:
- Ter o servidor Cassandra de origem executado em uma porta diferente.
- Ter o proxy executado na porta Cassandra padrão 9042.
java -jar target/cassandra-proxy-1.0-SNAPSHOT-fat.jar source-server destination-server --proxy-port 9042
Nota
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 aplicativos e preferir executar o proxy na porta padrão Cassandra 9042 para eliminar as alterações de código no nível do aplicativo, altere a porta padrão Apache Cassandra. Em seguida, você precisa reiniciar os nós no cluster e configurar a porta de origem para ser a nova porta definida para o cluster Cassandra de origem.
No exemplo a seguir, alteramos o cluster Cassandra de origem para ser executado 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, o que pode ser necessário se o ponto de extremidade de origem for mais avançado do que o destino ou não for suportado. Nesse caso, você pode especificar --protocol-version e --cql-version forçar o protocolo a cumprir com o 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 Cassandra e reinicie o cluster, se você escolher essa abordagem. O proxy começa a encaminhar escritas para o destinatário. Para obter informações, consulte monitoramento e métricas.
Executar a carga de dados históricos
Para carregar os dados, crie um bloco de anotações Scala em sua conta do Azure Databricks. Substitua as configurações Cassandra de origem e de destino pelas credenciais correspondentes e substitua os espaços-chave e tabelas de origem e destino. Adicione mais variáveis para cada tabela, conforme necessário, ao exemplo a seguir e execute. Depois que seu aplicativo começar a enviar solicitações para o proxy de gravação dupla, você estará pronto para migrar dados históricos.
Importante
Antes de migrar os dados, aumente a taxa de transferência do contêiner para a quantidade necessária 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 as repetições do lado do servidor (SSR) na API para Cassandra. Para obter instruções sobre como habilitar o SSR e mais informações, consulte Prevenir 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
Nota
No exemplo de Scala anterior, você percebe que timestamp está sendo definido para a hora atual antes de ler todos os dados na tabela de origem. Então, writetime está sendo definido para este 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 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 carimbos de data/hora exatos por qualquer motivo, deverá adotar uma abordagem de migração de dados históricos que preserve carimbos de data/hora, como este exemplo. O JAR de dependência no exemplo também contém o conector Spark, portanto, você não precisa instalar o conjunto do conector Spark mencionado nos pré-requisitos anteriores. Ter ambos instalados no cluster do Spark causa conflitos.
Validar a origem e o destino
Após a conclusão do carregamento de dados históricos, seus bancos de dados devem estar sincronizados e prontos para substituição. Recomendamos que valide a origem e o destino para garantir que correspondam antes de finalmente fazer a transição.
Nota
Caso tenha usado o exemplo de migrador Cassandra mencionado anteriormente para a preservação writetime, este exemplo inclui a capacidade de validar a migraçãocomparando linhas na origem e no destino com base em determinadas tolerâncias.