Quando você trabalha com Business Intelligence e melhoria de processos, os requisitos do negócio mudam o tempo todo. Num dia, o tempo de execução de uma tarefa é medido em minutos; no outro, a diretoria decide que precisa ser em milissegundos.
No mundo dos bancos de dados relacionais, você faria um ALTER TABLE. Mas no OpenSearch (e no Elasticsearch), os mapeamentos (mappings) são imutáveis. Se você definiu um campo como texto e depois percebeu que ele deveria ser um número para gerar gráficos no dashboard... você não pode simplesmente alterar o tipo dele.
A única solução é criar um índice novo, com o mapeamento correto, e mover os dados. Mas como fazer isso sem tirar o dashboard do ar ou quebrar a aplicação Python que está inserindo logs em tempo real?
A resposta é brilhante e simples: Aliases.
O que é um Alias? 🎭
Pense no Alias como um "apelido" ou um atalho (como um symlink no Linux/macOS).
A regra de ouro da arquitetura no OpenSearch é: A sua aplicação e os seus dashboards NUNCA devem apontar diretamente para o nome do índice real. Eles devem apontar para o Alias.
-
Ruim: Dashboard lê de
logs_processos_v1 -
Bom: Dashboard lê de
logs_processos_atuais(que é um Alias apontando para a versão 1).
Se amanhã você precisar da versão 2, você cria o índice, copia os dados e, em uma fração de segundo, manda o Alias apontar para a versão 2. O seu painel de BI nem pisca. Zero downtime.
Vamos ver como orquestrar isso com Python.
Passo 1: A Configuração Inicial (O Jeito Certo) 🏗️
Vamos simular a criação do nosso primeiro índice de processos, mas já usando as melhores práticas desde o dia zero.
from opensearchpy import OpenSearch
cliente = OpenSearch(hosts=[{'host': 'localhost', 'port': 9200}], use_ssl=False, verify_certs=False)
indice_v1 = 'processos_governados_v1'
alias_nome = 'processos_producao'
# 1. Criamos a versão 1 com o mapeamento inicial
mapeamento_v1 = {
"mappings": {
"properties": {
"tempo_execucao": {"type": "text"} # OPA! Definimos como texto por engano
}
}
}
cliente.indices.create(index=indice_v1, body=mapeamento_v1)
# 2. A MÁGICA: Criamos o Alias apontando para a V1
cliente.indices.put_alias(index=indice_v1, name=alias_nome)
print(f"Índice {indice_v1} criado!")
print(f"Alias '{alias_nome}' agora aponta para a V1.")
Neste momento, você vai lá no OpenSearch Dashboards e cria todos os seus gráficos apontando para processos_producao.
Passo 2: O Problema! (Requisitos mudaram) 🚨
Semanas depois, você vai montar um gráfico de média de tempo e descobre que não dá para fazer cálculo matemático com texto. Precisamos mudar o tempo_execucao para integer.
Como não podemos alterar a V1, vamos criar a V2.
indice_v2 = 'processos_governados_v2'
# 1. Criamos o NOVO índice com o tipo corrigido
mapeamento_v2 = {
"mappings": {
"properties": {
"tempo_execucao": {"type": "integer"} # Agora sim, um número!
}
}
}
cliente.indices.create(index=indice_v2, body=mapeamento_v2)
print(f"Índice {indice_v2} criado com o mapeamento corrigido!")
Passo 3: A Reindexação (Copiando os dados) 🚚
Agora precisamos pegar todos os milhares de logs que estão na V1 e jogar para a V2. O OpenSearch tem uma API nativa incrivelmente rápida para isso, chamada _reindex.
# Pedimos ao OpenSearch para copiar tudo internamente
resposta_reindex = cliente.reindex(
body={
"source": {"index": indice_v1},
"dest": {"index": indice_v2}
},
wait_for_completion=True # Espera terminar para continuar o script
)
print(f"Reindexação concluída! {resposta_reindex['created']} documentos copiados.")
Dica: O OpenSearch é inteligente o suficiente para tentar converter as strings (ex: "150") em números (150) durante essa cópia, já que o novo mapeamento exige um integer.
Passo 4: O "Switch" Atômico (A Troca Perfeita) ⚡
Aqui está o momento crucial. Nós precisamos tirar o Alias da V1 e colocar na V2.
Se fizermos isso em dois comandos separados (remover, depois adicionar), pode haver uma fração de segundo onde o Alias não existe, o que resultaria em erro (downtime) para quem estiver usando o painel de BI naquele exato milissegundo.
Para resolver isso, usamos a API de _aliases para fazer a troca atomicamente (tudo de uma vez só).
# A troca atômica
acoes_alias = {
"actions": [
{"remove": {"index": indice_v1, "alias": alias_nome}},
{"add": {"index": indice_v2, "alias": alias_nome}}
]
}
cliente.indices.update_aliases(body=acoes_alias)
print(f"✅ Sucesso! O Alias '{alias_nome}' agora aponta silenciosamente para a V2.")
Conclusão
Pronto! Os seus usuários que estavam com o dashboard aberto não perceberam absolutamente nada. A sua aplicação Python que injeta dados não precisou ser reiniciada (pois ela também manda os dados para o Alias). Tudo continuou funcionando, mas agora o seu banco de dados está com a estrutura nova e correta.
Você pode manter a V1 como backup por alguns dias ou simplesmente excluí-la para liberar espaço (cliente.indices.delete(index=indice_v1)).
Dominar Aliases e a API de Reindexação é o que separa arquiteturas amadoras de ecossistemas de dados profissionais, resilientes e totalmente à prova de falhas!
Gostou da série sobre OpenSearch e Python? Qual foi a dica que você achou mais útil para o seu dia a dia? Deixe um comentário ou compartilhe com a sua equipe!
Top comments (0)