Produtos secos | Debezium realiza sincronização eficiente em tempo real de Mysql para Elasticsearch

Inscrição

Perguntas da comunidade chinesa Elasticsearch——

Não há nenhum campo incremental exclusivo e nenhum campo de tempo incremental exclusivo para tabelas no MySQL. Como usar o logstash para realizar a importação de dados incrementais em tempo real do MySQL para es?

Tanto o logstash quanto o kafka_connector oferecem suporte apenas à sincronização incremental de dados com base no id de autoincremento ou na atualização do carimbo de data / hora.

De volta à própria pergunta: Se não houver campos relacionados na tabela da biblioteca, o que devo fazer?

Este artigo oferece discussões e soluções relevantes.

1. Reconhecimento binlog

1.1 O que é binlog?

Binlog é um log binário mantido pela camada do servidor Mysql. É um log completamente diferente do log de redo / undo no mecanismo InnoDB; é usado principalmente para registrar instruções SQL que atualizam ou potencialmente atualizam dados mysql e usam "transações" O formulário é salvo no disco.

As principais funções são:

  • 1) Replicação: Para atingir o objetivo de dados mestre-escravo consistentes.
  • 2) Recuperação de dados: recupere dados por meio da ferramenta mysqlbinlog.
  • 3) Backup incremental.

1.2 O canal de Ali realiza sincronização incremental do Mysql

Produtos secos | Debezium realiza sincronização eficiente em tempo real de Mysql para Elasticsearch

Uma imagem vale mais que mil palavras Canal é um middleware desenvolvido com java baseado em análise de log incremental de banco de dados, fornecendo assinatura e consumo de dados incrementais.
No momento, o canal suporta principalmente a análise binlog do MySQL, e o cliente do canal é usado para processar os dados relacionados após a conclusão da análise. Objetivo: assinatura e consumo de dados incrementais.

Em resumo, o uso de binlog pode romper as limitações do logstash ou do conector kafka sem id de autoincremento ou nenhum campo de carimbo de data / hora e obter sincronização incremental.

2. Método de sincronização baseado em binlog

1) Projeto de código aberto Debezium baseado em kafka Connect, endereço: https://debezium.io/

2) Aplicativos independentes que não dependem de terceiros: projeto de código aberto Maxwell, endereço: http://maxwells-daemon.io/

Como o conluent (a versão corporativa do kafka, que vem com zookeeper, kafka, ksql, kafka-connector, etc.) foi implementado, este artigo é apenas para o Debezium.

3. Introdução ao Debezium

Debezium é uma plataforma de sincronização distribuída de código aberto que captura mudanças dinâmicas de dados em tempo real. Captura em tempo real de fontes de dados (Mysql, Mongo, PostgreSql): adicionar (inserir), atualizar (atualizar), excluir (excluir) operações, sincronização em tempo real para Kafka, forte estabilidade e muito rápido.

Características:

  • 1) Simples. Não há necessidade de modificar o aplicativo. Pode fornecer serviços externos.
  • 2) Estável. Acompanhe todas as alterações em cada linha.
  • 3) Rápido. Construído no Kafka, é escalonável e pode lidar com dados de grande capacidade após verificação oficial.

    4. Arquitetura síncrona

    Produtos secos | Debezium realiza sincronização eficiente em tempo real de Mysql para Elasticsearch

Conforme mostrado na figura, a estratégia de sincronização de Mysql para ES adota o mecanismo de "curva para salvar o país".

Etapa 1: Com base no mecanismo binlog do Debezium, sincronize os dados do Mysql com o Kafka.

Etapa 2: com base no mecanismo Kafka_connector, sincronize os dados do Kafka com o Elasticsearch.

5. O Debezium realiza a sincronização em tempo real do Mysql para adição, exclusão e modificação de ES

Versão do software:

confluente : 5.1.2 ;
Debezium : 0.9.2_Final;
Mysql : 5.7.x.
Elasticsearch : 6.6.1

5.1 Instalação do Debezium

