Bom dia, sou novo no elastic e utilizo a versão instalada em um servidor linux, tenho a necessidade de liberar espaço em disco consumindo pelo elastic, os arquivos estão sendo gerados em /var/lib/elasticsearch/nodes/0/indices/
Como tentativa utilizei as informações desse link :
Porém apresentava alguns erros, hoje eu tenho 02 index , o principal é o que consome espaço em disco, gostaria de entender melhor o fluxo de limpeza do elastic (para liberar espaço em disco), no meu caso preciso manter dados dos últimos 6 meses, então gostaria de saber como funciona exatamente...se eu preciso criar um outro index para fazer a limpeza ? Se eu consigo aplicar a limpeza em um index existente e cheio de dados ?
Enfim, um norte de como é o fluxo e como fazer, meu muito obrigado !!
Oi Fernando,
Se você tem os dados todos em único índice, você não está usando a premissa do ILM e portanto configurar o ILM não vai adiantar. Você pode usar o delete_by_query definindo o critério de deleção na query. Muito cuidado ao executar o comando para não deletar seus dados.
Parece que você está usando time-series data e deveria estar armazenando seus dados em mais de um único index para ter uma melhor performance e mais flexibilidade. Se quiser compartilhar mais detalhes do seu caso de uso, eu posso te dar mais dicas.
Bom dia Pablo, muito obrigado pela resposta, a criação de índice foi outra equipe que fez, eu mesmo só instalei o Elastic, e realmente tem 2 índices (1 muito pequeno e o outro principal que consome grande espaço em disco), o timeseries o que seria ? Tem algum comando que posso rodar para trazer mais informações e postar aqui para você ter uma visão melhor de como posso proceder ?
Oi Fernando, GET _cat/indices e GET _cat/shards são bons comandos pra começar a ententer o cluster. Timeseries é um "modelo" e existem features que ajudam a implementar esse "modelo" de maneira mais simples, como o ILM. Como eu te falei o mais fácil é você compartilhar o caso de uso e alguns detalhes do deployment para podermos te enviar links que fazem sentido. Por exemplo, como você está ingerindo os dados? Qual o volume desses dados?
Bom dia Pablo, estou anexando o resultado do comando GET _cat/shards , tenho o indice excecao (que consome pouco espaço em disco) e o indice aplicacao (que consome bastante espaço), o estranho é na máquina que uso para homologar essa "limpeza" antes o indice aplicacao estava consumindo 240GB, hoje quando liguei mostra o consumo de 140GB, neste ambiente eu crie o ILM com polices, template , será que funcionou ? Tenho como conferir ?
Oi Fernando,
desculpas, mas por algum motivo, eu não recebi notificação pelo email. Você hoje em dia tem apenas um índice com todos os seus dados e não faz uso de ILM ou datastreams nesse índice. Como você está ingerindo os seus dados? E que tipo de dados são esses? Qual é a sua versão do Elasticsearch? Por hora, a única maneira de limpar o índice é usando o delete_by_query como falei anteriormente. Enquanto isso você trabalha na migração dos dados para poder usufruir do gerenciamento automático de indices/shards.
Bom dia Pablo !
Respondendo aos questionamentos :
Como você está ingerindo os seus dados? E que tipo de dados são esses?
Estamos gravando json em formato string com um post na url do endpoint do elasticsearch, o post é feito via HttpWebRequest usando StreamWriter e fazendo um GetResponse (HttpWebResponse).
A versão do Elastic é 7.6.2.
Pablo, para o meu cenário atual a única maneira de limpar os dados e manter os dados dos últimos 06 meses é usando delete_by_query ? (Não queremos apagar o indice, só manter os dados dos últimos 6 meses e também liberar espaço em disco).
Se sim, você teria algum exemplo deste comando ? (Será feito em ambiente de teste)
No seu caso você vai ter que mudar o nome do índice e a query para provavelmente uma range query usando a data que você deseja. O Beats e o Logstash implementam as políticas de gerenciamento de índice automaticamente e acaba sendo muito mais fácil usá-los. Como não parece ser o seu caso, você vai ter que configurar sozinho.
A idéia é que você tem um entry-point (alias) para escrever e ler, mas internamente existem uma séries de índices que são criados baseado na sua política de retenção. Dá uma lida nos docs aqui para entender melhor o conceito e vai postando as dúvidas aqui que te ajudo.
Pablo, o link que você mandou é o ILM (esse foi o que eu tentei implementar), mas pelo que eu entendi da forma que foi criada minha estrutura com apenas 1 indice , não é possível usar o ILM, é isso ?
Então para o meu cenário o que me resta é usar a query delete_by_query, correto ?
E posteriormente se eu instalar o Beast e o Logstash eu conseguiria fazer essa limpeza de forma automática, é isso ?
Ou se não for nada disso por favor me diga, no seu cenário atual a única alternativa para limpeza é fazer X e para futuramente você conseguir a limpeza de forma automática precisa fazer Y
Muito obrigado Pablo, estou fazendo esses questionamentos pois precisarei dividir com outras pessoas.
Você tem um cluster rodando com um único índice com um único shard. Todos os seus documentos estão neles e você quer deletar alguns desses documentos. Para fazer isso, você precisa usar o DELETE_BY_QUERY (esse foi o primeiro link que te mandei 13 dias atrás e o código de exemplo que postei mais cedo).
Depois de resolver esse problema, você pode começar a pensar em optimizar esse processo (e por consequência o seu cluster). Você não me deu muitos detalhes de como você está usando o Elasticsearch, mas acredito que você precisa fazer o seguinte. Ao invés de ter um único índice, você precisa de um alias apontando para vários índices. Esses índices serão criados e gerenciados automaticamente pelo Elasticsearch de acordo com as suas políticas (7 dias, 50GB, etc.). Isso é feito usando o ILM (segundo link que postei).
A transição da implementação atual para a nova implementação vai precisar ser feita com calma e testada antes para garantir que as coisas funcionam de acordo com o esperado.
Consegui executar a limpeza utilizado o comando abaixo :
POST /aplicacao/_delete_by_query
{
"query": {
"range": {
"horaLog": {
"lte": "now-6M"
}
}
}
}
Limpou, porém achei que liberou pouco espaço no indice e no disco (por volta de 20GB), hoje a pasta que consome praticamente todo o espaço em disco (200gb) é /var/lib/elasticsearch/nodes/0/indices/_wqaSrJ4Tky3FP7YUy950w/0/index$
Depois do comando que passou, tem mais algum outro procedimento necessário para liberar o espaço em disco ? Exemplo reindex, algo do genero...
Em anexo um print que mostra os arquivos dentro da pasta mencionada
Oi Fernando,
o Elasticsearch tem um sistema interno um pouco diferente do comum. Ele marca os documentos como deletados ao invés de deletar os documentos propriamente. E existe uma política automática que de tempos em tempos cuida da maioria dos documentos deletados. O seu caso é peculiar por ter um único shard com um tamanho grande em um caso de uso time-series. Enquanto você não implementa a solução completa que vai facilitar tudo a longo prazo, eu sugiro rodar o comando abaixo. Ele vai forçar o Lucene a dar uma avaliada nos seus segmentos e a de fato remover os documentos deletados.
ATENÇÃO:* esse comando geralmente é pesado para o cluster. Ele faz uso intensivo de CPU e disco e pode levar muito tempo para executar. Ou seja, execute esse comando quando o cluster estiver tranquilo e puder rodar por muito tempo sem afetar os usuários..
POST aplicacao/_forcemerge?only_expunge_deletes=true
Bom dia Pablo, mais uma vez muito obrigado pelo seu apoio !!!
Eu executei, até mais de uma vez para ter certeza, e finalizou (veja imagem), porém liberou por volta de 5GB apenas no tamanho do indice, tem algo a mais que precisa ser feito ?
Investigando melhor e limpando mais dados identifiquei que o elastic está correto, na verdade nos últimos 2 meses o tamanho de logs é bem maior, resumindo quando deixei só 2 meses ficou com 100GB (antes com 6 meses estava com 200GB), com 1 mês ficou com 50GB, então nos últimos meses estava gravando mais dados.
Muito obrigado pela ajuda !!!! Sucesso para você !!!
Se não for pedir muito...
Meu nobre, estou com um problema quanto as cargas que realizo no Kibana. Tenho um index que é alimentado com dados de alunos da rede municipal de educação, contudo, com a dinâmica típica que ocorre a exemplo as transferências de matricula de uma escola para outra, as cargas de dados diárias não atualizam essa mudança, sendo inserido novo registro.
Em vista desse fato, pergunto: Existe algum comando / função / Script em que posso aplicar para que em toda nova carga possa ocorrer a subscrição total dos dados do index no Kibana?
ps.: Detalhe, utilizo o logstash para o processo da carga.
Acho que o ideal é você abrir um novo tópico com essa dúvida, explicando o que você tá fazendo e o que precisa fazer.
Se entendi direito você quer atualizar os dados no lugar de criar um novo registro?
Se o seu documento tiver um campo com identificador único você consegue configurar o logstash pra atualizar o documento caso o id dele já exista no Elasticsearch.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.