sincronização de dados de um milhão de produtos em tempo real, os resultados da consulta em segundos

Um tempo atrás, o chefe organizado para uma nova missão, para construir um sistema de busca de produtos negócio, pode fornecer aos usuários com rápido, capacidades de pesquisa precisos, a entrada do usuário na busca de conteúdo para a partir do nome da empresa e nome do produto para procurar duas dimensões, Pesquisar os resultados, de acordo com a precisão de empresas de ordenação, de associação e de imprensa de propriedade de bens a uma combinação de estruturas de dados, oferecendo chamadas de API para o sistema de negócios.

Fundo é muito simples, a realidade é bastante complicado! Somos confrontados com os seguintes desafios:
① banco de dados comercial de mercadorias e de banco de dados são vários servidores diferentes, ea capacidade de dados de um milhão, como podemos alcançar a sincronização de dados entre bancos de dados é?

② comerciantes de commodities e dados é afiliação, ou será que o picante de frango hambúrguer McDonald para KFC para pendurar, que é embaraçoso!

③ dados negócio de commodities é atualizado com freqüência, como para modificar o preço, inventário, para cima e para baixo e assim, o serviço de pesquisa que não podem ser apreendidos bando de dados desatualizados, se o cliente obviamente descobriu a mercadoria, o último ponto já na moldura, em seguida, clientes vão Tucao! Como pesquisar dados de origem CRUD banco de dados são sincronização em tempo real dele?

Com o acima de três questões, começamos uma busca por serviços gerais de projeto de arquitetura.

idéias de design de arquitetura de sistema

A fim de projetar a arquitetura do sistema direita, foi analisada a situação atual.
Primeiro, os dados de negócios e dados de produtos são armazenadas em dois bancos de dados MySQL8 separado, a fim de atender a Associated dados de negócios e dados de produtos, precisamos mesa duas bibliotecas necessárias para ETL em tempo real para o nosso sistema de pesquisa de banco de dados.

Em segundo lugar, os dados do comerciante, sistema de ETL de banco de dados de commodities para procurar o banco de dados, você precisa se tornar uma combinação de estrutura de dados de produto associado de negócios em tempo real e formato do pai documento e filho, ele é armazenado nos ES.

Finalmente, comerciantes, operações CRUD de bancos de dados de commodities, você precisa em tempo real sincronizado com o ES, os dados ES que está na necessidade de apoiar em tempo real adições, exclusões e modificações.

Para este fim, nós projetamos dois componentes canal, o primeiro canal de ETL de dados, os comerciantes, alguns da base de dados tabelas e campos de commodities, extrair o banco de dados do serviço de pesquisa; reciclar o segundo canal, leia MySQL serviços de pesquisa de banco de dados do log binário, kafka transmissão em tempo real para a fila de mensagens, em seguida, os dados associados com o adaptador do canal, mapeamento documento pais e filhos, os dados processados ​​são armazenados em ElasticSearch.

desenho DETALHADA arquitectura do sistema, como mostrado na FIG.

projeto de arquitetura do sistema de pesquisa de produtos Merchant


combate projecto

1, e o ambiente de software

Sistema operacional: CentOS 7
canal: canal.adapter-1.1.4, canal.deployer-1.1.4
Kafka: kafka_2.12-2.3.0
ElasticSearch: ElasticSearch-6.3.2
Kibana: Kibana-6.3.2

2, implementado usando ETL dados Canal de MySQL8

Este passo é o uso do canal de dois bancos de dados MySQL8 separado, extrair tabelas precisa procurar o banco de dados MySQL.

canaldeployer 2.1 Instalação

(1) extracção canal.deployer-1.1.4.tar.gz
(2) de configuração de canal implementador
Digite diretório canaldeployer / conf, modificar o arquivo canal.properties, ServerMode configuração principal, MQ e destino de três partes.
Primeiro de tudo, nós ServerMode revisto para o modo kafka, aumentando a capacidade de buffer do sistema e melhorar a estabilidade do sistema:

