O Monstache sincroniza dados do ApsaraDB for MongoDB com o Alibaba Cloud Elasticsearch em tempo real ao monitorar os oplogs do MongoDB. Este tutorial apresenta uma configuração completa, utilizando um conjunto de dados de filmes para demonstrar a sincronização completa, a sincronização incremental e a análise de dados no Kibana.
O Monstache sincroniza e assina dados em tempo real com base nos oplogs do MongoDB. Ele oferece suporte a change streams e pipelines de agregação do MongoDB, permitindo a sincronização de dados entre bancos de dados MongoDB e versões mais recentes de clusters Elasticsearch. Para obter mais informações sobre os recursos do Monstache, consulte Features.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma conta Alibaba Cloud com permissões para criar instâncias ECS, instâncias do ApsaraDB for MongoDB e clusters Elasticsearch
Conhecimento básico de operações de linha de comando Linux
Como funciona
O Monstache utiliza o oplog do MongoDB como fonte de eventos. Todas as operações de inserção, atualização e exclusão no MongoDB são registradas no oplog; o Monstache monitora esse log e propaga as alterações para o Elasticsearch quase em tempo real. Como o oplog é um recurso de conjunto de réplicas, sua instância do MongoDB deve ser um conjunto de réplicas ou um cluster fragmentado — instâncias independentes não têm suporte.
Etapa 1: Criar os recursos necessários
Crie os seguintes recursos na mesma virtual private cloud (VPC). Manter todos os três recursos na mesma VPC garante que a transmissão de dados ocorra pela rede interna, com segurança e alta velocidade.
Crie um cluster Elasticsearch. Durante a criação, ative o recurso Auto Indexing. Este tutorial utiliza um cluster Elasticsearch V6.7 Standard Edition. Para obter detalhes, consulte Criar um cluster Alibaba Cloud Elasticsearch e Configurar o arquivo YML.
-
Crie uma instância de conjunto de réplicas do ApsaraDB for MongoDB. Este tutorial utiliza uma instância de conjunto de réplicas do ApsaraDB for MongoDB V4.2. Prepare seus dados de teste após a criação — a figura abaixo mostra parte do conjunto de dados de filmes usado como exemplo. Para obter detalhes, consulte Início rápido para instâncias de conjunto de réplicas.
ImportanteA instância do ApsaraDB for MongoDB deve ser uma instância de conjunto de réplicas ou de cluster fragmentado. O Monstache usa o oplog como fonte de eventos, recurso disponível apenas nesses tipos de instância.