Para a instalação e implantação do confluente, consulte: http://t.cn/Ef5poZk, então não entrarei em detalhes aqui .

A instalação do Debezium precisa apenas descompactar o pacote compactado do debezium-connector-mysql e colocá-lo no diretório de plug-in descompactado (share / java) do Confluent.

Link para download do pacote compactado do plugin MySQL Connector:

https://debezium.io/docs/install/

Preste atenção para reiniciar o confluente para que o Debezium tenha efeito.

5.2 Binlog Mysql e outras configurações relacionadas.

O Debezium usa o mecanismo binlog do MySQL para monitorar mudanças dinâmicas de dados, então o MySQL precisa configurar o binlog antecipadamente.

A configuração principal é a seguinte, adicione a seguinte configuração em mysqld em /etc/my.cnf da máquina Mysql.

1[mysqld]
2
3server-id         = 223344
4log_bin           = mysql-bin
5binlog_format     = row
6binlog_row_image  = full
7expire_logs_days  = 10

Em seguida, reinicie o Mysql para que o binlog tenha efeito.

1systemctl start mysqld.service

5.3 Configure o conector do conector.

Configure o diretório do caminho confluente: / etc

Comando para criar pasta:

1mkdir kafka-connect-debezium

Armazene as informações de configuração do conector em mysql2kafka_debezium.json:

1[root@localhost kafka-connect-debezium]# cat mysql2kafka_debezium.json
 2{ 
 3        "name" : "debezium-mysql-source-0223",
 4        "config":
 5        {
 6             "connector.class" : "io.debezium.connector.mysql.MySqlConnector",
 7             "database.hostname" : "192.168.1.22",
 8             "database.port" : "3306",
 9             "database.user" : "root",
10             "database.password" : "XXXXXX",
11             "database.whitelist" : "kafka_base_db",
12             "table.whitlelist" : "accounts",
13             "database.server.id" : "223344",
14             "database.server.name" : "full",
15             "database.history.kafka.bootstrap.servers" : "192.168.1.22:9092",
16             "database.history.kafka.topic" : "account_topic",
17             "include.schema.changes" : "true" ,
18             "incrementing.column.name" : "id",
19             "database.history.skip.unparseable.ddl" : "true",
20             "transforms": "unwrap,changetopic",
21             "transforms.unwrap.type": "io.debezium.transforms.UnwrapFromEnvelope",
22             "transforms.changetopic.type":"org.apache.kafka.connect.transforms.RegexRouter",
23             "transforms.changetopic.regex":"(.*)",
24             "transforms.changetopic.replacement":"$1-smt"
25        }
26}

Observe a seguinte configuração:

  1. "database.server.id" corresponde à configuração do server-id no Mysql.
  2. "database.whitelist": O nome do banco de dados Mysql a ser sincronizado.
  3. "table.whitlelist": O nome da tabela Mysq a ser sincronizada.
  4. Importante: "database.history.kafka.topic": armazena as informações de registro Shcema do banco de dados, não o tópico,
  5. "database.server.name": o nome lógico, cada conector é único, como o nome do prefixo do tópico Kafka onde os dados são gravados.

Pit 1: A função de configuração de 5 linhas relacionada às transformações é gravar a conversão do formato de dados.

Caso contrário, os dados de entrada incluirão: antes, depois, antes e depois da modificação do registro e informações de metadados (fonte, op, ts_ms, etc.).

Esta informação não é necessária na gravação de dados subsequente no Elasticsearch. (Preste atenção em combinar seus próprios cenários de negócios).

Princípios relacionados à conversão de formato: http://t.cn/EftoaIi

5.4 Inicie o conector

1curl -X POST -H "Content-Type:application/json" 
2--data @mysql2kafka_debezium.json.json 
3http://192.168.1.22:18083/connectors | jq

5.5 Verifique se a gravação foi bem-sucedida.

5.5.1 Ver tópico kafka

1    kafka-topics --list --zookeeper localhost:2181

Aqui você verá as informações gravadas no tópico de dados.

Preste atenção ao formato do tópico de dados recém-escrito: database.schema.table-smt consiste em três partes.