modo de servidor


Em seguida, a configuração do MQ informações kafka (kafka sua própria instalação):

informações kafka MQ


Finalmente, as necessidades de configuração para instância instanciar, onde a configuração de três, expressado canal implantar três começa neste exemplo, a sincronização do MySQL log binário para o kafka tópico. Tal como mostrado abaixo:

Exemplos de destinos dispostas


(3) 配置 exemplo canal implementador
Digite canaldeployer / example diretório conf /, encontrou um instance.properties arquivo, que é um exemplo para o canal, podemos nos referir a sua configuração.
① exemplo, copiar todo o catálogo, chamado tanto um destino configurado em um passo, como xxxsearch;
② entrar diretório xxxsearch, arquivo editar instance.properties, a principal fonte das tabelas e campos de dados de informações de banco de dados de configuração necessários, bem como o nome do tópico especificado kafka, binlog esta base de dados de origem serão convertidos em dados JSON, e transmissão em tempo real através do implementador canal para kafka no tópico. Da seguinte forma:

banco de dados fonte instância canaldeploy configuração


canaldeploy tópico instância kafka 配置


③ para o directório canaldeployer / bin, ./startup.sh executada, e o respectivo canal de partida implementador exemplos.
Assim canal deployer estruturas concluídas.

canal.adapter 2.2 Instalação

Precisamos usar canal.adapter kafka binlog JSON dados para o tema, operação de conversão limpas, o MySQL8 armazenado. Uma vez que o canal não é MySQL8 suporte nativo, por isso precisamos fazer alguns ajustes.
(1) o aumento da ligação de accionamento MySQL8
Extraindo canal.adapter-1.1.4.tar.gz, entrar canaladapter / lib, remover mysql-connector-java-5.1.40.jar, introduziu-mysql conector-java-8.0.18.jar

(2) de configuração do adaptador do canal, de modo que os dados são produzidos para MySQL8.
Digite canaladapter / conf, arquivo application.yml editar, kafka consumo de configuração principal, as informações do banco de dados de origem e informações de banco de dados sistema de busca, como segue:

ETL configuração para MySQL8


Em seguida, digite canaladapter / conf / RDB diretório para oficial mytest_user.yml como exemplo, a configuração kafka nome do tópico, o nome do banco de dados de origem, nome da tabela fonte de dados e o nome do nome do banco alvo e tabela de dados alvo, recomendado A corresponde tabela para um yml arquivo .

estrutura da tabela de configuração de mapeamento de ETL


(3) canaladapter Iniciar
Digite canaladapter diretório / bin, execute ./startup.sh, começar adaptador de canal, observação logs / adaptador / adapter.log arquivo de log, adicionar manualmente um registro no sistema de pesquisa de banco de dados, para ver se ele irá imprimir os seguintes logs, que existem dois registros , a INFO, uma depuração, a configuração é bem sucedida.
log canaladapter
Até agora, a fase de ETL de dados criado for concluída, os dados de dois bancos de dados MySQL8 diferente, sincronização em tempo real para o serviço de pesquisa de banco de dados MySQL.

3, os dados associados a multi-mesa, e seu filho Documento Mapa

(1) A configuração do segundo canal canaladapter
Digite canaladapter / conf, arquivo application.yml editar, kafka consumo de configuração principal, o sistema de pesquisa de banco de dados, ES e informações de conexão, como mostrado abaixo:

canaladapter MQ configuração e mysql


canaladapter ES configuração


tabela de correlação múltiplos (2) de configuração
Digite canaladapter / conf / es diretório, vim mytest_user.yml, editor de configurações multi-mesa associados:

Multi-tabela de configuração associado

