O Realtime Compute for Apache Flink oferece suporte a CTAS (CREATE TABLE AS) para sincronização de tabela única e CDAS (CREATE DATABASE AS SELECT) para sincronização de múltiplas tabelas ou de banco de dados completo. Esses recursos permitem replicar dados em tempo real de uma instância ApsaraDB RDS for MySQL para um cluster E-MapReduce (EMR) StarRocks.
Contexto
A instrução CTAS (CREATE TABLE AS) cria automaticamente uma tabela no StarRocks com esquema idêntico ao da tabela de origem no MySQL. Ela também sincroniza dados e replica alterações de esquema da origem para o destino em tempo real, simplificando a criação de tabelas de destino e a manutenção da consistência do esquema.
Ao executar uma instrução CTAS, o Flink realiza as seguintes etapas:
-
Verifica se a tabela de destino existe.
Caso a tabela não exista, o Flink utiliza o catalog de destino para criá-la. A nova tabela de destino terá o mesmo esquema da tabela de origem.
Se a tabela já existir, o Flink ignora a criação. O sistema reportará um erro caso o esquema da tabela de destino existente não corresponda ao esquema da tabela de origem.
Envia e inicia o deployment de sincronização de dados. O Flink sincroniza os dados e as alterações de esquema da tabela de origem para a tabela de destino.
Uma instrução CTAS sincroniza dados em tempo real e propaga alterações de esquema da origem para a tabela de destino.
As alterações de esquema incluem a criação inicial da tabela e modificações subsequentes.
-
Alterações de esquema suportadas:
Adição de coluna anulável: o Flink adiciona automaticamente a nova coluna ao final do esquema da tabela de destino e sincroniza seus dados.
Exclusão de coluna anulável: a coluna não é fisicamente removida da tabela de destino. Em vez disso, o Flink preenche automaticamente seus dados com valores
NULL.-
Renomeação de coluna: o Flink trata essa operação como uma combinação de adição de nova coluna e exclusão da antiga. A coluna renomeada é adicionada ao final da tabela de destino, e os dados da coluna original são preenchidos com valores
NULL.Por exemplo, ao renomear col_a para col_b, a coluna col_b é adicionada ao final da tabela de destino, e os dados em col_a são automaticamente preenchidos com valores NULL.
-
Alterações de esquema não suportadas:
-
Modificações em tipos de dados.
Por exemplo, alterar um tipo de VARCHAR para BIGINT ou uma propriedade de NOT NULL para NULLABLE.
Mudanças em restrições, como chave primária ou índice.
Adição ou exclusão de colunas não anuláveis.
Ajustes no comprimento de campos em uma instrução DDL.
-
Ao encontrar uma alteração de esquema não suportada, exclua manualmente a tabela de destino e reinicie o deployment CTAS. Isso recria a tabela de destino e ressincroniza todos os dados históricos.
O CTAS não identifica tipos específicos de DDL. Ele compara as diferenças de esquema entre os registros de dados antes e depois de uma alteração. Se você excluir uma coluna e adicioná-la novamente sem mudanças de dados entre as duas operações DDL, o CTAS não detectará alteração de esquema. Da mesma forma, ao adicionar uma coluna, o CTAS detecta a mudança e a sincroniza com a tabela de destino somente após ocorrer uma alteração de dados nessa tabela.
Para consultar os tipos de dados suportados na criação de tabela com
CTAS, consulte Mapeamento de tipos de dados entre Flink e StarRocks.Ao usar uma instrução CTAS para mesclar várias tabelas MySQL, o Flink adiciona automaticamente duas colunas,
_db_namee_table_name, no início do esquema da tabela gerada para rastrear a tabela de origem. Esse comportamento não pode ser alterado. Portanto, ao definir a ordem das colunas para a nova tabela, comece pela terceira coluna para garantir que o esquema resultante corresponda às suas expectativas.
Pré-requisitos
Ative o Realtime Compute for Apache Flink (Fully Managed) e crie um cluster Flink. Para mais informações, consulte Activate Realtime Compute for Apache Flink (Fully Managed) e Getting started with a Flink SQL deployment.
Crie um cluster StarRocks. Para mais informações, consulte Create a StarRocks cluster.
Crie uma instância ApsaraDB RDS for MySQL. Para mais informações, consulte Create an ApsaraDB RDS for MySQL instance.
Os exemplos neste tópico utilizam MySQL 5,7, um cluster E-MapReduce (EMR) StarRocks (EMR-3.39.1) e Realtime Compute for Apache Flink (versão 1.15-vvr-6.0.3).
Limitações
O cluster Flink, o cluster StarRocks e a instância ApsaraDB RDS for MySQL devem estar na mesma VPC.
A instância ApsaraDB RDS for MySQL deve ser versão 5,7 ou superior.
O acesso à internet deve estar habilitado no cluster StarRocks.
A versão do Flink no seu cluster deve ser 1.15-vvr-6.0.3 ou superior.
Etapa 1: Preparar dados de teste
-
Crie um banco de dados e uma conta de teste. Para mais informações, consulte Create databases and accounts for an ApsaraDB RDS for MySQL instance.
Após criar o banco de dados e a conta, conceda permissões de leitura e gravação à conta de teste.
NotaNeste tópico, o banco de dados chama-se
test_cdce a conta chama-setest. Use a conta de teste para conectar-se à instância MySQL. Para mais informações, consulte Use DMS to log on to an ApsaraDB RDS for MySQL instance.
-
Execute os comandos abaixo no MySQL para criar uma tabela de dados.
use test_cdc; CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, `add_col` int DEFAULT NULL, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO test_cdc.`runoob_tbl` (`runoob_id`,`runoob_title`,`runoob_author`,`submission_date`,`add_col`) values (18,'first','tom','2022-06-22 17:13:44',3) Faça login no cluster StarRocks via SSH. Para mais informações, consulte Log on to a cluster.
-
Execute o comando a seguir para conectar-se ao cluster StarRocks.
mysql -h127.0.0.1 -P 9030 -uroot -
Execute os comandos abaixo para criar um usuário e conceder permissões.
CREATE DATABASE test_cdc; CREATE USER 'test' IDENTIFIED by '123456'; GRANT CREATE TABLE ON DATABASE test_cdc TO test;
Etapa 2: Criar catalogs
Na página Draft Editor do console Realtime Compute for Apache Flink, crie catalogs para MySQL e StarRocks. Para mais informações, consulte Getting started with a Flink SQL deployment.
Os parâmetros de exemplo servem apenas como referência. Configure-os conforme suas necessidades.
-
Catalog MySQL
-
Exemplo
CREATE CATALOG mysql WITH ( 'type' = 'mysql', 'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com', 'port' = '3306', 'username' = 'emr-test', 'password' = '123456', 'default-database' = 'test_cdc' ); -
Parâmetros
Parâmetro
Descrição
type
Tipo do catalog. Defina o valor como
mysql.hostname
Endpoint interno da instância ApsaraDB RDS for MySQL. Copie o endpoint interno na página Database Connection da instância no console ApsaraDB RDS. Exemplo:
rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com.port
Número da porta do service de banco de dados MySQL. O valor padrão é
3306.username
Nome de usuário para acessar o service de banco de dados MySQL.
Utilize o nome de usuário da conta criada em Step 1: Prepare test data. Este exemplo usa test.
password
Senha para acessar o service de banco de dados MySQL.
Utilize a senha da conta criada em Step 1: Prepare test data.
default-database
Nome do banco de dados MySQL padrão.
Utilize o nome do banco de dados de Step 1: Prepare test data. Este exemplo usa test_cdc.
-
-
Catalog StarRocks
-
Exemplo
CREATE CATALOG sr WITH ( 'type' = 'starrocks', 'endpoint' = '172.16.**.**:9030', 'username' = 'test', 'password' = '123456', 'dbname' = 'test_cdc' ); -
Parâmetros
Parâmetro
Descrição
type
Tipo do catalog. Defina o valor como
starrocks.endpoint
Endereço IP e porta do Frontend (FE) do StarRocks.
username
Nome de usuário para acessar o cluster StarRocks.
Utilize o nome de usuário da conta criada em Step 1: Prepare test data. Este exemplo usa test.
password
Senha para o service de banco de dados StarRocks.
Utilize a senha da conta criada em Step 1: Prepare test data.
dbname
Nome do banco de dados StarRocks.
Utilize o nome do banco de dados de Step 1: Prepare test data. Este exemplo usa test_cdc.
-
Etapa 3: Criar e publicar um deployment
-
Na página Draft Editor do console Realtime Compute for Apache Flink, escreva uma instrução
CTAS.Seguem três exemplos de instruções CTAS.
-
Semântica at-least-once: utilize a opção sink.buffer-flush.interval-ms para configurar o intervalo de gravação de dados no StarRocks. Essa opção reduz latência e uso de memória.
/* At-least-once semantics */ use CATALOG sr; CREATE TABLE IF NOT EXISTS runoob_tbl_sr with ( 'starrocks.create.table.properties'=' engine = olap primary key(runoob_id) distributed by hash(runoob_id ) buckets 8', 'database-name'='test_cdc', 'jdbc-url'='jdbc:mysql://172.16.**.**:9030', 'load-url'='172.16.**.**:18030', 'table-name'='runoob_tbl_sr', 'username'='test', 'password' = '123456', 'sink.buffer-flush.interval-ms' = '5000', 'sink.properties.row_delimiter' = '\x02', 'sink.properties.column_separator' = '\x01' ) as table mysql.test_cdc.runoob_tbl /*+ OPTIONS ( 'connector' = 'mysql-cdc', 'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com', 'port' = '3306', 'username' = 'test', 'password' = '123456', 'database-name' = 'test_cdc', 'table-name' = 'runoob_tbl' )*/; -
Semântica exactly-once: configure um intervalo de checkpoint. Isso evita perda e duplicação de dados durante falhas, mas a visibilidade dos dados depende do intervalo de checkpoint. Para mais informações, consulte Checkpointing.
/* Exactly-once semantics. */ set 'execution.checkpointing.interval' = '1 min'; set 'execution.checkpointing.mode' = 'EXACTLY_ONCE'; set 'execution.checkpointing.timeout' = '10 min'; use CATALOG sr; CREATE TABLE IF NOT EXISTS runoob_tbl with ( 'starrocks.create.table.properties'=' engine = olap primary key(runoob_id) distributed by hash(runoob_id ) buckets 8', 'database-name'='test_cdc', 'jdbc-url'='jdbc:mysql://172.16.**.**:9030', 'load-url'='172.16.**.**:18030', 'table-name'='runoob_tbl', 'username'='test', 'password' = '123456', 'sink.semantic' = 'exactly-once', 'sink.properties.row_delimiter' = '\x02', 'sink.properties.column_separator' = '\x01 ) as table mysql.test_cdc.runoob_tbl /*+ OPTIONS ( 'connector' = 'mysql-cdc', 'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com', 'port' = '3306', 'username' = 'test', 'password' = '123456', 'database-name' = 'test_cdc', 'table-name' = 'runoob_tbl' )*/; -
Modo simples: não é necessário definir campos ao criar a tabela. O esquema é copiado do MySQL. No entanto, não é possível criar partições. Para utilizar partições, use o modo normal.
/* The two preceding examples use normal mode. This example demonstrates simple mode. */ use CATALOG sr; CREATE TABLE IF NOT EXISTS runoob_tbl1 with ( 'starrocks.create.table.properties'='buckets 8', 'starrocks.create.table.mode'='simple', 'database-name'='test_cdc', 'jdbc-url'='jdbc:mysql://172.16.**.**:9030', 'load-url'='172.16.**.**:18030', 'table-name'='runoob_tbl_sr', 'username'='test', 'password' = '123456', 'sink.buffer-flush.interval-ms' = '5000', 'sink.properties.row_delimiter' = '\x02', 'sink.properties.column_separator' = '\x01' ) as table mysql.test_cdc.runoob_tbl /*+ OPTIONS ( 'connector' = 'mysql-cdc', 'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com', 'port' = '3306', 'username' = 'emr-test', 'password' = '123456', 'database-name' = 'test_cdc', 'table-name' = 'runoob_tbl' )*/;
Tabela 1. Parâmetros WITH
Parâmetro
Obrigatório
Descrição
starrocks.create.table.properties
Sim
Definições de sufixo na instrução
CREATE TABLEdo StarRocks, excluindo definições de colunas. Exemplos incluemengine,keyebuckets.database-name
Sim
Nome do banco de dados StarRocks.
Este exemplo usa
test_cdc.jdbc-url
Sim
Utilizado para executar operações de consulta no StarRocks.
Por exemplo,
jdbc:mysql://172.16..:9030. A parte172.16..é o endereço IP interno do cluster StarRocks.load-url
Sim
Endereço IP e porta HTTP do frontend (FE) do StarRocks no formato
Endereço IP interno do cluster StarRocks:Porta. Este tópico usa a porta 8030 como exemplo. Selecione uma porta com base na versão do seu cluster:-
18030: Para EMR V5.9.0 ou superior e EMR V3.43.0 ou superior.
-
8030: Para EMR V5.8.0 ou anterior e EMR V3.42.0 ou anterior.
NotaPara mais informações sobre portas, consulte UI and ports.
sink.semantic
Não
Defina como
exactly-oncepara garantir semântica de consistência de dados. O padrão éat-least-once.starrocks.create.table.mode
Não
Valores suportados:
-
normal(padrão): forneça configurações completas, comoengine,keyebuckets, na opção starrocks.create.table.properties. -
simple: o engine é definido comoolape o tipo de chave comoprimary keypor padrão. A chave primária é herdada da tabela MySQL. Por padrão, a tabela é distribuída por hash de todas as colunas de chave primária, sem partições. Especifiquebucketsna opção starrocks.create.table.properties. Outras configurações comopropertiessão opcionais.
NotaO parâmetro
sink.use.new-apifoi removido nas versões 1.15-vvr-6.0.5 e posteriores do Flink. Caso utilize uma versão anterior a 1.15-vvr-6.0.5, adicione'sink.use.new-api'='false',aos parâmetros WITH.Para informações sobre outras configurações, consulte Carregar dados continuamente do Apache Flink.
Tabela 2. Parâmetros OPTIONS
Parâmetro
Descrição
connector
Tipo do conector. Defina o valor como
mysql-cdc.hostname
Endpoint interno da instância ApsaraDB RDS for MySQL.
Copie o endpoint interno na página Database Connection da instância no console ApsaraDB RDS. Exemplo: rm-bp1nu0c46fn9k****.mysql.rds.aliyuncs.com.
port
Número da porta do service de banco de dados MySQL. O valor padrão é
3306.username
Nome de usuário para acessar o service de banco de dados MySQL.
Utilize o nome de usuário da conta criada em Step 1: Prepare test data. Este exemplo usa test.
password
Senha para acessar o service de banco de dados MySQL.
Utilize a senha da conta criada em Step 1: Prepare test data.
table-name
Nome da tabela no StarRocks.
Utilize o nome da tabela de Step 1: Prepare test data. Este exemplo usa runoob_tbl.
database-name
Nome do banco de dados MySQL padrão.
Utilize o nome do banco de dados de Step 1: Prepare test data. Este exemplo usa test_cdc.
-
Nas Advanced settings da página Draft Editor, selecione a versão 1.15-vvr-6.0.3 ou superior do Flink.
Clique em online.
Na página Deployments, localize o deployment desejado e clique em START na coluna Actions.
Etapa 4: Demonstração de cenários
Consultar dados
Faça login no cluster StarRocks via SSH. Para mais informações, consulte Log on to a cluster.
-
Execute o comando a seguir para conectar-se ao cluster StarRocks.
mysql -h127.0.0.1 -P 9030 -uroot -
No CLI do StarRocks, execute os comandos abaixo para visualizar os dados da tabela.
use test_cdc; select * from runoob_tbl1;A saída mostra que os dados da tabela MySQL foram sincronizados com o StarRocks.
+-----------+--------------+---------------+-----------------+---------+ | runoob_id | runoob_title | runoob_author | submission_date | add_col | +-----------+--------------+---------------+-----------------+---------+ | 18 | first | tom | 2022-06-22 | 3 | +-----------+--------------+---------------+-----------------+---------+
Consultar dados inseridos
-
No console SQL da instância ApsaraDB RDS for MySQL, execute o comando abaixo para inserir dados.
INSERT INTO runoob_tbl(`runoob_id`,`runoob_title`,`runoob_author`,`submission_date`,`add_col`) values(1,'second','tom2','2022-06-23',1) -
No CLI do StarRocks, execute o comando a seguir para visualizar os dados da tabela.
select * from runoob_tbl1;A saída confirma que os dados foram inseridos com sucesso.
+-----------+--------------+---------------+-----------------+---------+ | runoob_id | runoob_title | runoob_author | submission_date | add_col | +-----------+--------------+---------------+-----------------+---------+ | 1 | second | tom2 | 2022-06-23 | 1 | | 18 | first | tom | 2022-06-22 | 3 | +-----------+--------------+---------------+-----------------+---------+
Sincronizar atualizações de dados
-
No console SQL da instância ApsaraDB RDS for MySQL, execute o comando abaixo para atualizar dados específicos.
update runoob_tbl set runoob_title= 'new' where runoob_id = 18 -
No CLI do StarRocks, execute o comando a seguir para visualizar os dados da tabela.
select * from runoob_tbl1;A saída indica que a atualização dos dados foi sincronizada.
+-----------+--------------+---------------+-----------------+---------+ | runoob_id | runoob_title | runoob_author | submission_date | add_col | +-----------+--------------+---------------+-----------------+---------+ | 1 | second | tom2 | 2022-06-23 | 1 | | 18 | new | tom | 2022-06-22 | 3 | +-----------+--------------+---------------+-----------------+---------+
Sincronizar exclusões de dados
-
No console SQL da instância ApsaraDB RDS for MySQL, execute o comando abaixo para excluir dados específicos.
DELETE FROM runoob_tbl WHERE runoob_id = 1 -
No CLI do StarRocks, execute o comando a seguir para visualizar os dados da tabela.
select * from runoob_tbl1;A saída demonstra que a exclusão dos dados foi sincronizada.
+-----------+--------------+---------------+-----------------+---------+ | runoob_id | runoob_title | runoob_author | submission_date | add_col | +-----------+--------------+---------------+-----------------+---------+ | 18 | new | tom | 2022-06-22 | 3 | +-----------+--------------+---------------+-----------------+---------+
Adicionar uma coluna anulável
-
No console SQL da instância ApsaraDB RDS for MySQL, execute o comando abaixo para adicionar uma coluna anulável.
alter table `runoob_tbl` add COLUMN `add_col2` INT; -
Execute o comando a seguir para inserir dados.
INSERT INTO runoob_tbl(`runoob_id`,`runoob_title`,`runoob_author`,`submission_date`,`add_col`,`add_col2`) values(1,'second','tom2','2022-06-23',1,2) -
No CLI do StarRocks, execute o comando a seguir para visualizar os dados da tabela.
select * from runoob_tbl1;A saída confirma que a alteração de esquema foi bem-sucedida.
+-----------+--------------+---------------+-----------------+---------+----------+ | runoob_id | runoob_title | runoob_author | submission_date | add_col | add_col2 | +-----------+--------------+---------------+-----------------+---------+----------+ | 18 | new | tom | 2022-06-22 | 3 | NULL | +-----------+--------------+---------------+-----------------+---------+----------+ | 1 | second | tom2 | 2022-06-23 | 1 | 2 | | 18 | first | tom | 2022-06-22 | 3 | NULL | +-----------+--------------+---------------+-----------------+---------+----------+
Introdução ao CDAS
Uma instrução CDAS funciona como um atalho sintático para o CTAS. Ela sincroniza um banco de dados MySQL inteiro com o StarRocks como um único deployment Flink. Também é possível usar a sintaxe including table para sincronizar apenas um subconjunto de tabelas.
Assim como no CTAS, crie os catalogs correspondentes de MySQL e StarRocks antes de executar uma instrução CDAS. O exemplo a seguir apresenta a sintaxe.
CREATE DATABASE IF NOT EXISTS sr_db with (
'starrocks.create.table.properties'=' buckets 8',
'starrocks.create.table.mode'='simple',
'jdbc-url'='jdbc:mysql://172.16.**.**:9030',
'load-url'='172.16.**.**:18030',
'username'='test',
'password' = '123456',
'sink.buffer-flush.interval-ms' = '5000' ,
'sink.properties.row_delimiter' = '\x02',
'sink.properties.column_separator' = '\x01'
)
as DATABASE mysql.test_cdc including table 'tabl1','tbl2','tbl3'
/*+ OPTIONS ( 'connector' = 'mysql-cdc',
'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com',
'port' = '3306',
'username' = 'test',
'password' = '123456',
'database-name' = 'test_cdc' )*/;