Limpeza de index

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.

Abraços.

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 ?

Por favor, alguém poderia auxiliar ?

Muito obrigado !

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)

O delete_by_query deletará apenas os documentos e não o índice. O link que eu te enviei tem exemplos do comando:

POST /my-index-000001/_delete_by_query
{
  "query": {
    "match": {
      "user.id": "elkbee"
    }
  }
}

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.

Oi Fernando,
vamos começar do início :slight_smile:

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.

Espero que agora esteja mais claro.

Boa tarde Pablo, muito obrigado pela ajuda.

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

Abs

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 ?

Oi Fernando,
acredito que não. O que te leva a crer que o Elasticsearch não liberou todo o espaço que poderia?

Bom dia Pablo, muito obrigado pela ajuda !

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ê !!!

Que bom que deu tudo certo Fernando. Qualquer dúvida é só falar.

abs

1 Like

Olá Pablo!

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.

Desde já agradeço pela atenção!

Olá,

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.

Seria algo mais ou menos assim:

output {
    elasticsearch {
        hosts => ["servidor-elastic]
        index => "indice"
        document_id => "%{[campo_com_id_unico]}"
        action => "update"
        doc_as_upsert => true
    }
}

Mas fora isso não tem nada que automatize a exclusão do indice/dados antes de fazer uma nova carga não.