Note-se que, o apoio sql multi-tabela associada com a combinação livre, mas existem algumas limitações:
(A) da tabela principal não pode ser sub-consulta
(B) Isso só pode usar a junção externa esquerda mais à esquerda da tabela deve ser uma tabela primária
(C) se for ligado a partir da subconsulta a tabela não pode ter mais tabelas
(D), onde não pode ser a principal consulta SQL (a partir da tabela subconsulta onde as condições podem ser, mas não é recomendado e pode resultar em sincronização de dados inconsistentes, tal como alterar o conteúdo do campo onde as condições)
(E) a condição de ligação primário permite única chave estrangeira '=' Analisando acções podem ocorrer em outras constantes, tais como: na a.role_id = b.id e b.statues = 1
(F) deve ser associado a um campo de condição na instrução de consulta principal, tais como: na a.role_id = b.id em que a.role_id b.id deve aparecer na demonstração principal ou seleccione
(L) e mapeamento valor de atributo consulta SQL de elástico de pesquisa será 1-1 (não suportada por escolha *), tais como: seleccione a.id como _id, a.name, a.email como _email do utilizador, onde o nome é mapeado para es de mapeamento do campo de nome, _email vai mapear para mapeamento de campo _email, onde o alias (se um alias) como o campo mapa final _id aqui pode preencher o perfil _id :. mapa _id.
(3) Configuração e sua documentação filho
Um funcionário do biz_order.yml por exemplo, biz_order.yml vim, pai e filho mapeamento documento configure:

arquivo pai e configuração de mapeamento filho


(4) Em ElasticSearch6, criar documentos de mapeamento de relação de índice e entre pais e filhos
Entrar na página Kibana, clique em Ferramentas Dev, execute o seguinte comando para criar o índice e documento de mapeamento pai e filho:
Estabelecer um índice de pai-filho e mapeamento documento
Em que, para ES6 e Kibana instalado, esta configuração não é particularmente, não é aqui descrito.

Adaptador de canal (5) Iniciar
Digite canaladapter diretório / bin, execute ./startup.sh, começar adaptador de canal, observação logs / adaptador / adapter.log arquivo de log, adicionar manualmente um registro no sistema de pesquisa de banco de dados, para ver se ele vai imprimir os seguintes registos, como as configura comando de impressão sucesso.
Exemplo adaptador log está configurado correctamente

4, os resultados operacionais

Nós agora pode ser realizada por declaração Kibana DSL para consultar uma olhada.
Nós tinha sido aumentada no sistema de negócios um "KFC" loja, e depois adicionar o "tomate" e "tomate fresco" duas commodities no sistema mercantil, e itens relacionados à "KFC". Então nós consulta "KFC" ou "tomate", o seguinte é o resultado de uma consulta (ES remove os campos padrão):
resultados da consulta DSL
Visto no gráfico, podemos consultar pela mercadoria nome da empresa, lojas ea mercadoria pode também inquire pelo nome comercial, e de apoio adições de dados em tempo real e exclusões no canal, os dados ES será consistente com os sistemas de negócios e sistemas comerciais e estrutura de dados contém empresas e produtos correspondentes, para atender às necessidades de negócios.

5, resumo

Neste ponto, baseado em Canal, kafka, MySQL8, tecnologia ElasticSearch6 estrutura básica do sistema de pesquisa de produtos de negócios para construir completa. Nós usamos em tempo real comerciantes acesso canal Deployer, mercadoria de banco de dados MySQL sistema de log binário, e enviado para kafka, seguido de multi-mesa pelo adaptador de canal associado com o kafka consumo e dados JSON binlog, pai mapeamento documento e filho, e finalmente armazenado em ES6, para o superior Pesquisar chamada de serviço.
O sucesso do sistema de serviço de pesquisa on-line, sincronização de dados em tempo real, resultados de segundo nível que você atingir os requisitos de negócio, o chefe disse, para acrescentar um frango por pessoa equipe de P & D para a empresa um milhão de comerciantes de bens! Acho que há pouco de emoção, hehe ~ ~

Autor: Kevin, Pico Tecnologia engenheiro sênior Java, preocupado com as "pequenas Technologies" para secar mais técnico


Acho que você gosta

Origin juejin.im/post/5e6989faf265da5756326908
Recomendado
Clasificación