Crie uma instância do Elastic Compute Service (ECS). A instância ECS hospedará o Monstache e deve executar Linux. Para obter detalhes, consulte Criar uma instância usando o assistente.
Garanta que a versão do Monstache instalada seja compatível com as versões da sua instância do ApsaraDB for MongoDB e do cluster Elasticsearch. Para informações sobre compatibilidade de versões, consulte Monstache version.
Etapa 2: Instalar o Monstache
Instale o Monstache na instância ECS compilando a partir do código-fonte. Antes da instalação, certifique-se de ter configurado as variáveis de ambiente do Go.
-
Faça login na instância ECS. Para obter detalhes, consulte Conectar-se a uma instância Linux usando senha ou chave.
NotaEste exemplo utiliza um usuário comum (não root).
-
Baixe e extraia o Go.
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xzf go1.14.4.linux-amd64.tar.gz -
Configure as variáveis de ambiente do Go. Abra o arquivo
~/.bash_profile:vim ~/.bash_profileAdicione as linhas a seguir. A variável
GOPROXYaponta para o proxy de módulos Go do Alibaba Cloud, o que melhora a velocidade de download.export GOROOT=/home/test1/go export GOPATH=/home/go/ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin export GOPROXY=https://mirrors.aliyun.com/goproxy/Aplique as alterações:
source ~/.bash_profile -
Clone o repositório do Monstache.
NotaSe o erro
git: command not foundaparecer, instale o git primeiro:sudo yum install -y git.git clone https://github.com/rwynn/monstache.git -
Mude para a branch rel5 e instale.
cd monstache git checkout rel5 sudo go install -
Verifique a instalação.
monstache -vSaída esperada:
5.5.5
Etapa 3: Configurar e iniciar a sincronização de dados
O Monstache utiliza o formato TOML para configuração. Neste tutorial, os dados serão sincronizados a partir das coleções hotmovies e col no banco de dados mydb.
-
No diretório do monstache, crie um arquivo de configuração.
vim config.toml -
Adicione a configuração abaixo. Substitua os valores de espaço reservado pelos seus endpoints e credenciais reais.
# connection settings mongo-url = "mongodb://<your_mongodb_user>:<your_mongodb_password>@dds-bp1aadcc629******.mongodb.rds.aliyuncs.com:3717" elasticsearch-urls = ["http://es-cn-mp91kzb8m00******.elasticsearch.aliyuncs.com:9200"] # collections to sync (full-sync on startup, then tail oplogs) direct-read-namespaces = ["mydb.hotmovies","mydb.col"] # to use MongoDB change streams instead of oplog tailing (requires MongoDB 3.6+): #change-stream-namespaces = ["mydb.col"] # filter to specific collections (oplog listener only, does not trigger a full-sync): #namespace-regex = '^mydb\.col$' # Elasticsearch credentials # For production use, create a dedicated account instead of using the default elastic account. # Assign only the permissions the account needs. See Use the RBAC mechanism provided by # Elasticsearch X-Pack to implement access control. elasticsearch-user = "elastic" elasticsearch-password = "<your_es_password>" # number of concurrent Go threads pushing documents to Elasticsearch elasticsearch-max-conns = 4 # propagate collection and database deletions to Elasticsearch dropped-collections = true dropped-databases = true # save sync progress to monstache.monstache so sync can resume after a restart resume = true resume-strategy = 0 # enable debug logging (logs all requests to Elasticsearch) verbose = true # high availability mode: processes sharing the same cluster-name cooperate cluster-name = 'es-cn-mp91kzb8m00******' # index mappings: override the default database.collection index name [[mapping]] namespace = "mydb.hotmovies" index = "hotmovies" type = "movies" [[mapping]] namespace = "mydb.col" index = "mydbcol" type = "collection"Principais parâmetros:
Parâmetro
Descrição
mongo-urlString de conexão para o nó primário da sua instância do ApsaraDB for MongoDB. Obtenha-a na página de detalhes da instância no console do ApsaraDB for MongoDB. Antes de conectar, adicione o endereço IP privado da instância ECS à lista de permissões da instância MongoDB. Consulte Configurar uma lista de permissões para uma instância de cluster fragmentado.
elasticsearch-urlsEndpoint interno do seu cluster Elasticsearch no formato
http://<endpoint>:9200. Obtenha-o na página Basic Information do seu cluster. Consulte Visualizar as informações básicas de um cluster.direct-read-namespacesColeções a serem copiadas do MongoDB na inicialização (sincronização completa), especificadas como
database.collection. Consulte direct-read-namespaces.change-stream-namespacesUtiliza change streams do MongoDB em vez de monitoramento de oplog. Quando configurado, o monitoramento de oplog é desativado. Requer MongoDB 3.6 ou superior. Consulte change-stream-namespaces.
namespace-regexExpressão regular para filtrar quais coleções o Monstache monitora. Este filtro aplica-se apenas ao listener de eventos de alteração e não aciona uma sincronização completa.
elasticsearch-userNome de usuário para autenticação no Elasticsearch. O padrão é
elastic.elasticsearch-passwordSenha do usuário do Elasticsearch. Caso tenha esquecido, redefina-a. Consulte Redefinir a senha de acesso de um cluster Elasticsearch.
elasticsearch-max-connsNúmero de threads Go simultâneas gravando no Elasticsearch. O padrão é
4.dropped-collectionsQuando definido como
true(padrão), exclui o índice Elasticsearch mapeado quando uma coleção do MongoDB é removida.dropped-databasesQuando definido como
true(padrão), exclui os índices Elasticsearch mapeados quando um banco de dados MongoDB é removido.resumeQuando definido como
true, salva os timestamps do oplog emmonstache.monstache, permitindo retomar a sincronização após uma reinicialização sem perda de dados. Configurado automaticamente comotruequandocluster-nameestá definido. Consulte resume.resume-strategyEstratégia de retomada (válida apenas quando
resumeétrue). O valor0utiliza timestamps. Consulte resume-strategy.verboseQuando definido como
true, ativa logs de depuração, incluindo rastreamentos de requisições ao Elasticsearch. O padrão éfalse.cluster-nameAtiva o modo de alta disponibilidade. Processos do Monstache que compartilham o mesmo
cluster-namecoordenam suas atividades. Consulte cluster-name.mappingSubstitui o nome padrão do índice (que é
database.collection). Consulte Index Mapping.NotaO Monstache oferece suporte a muitos outros parâmetros de configuração. Para cenários avançados, como transformação baseada em scripts, indexação GridFS ou filtragem complexa, consulte Monstache config e Advanced.
-
Inicie o Monstache.
monstache -f config.tomlA flag
-fcarrega o arquivo de configuração especificado. Comoverbose = trueestá definido na configuração, o Monstache registrará todos os rastreamentos de requisições ao Elasticsearch.
Etapa 4: Verificar a sincronização de dados
Utilize o console Data Management (DMS) para consultas no MongoDB e o console Kibana para consultas no Elasticsearch.
Para acesso via DMS, consulte Conectar-se a uma instância de conjunto de réplicas usando o DMS.
Para acesso via Kibana, consulte Fazer login no console Kibana.
Verificar contagem de documentos após a sincronização completa
Execute as consultas a seguir para confirmar se a mesma contagem de documentos aparece em ambos os sistemas.
MongoDB:
db.hotmovies.find().count()
Saída esperada:
[
10000
]
Elasticsearch:
GET hotmovies/_count
Saída esperada:
{
"count" : 10000,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
}
}
Testar sincronização de inserção
Insira dois documentos no MongoDB:
db.hotmovies.insert({id: 11003,title: "Beauty",overview: "How a group of IT women with high IQ become outstanding",original_language:"cn",release_date:"2020-06-17",popularity:67.654,vote_count:65487,vote_average:9.9})
db.hotmovies.insert({id: 11004,title: "Heroic Programmers",overview: "How a group of IT men with high IQ become outstanding",original_language:"cn",release_date:"2020-06-15",popularity:77.654,vote_count:85487,vote_average:11.9})
Consulte o Elasticsearch para confirmar se os documentos foram sincronizados:
GET hotmovies/_search
{
"query": {
"bool": {
"should": [
{"term":{"id":"11003"}},
null
]
}
}
}

