Se as consultas no PolarDB for MySQL estiverem lentas, use o Data Transmission Service (DTS) para sincronizar dados de produção em tempo real com um cluster do Alibaba Cloud Elasticsearch e realizar buscas e análises. Essa solução é ideal para cenários que exigem sincronização em tempo real de alto desempenho a partir de bancos de dados relacionais.
Informações básicas
Este tópico utiliza os seguintes services de cloud:
Data Transmission Service (DTS): service de streaming de dados que integra migração, assinatura e sincronização de dados em tempo real. O DTS oferece suporte à sincronização de operações
INSERT,DELETEeUPDATE. Para mais informações, consulte Data Transmission Service (DTS) e Overview of data synchronization scenarios.PolarDB: service de banco de dados relacional de última geração desenvolvido pela Alibaba Cloud, compatível com MySQL, PostgreSQL e Oracle. Um cluster do PolarDB suporta até 100 TB de armazenamento e pode ser dimensionado para até 16 nós. Para mais informações, consulte PolarDB for MySQL overview.
Elasticsearch: mecanismo distribuído de busca e análise em tempo real baseado no Lucene, capaz de armazenar, consultar e analisar grandes conjuntos de dados quase instantaneamente. Para mais informações, consulte What is Alibaba Cloud Elasticsearch?
Precauções
O DTS não sincroniza alterações de dados geradas por operações DDL. Se você executar uma operação DDL em uma tabela do banco de dados source durante a sincronização, siga estes passos: remova a tabela da tarefa de sincronização de dados, exclua o índice correspondente no cluster do Elasticsearch e adicione a tabela novamente à tarefa. Para mais informações, consulte Remove an object from a data synchronization task e Add an object to a data synchronization task.
Para adicionar colunas à tabela source, modifique os mapeamentos do índice correspondente. Em seguida, execute a operação DDL na tabela source, pause a tarefa de sincronização de dados e reinicie-a.
-
A sincronização completa de dados consome recursos de leitura e gravação tanto no banco de dados source quanto no destino, o que pode aumentar a carga do sistema. Se o banco de dados apresentar baixo desempenho, especificações limitadas ou cargas de trabalho intensas (como consultas SQL lentas, tabelas sem chaves primárias ou deadlocks no destino), esse aumento de carga pode causar indisponibilidade do service. Avalie previamente o desempenho do banco de dados e realize a sincronização fora dos horários de pico, quando a utilização da CPU de ambos os bancos estiver abaixo de 30%.
Se uma tarefa de sincronização completa falhar durante o horário de pico, reinicie-a.
A sincronização incremental de dados em horários de pico pode causar latência.
Processo
Para sincronizar os dados, siga as etapas abaixo:
Faça os preparativos: adicione os dados a serem sincronizados ao banco de dados source PolarDB for MySQL, crie um cluster do Alibaba Cloud Elasticsearch e ative o recurso Auto Indexing no cluster.
Crie e execute uma tarefa de sincronização de dados: configure e inicie a tarefa no console do DTS. A sincronização completa e incremental dos dados ocorrerá automaticamente.
Etapa 1: Faça os preparativos
Neste exemplo, são utilizados um cluster PolarDB for MySQL 8.0.1 Enterprise Edition e um cluster Alibaba Cloud Elasticsearch V7.10.
Prepare o banco de dados source e os dados a serem sincronizados
Crie um cluster PolarDB for MySQL 8.0.1 Enterprise Edition. Para mais informações, consulte Purchase an Enterprise Edition cluster.
-
Verifique se o recurso de binary logging está ativado no cluster PolarDB for MySQL. Para mais informações, consulte Enable binary logging.
No painel de navegação à esquerda, escolha Settings and Management > Binlog Management. Na página Binlog Management, clique em Enable Now.
Crie uma conta e um banco de dados chamado
test_polardb. Para mais informações, consulte Create and manage database accounts e Manage databases.-
No banco de dados
test_polardb, crie uma tabela chamadaproducte insira dados.-
Crie a tabela
CREATE TABLE `product` ( `id` bigint(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) NULL, `price` varchar(32) NULL, `code` varchar(32) NULL, `color` varchar(32) NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -
Insira dados de teste na tabela
INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (1,'mobile phone A','2000','amp','golden'); INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (2,'mobile phone B','2200','bmp','white'); INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (3,'mobile phone C','2600','cmp','black'); INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (4,'mobile phone D','2700','dmp','red'); INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (5,'mobile phone E','2800','emp','silvery');
-
Prepare o cluster do Elasticsearch de destino
Crie um cluster Alibaba Cloud Elasticsearch V7.10. Para mais informações, consulte Create an Alibaba Cloud Elasticsearch cluster.
-
Ative o recurso Auto Indexing no cluster do Elasticsearch. Para mais informações, consulte Configure the YML file.
Na página Settings and Management > Cluster Configuration da instância, localize o item de configuração Auto Indexing na seção YML File Configuration e clique em Modify Configuration à direita para ativá-lo.
Etapa 2: Crie e execute uma tarefa de sincronização de dados
Acesse a página da lista de tarefas de sincronização de dados do DTS (nova versão).
Clique em Create Task.
-
Na página exibida, crie e configure a tarefa de sincronização de dados conforme as instruções.
Para obter detalhes sobre os parâmetros envolvidos nas etapas a seguir, consulte Synchronize data from a PolarDB for MySQL cluster.
-
Configure os bancos de dados source e de destino e clique em Test Connectivity and Proceed.
Informações do banco de dados source:
Defina Database Type como PolarDB for MySQL
Defina Access Method como Cloud Instance e defina Instance Region como China (Hangzhou)
Defina Cross-account como No
Selecione o PolarDB Instance ID e insira a Database Account e a Database Password
Defina Connection Type como Non-encrypted Connection
Informações do banco de dados de destino:
Defina Database Type como Elasticsearch
Defina Access Method como Cloud Instance e defina Instance Region como China (Hangzhou)
Defina Type como Cluster
Selecione o Instance ID, defina Database Account como elastic e insira a Database Password
-
Configure os objetos a serem sincronizados.
Synchronization Type: selecione Schema Synchronization, Full Data Synchronization e Incremental Data Synchronization
Index Name: selecione TableName
Processing Mode of Conflicting Tables: selecione Pre-check and Report Errors
Case Sensitivity Policy for Object Names in the Destination Database: selecione DTS Default Policy
Na seção Source Objects, mova a tabela product do banco de dados test_polardb para a seção Selected Objects
Configure as definições avançadas. Neste exemplo, mantenha as configurações padrão.
-
Na página Database/Table/Column Settings, clique em Set All to Non-_routing Policy.
Se o cluster do Elasticsearch de destino executar a versão 7.x, defina a política de roteamento como non-routing para todas as tabelas.
-
-
Após concluir a configuração, salve a tarefa de sincronização de dados, execute a verificação prévia e adquira uma instância do DTS para iniciar a sincronização.
Depois de adquirir a instância do DTS, a tarefa de sincronização será iniciada automaticamente. Acompanhe o progresso na página Data Synchronization. Quando a sincronização completa terminar, consulte os dados sincronizados no cluster do Elasticsearch.
Na coluna Running Phase Information, visualize o andamento da sincronização, dividido em três fases: Schema Synchronization, Full Data Synchronization e Incremental Data Synchronization. Uma marca de verificação verde aparece após a conclusão de cada fase.
Etapa 3 (Opcional): Verifique os resultados da sincronização de dados
-
Acesse o console do Kibana do cluster do Elasticsearch.
Para mais informações, consulte Log on to the Kibana console.
Na página do Kibana, navegue até . No Console, execute os comandos a seguir.
-
Verifique o resultado da sincronização dos dados completos.
Execute o seguinte comando:
GET /product/_searchSe o comando for executado com sucesso, o seguinte resultado será retornado:
{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 5, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "product", "_type" : "product", "_id" : "3", "_score" : 1.0, "_source" : { "id" : 3, "name" : "mobile phone C", "price" : "2600", "code" : "cmp", "color" : "black" } }, { "_index" : "product", "_type" : "product", "_id" : "5", "_score" : 1.0, "_source" : { "id" : 5, "name" : "mobile phone E", "price" : "2800", "code" : "emp", "color" : "silvery" } }, { "_index" : "product", "_type" : "product", "_id" : "4", "_score" : 1.0, "_source" : { "id" : 4, "name" : "mobile phone D", "price" : "2700", "code" : "dmp", "color" : "red" } }, { "_index" : "product", "_type" : "product", "_id" : "2", "_score" : 1.0, "_source" : { "id" : 2, "name" : "mobile phone B", "price" : "2200", "code" : "bmp", "color" : "white" } }, { "_index" : "product", "_type" : "product", "_id" : "1", "_score" : 1.0, "_source" : { "id" : 1, "name" : "mobile phone A", "price" : "2000", "code" : "amp", "color" : "golden" } } ] } } -
Verifique o resultado da sincronização dos dados incrementais.
-
Execute a instrução a seguir para inserir um registro de dados na tabela source:
INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (6,'mobile phone F','2750','fmp','white'); -
Após a conclusão da sincronização incremental, execute novamente o comando
GET /product/_searchpara visualizar o resultado.Se o comando for executado com sucesso, o seguinte resultado será retornado:
{ "took" : 439, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 6, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "product", "_type" : "product", "_id" : "3", "_score" : 1.0, "_source" : { "id" : 3, "name" : "mobile phone C", "price" : "2600", "code" : "cmp", "color" : "black" } }, { "_index" : "product", "_type" : "product", "_id" : "5", "_score" : 1.0, "_source" : { "id" : 5, "name" : "mobile phone E", "price" : "2800", "code" : "emp", "color" : "silvery" } }, { "_index" : "product", "_type" : "product", "_id" : "4", "_score" : 1.0, "_source" : { "id" : 4, "name" : "mobile phone D", "price" : "2700", "code" : "dmp", "color" : "red" } }, { "_index" : "product", "_type" : "product", "_id" : "2", "_score" : 1.0, "_source" : { "id" : 2, "name" : "mobile phone B", "price" : "2200", "code" : "bmp", "color" : "white" } }, { "_index" : "product", "_type" : "product", "_id" : "6", "_score" : 1.0, "_source" : { "code" : "fmp", "color" : "white", "price" : "2750", "name" : "mobile phone F", "id" : 6 } }, { "_index" : "product", "_type" : "product", "_id" : "1", "_score" : 1.0, "_source" : { "id" : 1, "name" : "mobile phone A", "price" : "2000", "code" : "amp", "color" : "golden" } } ] } }
-
> Management > Dev Tools