Nome do tópico deste exemplo:

full.kafka_base_db.account-smt

5.5.2 A gravação de verificação de dados de consumo é normal

1./kafka-avro-console-consumer --topic full.kafka_base_db.account-smt --bootstrap-server 192.168.1.22:9092 --from-beginning

Neste ponto, o Debezium concluiu a sincronização do mysql kafka.

6, o conector kafka realiza a sincronização do kafka Elasticsearch

6.1 Introdução ao conector Kafka

Veja o site oficial: https://docs.confluent.io/current/connect.html

O Kafka Connect é uma estrutura para conectar o Kafka a sistemas externos (como bancos de dados, armazenamentos de valores-chave, índices de sistema de recuperação e sistemas de arquivos).

O conector percebe que os dados de origem de dados comuns (como Mysql, Mongo, Pgsql, etc.) são gravados no Kafka, ou os dados do Kafka são gravados no banco de dados de destino, ou você pode desenvolver seu próprio conector.

6.2, Kafka para configuração de sincronização do conector ES

Caminho de configuração:

1/home/confluent-5.1.0/etc/kafka-connect-elasticsearch/quickstart-elasticsearch.properties

Conteúdo da configuração:

1"connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
2"tasks.max": "1",
3"topics": "full.kafka_base_db.account-smt",
4"key.ignore": "true",
5"connection.url": "http://192.168.1.22:9200",
6"type.name": "_doc",
7"name": "elasticsearch-sink-test"

6.3 Kafka para conector de início ES

Comando de partida

1confluent load  elasticsearch-sink-test 
2-d /home/confluent-5.1.0/etc/kafka-connect-elasticsearch/quickstart-elasticsearch.properties

6.4 Visualização da API RESTFul do Kafka-connctor

Os detalhes do conector de Mysql2kafka e kafka2ES podem ser visualizados com a ajuda do carteiro ou de um navegador ou linha de comando.

1curl -X GET http://localhost:8083/connectors

7. Repetição do poço.

Pit 2: Podem ocorrer erros durante o processo de sincronização, por exemplo: o tópico Kafka não pode consumir dados.
As idéias para solução de problemas são as seguintes:

  • 1) Confirme se o tópico consumido é o tópico de gravação de dados;

  • 2) Confirme se não há erro durante a sincronização. Você pode usar o conector para visualizar os comandos a seguir.
1curl -X GET http://localhost:8083/connectors-xxx/status

Pit 3: Mysql2ES não reconhece o formato de data.

É o problema do pacote jar do Mysql .A solução: configure as informações de fuso horário em my.cnf.

Poço 4: Kafka2ES, ES não grava dados.

Resolva problemas de ideias:

  • 1) Sugestão: primeiro crie um índice consistente com o nome do tópico Nota: O mapeamento é personalizado estaticamente, não é uma identificação e geração dinâmica.
  • 2) Analise a causa do erro através do conector / status e analise passo a passo.

8. Resumo

  1. A realização do binlog rompe a limitação do campo. Na verdade, o go-mysql-elasticsearch da indústria foi implementado.

  2. Comparação: logstash, conector kafka, embora Debezium "curva para salvar o país" duas etapas para alcançar a sincronização em tempo real, mas a estabilidade + desempenho em tempo real é relativamente bom.

  3. Recomende que todos usem. Se você tiver um bom método de sincronização, deixe uma mensagem para discutir e trocar.

Referência:
[1] http://t.cn/EftX2p8
[2] http://t.cn/EftXJU6
[3] http://t.cn/EftXO8c
[4] http://t.cn/EftXn9M
[5] http://t.cn/EftXeOc

Leitura recomendada:
Blockbuster | Lista cognitiva da metodologia Elasticsearch (atualização do Festival da Primavera de 2019)
Produtos secos | Debezium realiza sincronização eficiente em tempo real de Mysql para Elasticsearch
Elasticsearch básica, avançada e primeira conta pública real

Acho que você gosta

Origin blog.51cto.com/15050720/2562050
Recomendado
Clasificación