Testar sincronização de atualização
Atualize um documento no MongoDB:
db.hotmovies.update({'title':'Beauty'},{$set:{'title':'Beautiful Programmers'}})
Consulte o Elasticsearch para confirmar a atualização:
GET hotmovies/_search
{
"query": {
"match": {
"id":"11003"
}
}
}

Testar sincronização de exclusão
Remova os documentos do MongoDB:
db.hotmovies.remove({id: 11003})
db.hotmovies.remove({id: 11004})
Consulte o Elasticsearch para confirmar que os documentos foram removidos:
GET hotmovies/_search
{
"query": {
"bool": {
"should": [
{"term":{"id":"11003"}},
null
]
}
}
}

Etapa 5: Analisar dados no Kibana
Este tutorial utiliza o Kibana V6.7.0. A navegação pode variar em outras versões.
Faça login no console Kibana. Para obter detalhes, consulte Fazer login no console Kibana.
-
Crie um padrão de índice.
No painel de navegação à esquerda, clique em Management.
Na seção Kibana, clique em Index Patterns.
Clique em Create index pattern.
Defina o Index pattern e clique em Next step.
Defina o Time Filter field name como I don't want to use the Time Filter.
Clique em Create index pattern.

-
Crie um gráfico de pizza para os 10 filmes mais populares.
No painel de navegação à esquerda, clique em Visualize.
Clique no ícone + ao lado da caixa de pesquisa.
Na caixa de diálogo New Visualization, clique em Pie.

Clique no padrão de índice hotmovies.

Configure as seções Metrics e Buckets conforme mostrado.

Clique no ícone
para aplicar a configuração. 
Perguntas frequentes
Após ativar a alta disponibilidade e aumentar a concorrência, ocorre perda de dados. O que devo fazer?
Verifique primeiro se o cluster Elasticsearch está saudável. Se o cluster estiver em estado anormal, consulte as Perguntas frequentes do Elasticsearch para diagnosticar e resolver problemas no nível do cluster. Em seguida, reduza o valor de elasticsearch-max-conns e monitore quanto a novas perdas de dados.
Se o cluster estiver saudável, o problema provavelmente reside no Monstache. Consulte a documentação do Monstache para verificar problemas conhecidos e orientações de configuração.