-
Notifications
You must be signed in to change notification settings - Fork 3
05 ‐ Procedimentos ILM
O ILM (Index Lifecycle Management) é o mecanismo nativo do Elasticsearch para automatizar o gerenciamento do ciclo de vida dos índices. Em vez de gerenciar manualmente quando um índice deve ser movido para um hardware mais barato ou quando deve ser deletado, o ILM faz isso de forma automática com base em regras chamadas policies.
O ILM é especialmente útil em cenários de dados temporais — logs, métricas, eventos de segurança — onde os dados perdem valor com o tempo e precisam ser retidos por um período determinado antes de serem descartados.
Sem o ILM, é comum que clusters acumulem índices antigos indefinidamente, consumindo disco e degradando o desempenho. Gerenciar isso manualmente é trabalhoso e propenso a erros. O ILM resolve isso com automação baseada em políticas declarativas.
Uma ILM policy é composta por fases, cada uma com suas próprias condições de entrada e ações a executar. As fases disponíveis são:
| Fase | Quando ocorre | Ações típicas |
|---|---|---|
| Hot | Fase inicial — o índice está sendo ativamente escrito e lido | Rollover por tamanho, idade ou número de documentos |
| Warm | O índice não recebe mais escritas, mas ainda é consultado com frequência | Force merge, shrink, readonly, realocação para nodes warm |
| Cold | Dados raramente consultados | Realocação para nodes cold, searchable snapshots |
| Frozen | Dados muito raramente acessados | Searchable snapshots em object storage (S3, GCS) |
| Delete | Dados que não precisam mais ser retidos | Deleção do índice |
Não é obrigatório usar todas as fases — uma policy pode ter apenas hot e delete, por exemplo.
O rollover é a ação mais importante da fase hot. Ele cria um novo índice quando o índice atual atinge uma condição configurada:
-
max_size: tamanho total dos shards primários -
max_age: tempo desde a criação do índice -
max_docs: número de documentos
Quando o rollover acontece, o alias de escrita é movido automaticamente para o novo índice, sem nenhuma interrupção para quem está indexando.
O fluxo completo de uma implementação com ILM tem três peças:
ILM Policy → Index Template → Índice (gerenciado automaticamente)
- ILM Policy: define as regras de ciclo de vida
- Index Template: associa a policy a todos os índices que correspondem a um padrão de nome
- Índice inicial: criado com um alias de escrita — a partir daí, o ILM cuida do resto
Neste laboratório vamos configurar um ciclo de vida completo para um conjunto de dados de vendas. O índice será gerenciado automaticamente pelo ILM, com rollover na fase hot e deleção após um período configurado.
Todos os comandos devem ser executados no Kibana Dev Tools.
Nota sobre os timers do lab: os tempos configurados neste lab (segundos e minutos) são propositalmente curtos para que as transições entre fases sejam observáveis durante a aula. Em produção, os valores típicos são dias ou semanas.
Por padrão, o ILM verifica as condições das policies a cada 10 minutos. Para o lab, vamos reduzir para 10 segundos:
PUT /_cluster/settings
{
"persistent": {
"indices.lifecycle.poll_interval": "10s"
}
}Lembre-se de restaurar o valor padrão ao final do lab: defina
indices.lifecycle.poll_intervalcomonull.
PUT /_ilm/policy/policy-vendas
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_age": "1m",
"max_docs": 5
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "2m",
"actions": {
"forcemerge": {
"max_num_segments": 1
},
"set_priority": {
"priority": 50
}
}
},
"delete": {
"min_age": "5m",
"actions": {
"delete": {}
}
}
}
}
}Explicação das condições:
- Hot → Rollover: acontece quando o índice tiver mais de 1 minuto ou mais de 5 documentos — o que ocorrer primeiro
-
Warm: o índice entra nessa fase 2 minutos após o rollover. O
forcemergecompacta todos os segments em um único, otimizando leitura - Delete: o índice é deletado 5 minutos após entrar na fase de deleção
O template associa a ILM policy e o alias de rollover a todos os índices com o padrão vendas-*:
PUT /_index_template/sales
{
"index_patterns": ["vendas-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "policy-vendas",
"index.lifecycle.rollover_alias": "vendas"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"Category": { "type": "keyword" },
"City": { "type": "keyword" },
"Country": { "type": "keyword" },
"CustomerName": { "type": "keyword" },
"DaystoShipActual": { "type": "long" },
"DaystoShipScheduled": { "type": "long" },
"Discount": { "type": "double" },
"OrderDate": { "type": "date", "format": "iso8601" },
"OrderID": { "type": "keyword" },
"OrderProfitable": { "type": "keyword" },
"PostalCode": { "type": "long" },
"ProductName": { "type": "text" },
"Profit": { "type": "long" },
"ProfitRatio": { "type": "double" },
"Quantity": { "type": "long" },
"Region": { "type": "keyword" },
"Sales": { "type": "long" },
"SalesForecast": { "type": "long" },
"SalesaboveTarget": { "type": "keyword" },
"SalesperCustomer": { "type": "double" },
"Segment": { "type": "keyword" },
"ShipDate": { "type": "date", "format": "iso8601" },
"ShipMode": { "type": "keyword" },
"ShipStatus": { "type": "keyword" },
"State": { "type": "keyword" },
"Sub_Category": { "type": "keyword" },
"latitude": { "type": "double" },
"location": { "type": "geo_point" },
"longitude": { "type": "double" }
}
}
}
}O primeiro índice precisa ser criado manualmente com o alias configurado como is_write_index: true. Esse alias é o que o ILM usa para saber para onde direcionar as novas escritas após cada rollover.
PUT /vendas-000001
{
"aliases": {
"vendas": {
"is_write_index": true
}
}
}A convenção de nomear o índice inicial com sufixo numérico (
-000001) é exigida pelo mecanismo de rollover — o Elasticsearch incrementa esse número a cada rollover (-000002,-000003, etc.).
GET /vendas-000001/_ilm/explainO campo phase deve indicar hot e o campo action deve mostrar rollover. O campo age mostra quanto tempo o índice tem desde sua criação.
Insira alguns documentos via alias. Note que usamos o alias vendas como destino — não o nome do índice diretamente. Isso garante que as escritas sempre vão para o índice ativo de escrita, independentemente de quantos rollovers já aconteceram.
POST /vendas/_doc
{
"Category": "Office Supplies",
"Discount": 0,
"ProductName": "Xerox 214",
"latitude": 41.6347,
"PostalCode": 2740,
"ShipStatus": "Shipped Early",
"OrderID": "CA-2014-148355",
"Segment": "Corporate",
"SalesaboveTarget": "No",
"Sales": 19,
"SalesperCustomer": 19.44,
"Profit": 9,
"ShipMode": "Standard Class",
"CustomerName": "Nick Crebassa",
"DaystoShipScheduled": 6,
"longitude": -70.9372,
"Sub_Category": "Paper",
"ProfitRatio": 48,
"Quantity": 3,
"City": "New Bedford",
"ShipDate": "2014-12-29T00:00:00.000Z",
"SalesForecast": 25,
"OrderDate": "2014-12-25T00:00:00.000Z",
"OrderProfitable": "No",
"@timestamp": "2014-12-25T00:00:00.000Z",
"State": "Massachusetts",
"Country": "United States",
"Region": "East",
"location": "41.6347,-70.9372",
"DaystoShipActual": 4
}Insira mais 4 documentos para atingir a condição de rollover por max_docs: 5. Pode repetir o mesmo documento alterando o OrderID para simular registros diferentes.
Após inserir 5 documentos ou aguardar 1 minuto (o que ocorrer primeiro), o ILM deve executar o rollover automaticamente. Verifique:
GET /_cat/indices/vendas-*?v&s=indexApós o rollover, você verá dois índices: vendas-000001 (que saiu da fase hot) e vendas-000002 (novo índice ativo de escrita).
Verifique o alias:
GET /_cat/aliases/vendas?vO is_write_index deve ter migrado para vendas-000002.
Acompanhe o estado do ILM em cada índice:
GET /vendas-*/_ilm/explainAguarde os tempos configurados e execute o comando abaixo repetidamente para observar as transições:
GET /vendas-000001/_ilm/explainOs campos a observar:
| Campo | O que indica |
|---|---|
phase |
Fase atual do índice (hot, warm, delete) |
action |
Ação sendo executada na fase atual |
step |
Etapa dentro da ação |
age |
Tempo de vida do índice |
phase_time |
Quando o índice entrou na fase atual |
Se quiser acelerar a transição para testes sem esperar o timer, use:
POST /_ilm/move/vendas-000001
{
"current_step": {
"phase": "hot",
"action": "complete",
"name": "complete"
},
"next_step": {
"phase": "warm",
"action": "forcemerge",
"name": "forcemerge"
}
}Use com cautela — forçar transições em produção pode ter efeitos colaterais dependendo das ações configuradas na policy.
Restaurar o intervalo de verificação do ILM para o valor padrão:
PUT /_cluster/settings
{
"persistent": {
"indices.lifecycle.poll_interval": null
}
}Por padrão, o Elasticsearch bloqueia deleções usando wildcard (*) para evitar remoção acidental de dados. Antes de deletar os índices do lab, é necessário desabilitar essa proteção temporariamente:
PUT /_cluster/settings
{
"persistent": {
"action.destructive_requires_name": false
}
}Remover os índices do lab:
DELETE /vendas-*Após a limpeza, restaure a proteção:
PUT /_cluster/settings
{
"persistent": {
"action.destructive_requires_name": null
}
}Remover o template:
DELETE /_index_template/salesRemover a policy:
DELETE /_ilm/policy/policy-vendasAlém da API, é possível criar e gerenciar ILM policies diretamente pelo Kibana, sem escrever JSON. O caminho é:
Menu → Stack Management → Index Lifecycle Policies
A interface permite:
- Criar e editar policies com um formulário visual
- Visualizar todos os índices gerenciados por cada policy
- Ver o estado atual de cada índice (fase, ação, possíveis erros)
- Retentar steps com erro sem precisar usar a API
Para associar uma policy a um index template existente, vá em:
Menu → Stack Management → Index Management → Index Templates
Selecione o template desejado e edite a seção Index settings adicionando:
{
"index.lifecycle.name": "nome-da-policy",
"index.lifecycle.rollover_alias": "nome-do-alias"
}Listar todas as policies:
GET /_ilm/policyVer o estado do ILM em todos os índices de um padrão:
GET /vendas-*/_ilm/explainVer apenas índices com erro no ILM:
GET /vendas-*/_ilm/explain?only_errors=trueRetentar um step com erro:
POST /vendas-000001/_ilm/retryVer o status geral do ILM no cluster:
GET /_ilm/statusPausar o ILM globalmente (útil durante manutenções):
POST /_ilm/stopRetomar o ILM:
POST /_ilm/startO Curator é uma ferramenta open source mantida pela Elastic para gerenciar o ciclo de vida de índices via linha de comando. Antes do ILM existir (versão 6.6), o Curator era a principal forma de automatizar tarefas como deleção de índices antigos, force merge e snapshot.
Hoje, com o ILM disponível nativamente e gratuito desde a versão 7.x, o Curator perdeu relevância em novas implementações. No entanto, ainda aparece em ambientes legados que migraram de versões antigas do Elasticsearch sem rever a gestão de índices.
Quando você ainda pode encontrar o Curator:
- Clusters que foram instalados antes do ILM existir e nunca foram migrados
- Ambientes com restrições que impedem o uso de features X-Pack (muito raros hoje)
- Scripts de automação externos que gerenciam índices de forma imperativa
Para novas implementações, use o ILM. Ele é mais integrado, mais simples de configurar e não requer ferramentas externas.
Referência: github.com/elastic/curator