Elastic Stack vs ClickStack
- UI e alertas: ferramentas para consultar dados, criar dashboards e gerenciar alertas.
- Armazenamento e mecanismo de consulta: os sistemas de backend responsáveis por armazenar dados de observabilidade e atender consultas analíticas.
- Coleta de dados e ETL: agentes e pipelines que coletam dados de telemetria e os processam antes da ingestão.
| Função | Elastic Stack | ClickStack | Comentários |
|---|---|---|---|
| UI e alertas | Kibana — dashboards, busca e alertas | UI do ClickStack (HyperDX) — UI em tempo real, busca e alertas | Ambos servem como a interface principal para os usuários, incluindo visualizações e gerenciamento de alertas. A UI do ClickStack foi criada especificamente para observabilidade e é fortemente acoplada à semântica do OpenTelemetry. |
| Armazenamento e mecanismo de consulta | Elasticsearch — armazenamento de documentos JSON com índice invertido | ClickHouse — banco de dados orientado a colunas com motor vetorizado | O Elasticsearch usa um índice invertido otimizado para busca; o ClickHouse usa armazenamento colunar e SQL para análises em alta velocidade sobre dados estruturados e semiestruturados. |
| Coleta de dados | Elastic Agent, Beats (ex.: Filebeat, Metricbeat) | OpenTelemetry Collector (edge + gateway) | O Elastic oferece suporte a shippers personalizados e a um agente unificado gerenciado pelo Fleet. O ClickStack depende do OpenTelemetry, permitindo coleta e processamento de dados neutros em relação ao fornecedor. |
| SDKs de instrumentação | Elastic APM agents (proprietários) | OpenTelemetry SDKs (distribuídos pelo ClickStack) | Os SDKs do Elastic estão vinculados ao stack Elastic. O ClickStack se baseia nos SDKs do OpenTelemetry para logs, métricas e traces nas principais linguagens. |
| ETL / Processamento de dados | Logstash, pipelines de ingestão | OpenTelemetry Collector + visões materializadas do ClickHouse | O Elastic usa pipelines de ingestão e Logstash para transformação. O ClickStack desloca o processamento para o momento da inserção por meio de visões materializadas e processadores do OTel collector, que transformam os dados de forma eficiente e incremental. |
| Filosofia de arquitetura | Verticalmente integrado, com agentes e formatos proprietários | Baseado em padrões abertos, com componentes fracamente acoplados | O Elastic constrói um ecossistema fortemente integrado. O ClickStack enfatiza modularidade e padrões (OpenTelemetry, SQL, armazenamento de objetos) para flexibilidade e eficiência de custos. |
Elasticsearch vs ClickHouse
Conceitos estruturais centrais
| Elasticsearch | ClickHouse / SQL | Descrição |
|---|---|---|
| Campo | Coluna | A unidade básica de dados, que contém um ou mais valores de um tipo específico. Os campos do Elasticsearch podem armazenar tipos primitivos, além de arrays e objetos. Os campos podem ter apenas um tipo. O ClickHouse também oferece suporte a arrays e objetos (Tuples, Maps, Nested), bem como a tipos dinâmicos como Variant e Dynamic, que permitem que uma coluna tenha múltiplos tipos. |
| Documento | Linha | Uma coleção de campos (colunas). Os documentos do Elasticsearch são mais flexíveis por padrão, com novos campos adicionados dinamicamente com base nos dados (o tipo é inferido automaticamente). As linhas do ClickHouse, por padrão, são vinculadas a um esquema, exigindo que os usuários insiram todas as colunas de uma linha ou um subconjunto delas. O tipo JSON no ClickHouse oferece suporte à criação equivalente de colunas dinâmicas semi-estruturadas com base nos dados inseridos. |
| Índice | Tabela | A unidade de execução de consultas e armazenamento. Em ambos os sistemas, as consultas são executadas em índices ou tabelas, que armazenam linhas/documentos. |
| Implícito | Esquema (SQL) | Esquemas SQL agrupam tabelas em espaços de nomes, frequentemente usados para controle de acesso. Elasticsearch e ClickHouse não têm esquemas, mas ambos oferecem suporte à segurança em nível de linha e de tabela por meio de roles e RBAC. |
| Cluster | Cluster / Banco de dados | Clusters do Elasticsearch são instâncias de runtime que gerenciam um ou mais índices. No ClickHouse, bancos de dados organizam tabelas dentro de um espaço de nomes lógico, fornecendo o mesmo agrupamento lógico que um cluster no Elasticsearch. Um cluster do ClickHouse é um conjunto distribuído de nós, semelhante ao Elasticsearch, mas desacoplado e independente dos próprios dados. |
Modelagem de dados e flexibilidade
Dynamic, Variant e JSON. Esses tipos permitem a ingestão de dados semi-estruturados, com criação dinâmica de colunas e inferência de tipos semelhante à do Elasticsearch. Da mesma forma, o tipo Map permite armazenar pares chave-valor arbitrários — embora seja exigido um único tipo tanto para a chave quanto para o valor.
A abordagem do ClickHouse para flexibilidade de tipos é mais transparente e controlada. Ao contrário do Elasticsearch, em que conflitos de tipo podem causar erros de ingestão, o ClickHouse permite dados de tipos mistos em colunas Variant e oferece suporte à evolução do esquema por meio do uso do tipo JSON.
Se não estiver usando JSON, o esquema será definido estaticamente. Se não forem fornecidos valores para uma linha, eles serão definidos como Nullable (não usado no ClickStack) ou voltarão ao valor padrão do tipo, por exemplo, um valor vazio para String.
Ingestão e transformação
enrich, rename, grok) para transformar documentos antes da indexação. No ClickHouse, uma funcionalidade semelhante é obtida com views materializadas incrementais, que podem filtrar e transformar ou enriquecer os dados de entrada e inserir os resultados em tabelas de destino. Você também pode inserir dados em uma tabela com engine Null se precisar apenas armazenar a saída da visão materializada. Isso significa que apenas os resultados das visões materializadas são preservados, enquanto os dados originais são descartados, economizando espaço de armazenamento.
Para enriquecimento, o Elasticsearch oferece processadores de enrich dedicados para adicionar contexto aos documentos. No ClickHouse, dicionários podem ser usados tanto em tempo de consulta quanto em tempo de ingestão para enriquecer linhas — por exemplo, para mapear IPs para localizações ou aplicar lookups de user agent na inserção.
Linguagens de consulta
ES|QL. O ClickHouse oferece suporte à sintaxe SQL completa, incluindo todos os tipos de junção, funções de janela, subconsultas (inclusive correlacionadas) e CTEs. Essa é uma grande vantagem se você precisa correlacionar sinais de observabilidade com dados de negócios ou de infraestrutura.
No ClickStack, a UI fornece uma interface de busca compatível com Lucene para facilitar a transição, juntamente com suporte completo a SQL por meio do backend do ClickHouse. Essa sintaxe é comparável à sintaxe de query string do Elastic. Para uma comparação exata dessa sintaxe, consulte “Busca no ClickStack e no Elastic”.
Formatos de arquivo e interfaces
Indexação e armazenamento
Processamento de inserção no ElasticsearchⒶ Documentos recém-inseridos Ⓑ primeiro vão para um buffer de indexação em memória que, por padrão, é esvaziado uma vez por segundo. Uma fórmula de roteamento é usada para determinar o shard de destino dos documentos liberados do buffer, e um novo segmento é gravado em disco para esse shard. Para melhorar a eficiência das consultas e permitir a exclusão física de documentos excluídos ou atualizados, os segmentos são continuamente mesclados em segundo plano em segmentos maiores até atingirem um tamanho máximo de 5 GB. No entanto, é possível forçar uma mesclagem em segmentos ainda maiores.
_source (comprimido com LZ4, Deflate ou ZSTD), enquanto o ClickHouse não armazena uma representação separada do documento. Os dados são reconstruídos a partir das colunas no momento da consulta, economizando espaço de armazenamento. Essa mesma capacidade também é possível no Elasticsearch usando Synthetic _source, com algumas restrições. Desabilitar _source também tem implicações que não se aplicam ao ClickHouse.
No Elasticsearch, os mapeamentos de índice (equivalentes aos esquemas de tabela no ClickHouse) controlam o tipo dos campos e as estruturas de dados usadas para essa persistência e consulta.
O ClickHouse, por outro lado, é orientado a colunas — cada coluna é armazenada de forma independente, mas sempre ordenada pela chave primária/de ordenação da tabela. Essa ordenação permite índices primários esparsos, que permitem ao ClickHouse pular dados com eficiência durante a execução da consulta. Quando as consultas filtram por campos da chave primária, o ClickHouse lê apenas as partes relevantes de cada coluna, reduzindo significativamente a E/S de disco e melhorando o desempenho — mesmo sem um índice completo em cada coluna.
O ClickHouse também oferece suporte a skip indexes, que aceleram a filtragem ao pré-computar dados de índice para colunas selecionadas. Eles precisam ser definidos explicitamente, mas podem melhorar significativamente o desempenho. Além disso, o ClickHouse permite especificar codecs de compressão e algoritmos de compressão por coluna — algo que o Elasticsearch não suporta (sua compressão se aplica apenas ao armazenamento do JSON em _source).
O ClickHouse também oferece suporte a sharding, mas seu modelo foi projetado para favorecer a escala vertical. Um único shard pode armazenar trilhões de linhas e continuar com desempenho eficiente, desde que memória, CPU e disco permitam. Diferentemente do Elasticsearch, não há um limite rígido de linhas por shard. Os shards no ClickHouse são lógicos — na prática, tabelas individuais — e não exigem particionamento, a menos que o conjunto de dados exceda a capacidade de um único nó. Isso normalmente acontece devido a limitações de espaço em disco, e o sharding ① só é introduzido quando a expansão horizontal se torna necessária - reduzindo a complexidade e a sobrecarga. Nesse caso, assim como no Elasticsearch, um shard armazenará um subconjunto dos dados. Os dados dentro de um único shard são organizados como uma coleção de ② partes de dados imutáveis que contêm ③ várias estruturas de dados.
O processamento dentro de um shard do ClickHouse é totalmente paralelizado, e os usuários são incentivados a escalar verticalmente para evitar os custos de rede associados à movimentação de dados entre nós.
Processamento de inserções no ClickHouseAs inserções no ClickHouse são síncronas por padrão — a gravação só é confirmada após o commit — mas podem ser configuradas para inserções assíncronas para reproduzir o buffering e o batching no estilo do Elastic. Se inserções assíncronas de dados forem usadas, Ⓐ as linhas recém-inseridas vão primeiro para um Ⓑ buffer de inserção em memória, que, por padrão, é esvaziado uma vez a cada 200 milissegundos. Se vários shards forem usados, uma tabela distribuída será usada para encaminhar as linhas recém-inseridas ao shard de destino. Uma nova parte é gravada em disco para o shard.
Distribuição e replicação
SELECT para todos os shards e mesclando os resultados. Para operações INSERT, elas equilibram a carga distribuindo os dados uniformemente entre os shards. A replicação do ClickHouse é altamente flexível: qualquer réplica (uma cópia de um shard) pode aceitar escritas, e todas as alterações são sincronizadas de forma assíncrona com as demais. Essa arquitetura permite atender consultas sem interrupção durante falhas ou manutenção, com a ressincronização sendo feita automaticamente - eliminando a necessidade de impor o modelo primário-secundário na camada de dados.
ClickHouse CloudNo ClickHouse Cloud, a arquitetura introduz um modelo de compute shared-nothing em que um único shard é suportado por armazenamento de objetos. Isso substitui a alta disponibilidade tradicional baseada em réplicas, permitindo que o shard seja lido e gravado por vários nós simultaneamente. A separação entre armazenamento e compute permite escalabilidade elástica sem gerenciamento explícito de réplicas.
- Elastic: Os shards são estruturas físicas do Lucene vinculadas à memória da JVM. O excesso de shards introduz penalidades de desempenho. A replicação é síncrona e coordenada por um nó mestre.
- ClickHouse: Os shards são lógicos e escaláveis verticalmente, com execução local altamente eficiente. A replicação é assíncrona (mas pode ser sequencial), e a coordenação é leve.
Desduplicação e roteamento
_id, roteando-os para os shards de acordo com isso. O ClickHouse não armazena um identificador de linha padrão, mas oferece desduplicação no momento da inserção, permitindo que os usuários tentem novamente inserts com falha com segurança. Para ter mais controle, ReplacingMergeTree e outros motores de tabela permitem a desduplicação com base em colunas específicas.
O roteamento de índice no Elasticsearch garante que documentos específicos sejam sempre encaminhados para shards específicos. No ClickHouse, você pode definir chaves de shard ou usar tabelas Distributed para obter uma localidade de dados semelhante.
Agregações e modelo de execução
SELECT count(*) FROM ... GROUP BY ... é a agregação terms, que é uma agregação do tipo bucket do Elasticsearch.
O GROUP BY do ClickHouse com count(*) e a agregação terms do Elasticsearch geralmente são equivalentes em termos de funcionalidade, mas diferem bastante em implementação, desempenho e qualidade dos resultados.
Essa agregação no Elasticsearch estima resultados em consultas “top-N” (por exemplo, os 10 principais hosts por contagem) quando os dados consultados abrangem vários shards. Essa estimativa melhora a velocidade, mas pode comprometer a precisão. Você pode reduzir esse erro inspecionando doc_count_error_upper_bound e aumentando o parâmetro shard_size — ao custo de maior uso de memória e consultas mais lentas.
O Elasticsearch também exige uma configuração size para todas as agregações com buckets — não há como retornar todos os grupos únicos sem definir explicitamente um limite. Agregações de alta cardinalidade correm o risco de atingir os limites de max_buckets ou exigem paginação com uma agregação composta, o que costuma ser complexo e ineficiente.
O ClickHouse, por outro lado, realiza agregações exatas por padrão. Funções como count(*) retornam resultados precisos sem exigir ajustes de configuração, tornando o comportamento das consultas mais simples e previsível.
O ClickHouse não impõe limites de tamanho. Você pode executar consultas GROUP BY sem limite em grandes conjuntos de dados. Se os limites de memória forem excedidos, o ClickHouse pode gravar dados temporários em disco. Agregações que agrupam por um prefixo da chave primária são especialmente eficientes e muitas vezes são executadas com consumo mínimo de memória.
Modelo de execução
LIMIT.
A execução da consulta é ainda mais paralelizada por:
- Vetorizaçāo SIMD: operações sobre dados colunares usam instruções SIMD da CPU (por exemplo, AVX512), permitindo o processamento em lote de valores.
- Paralelismo em nível de cluster: em configurações distribuídas, cada nó realiza o processamento da consulta localmente. Estados de agregação parciais são transmitidos ao nó iniciador e mesclados. Se as chaves de
GROUP BYda consulta estiverem alinhadas com as chaves de sharding, a mesclagem pode ser minimizada ou totalmente evitada.
Esse modelo permite escalonar com eficiência entre núcleos e nós, tornando o ClickHouse muito adequado para análises em larga escala. O uso de estados de agregação parciais permite que resultados intermediários de diferentes threads e nós sejam mesclados sem perda de precisão. Em contraste, o Elasticsearch atribui uma thread por shard para a maioria das agregações, independentemente de quantos núcleos de CPU estejam disponíveis. Essas threads retornam resultados top-N locais ao shard, que são mesclados no nó coordenador. Essa abordagem pode subutilizar os recursos do sistema e introduzir possíveis imprecisões em agregações globais, especialmente quando termos frequentes estão distribuídos entre vários shards. A precisão pode ser melhorada aumentando o parâmetro
shard_size, mas isso tem como custo maior uso de memória e maior latência da consulta.
Em resumo, o ClickHouse executa agregações e consultas com paralelismo mais granular e maior controle sobre os recursos de hardware, enquanto o Elasticsearch depende da execução baseada em shard, com restrições mais rígidas.
Para mais detalhes sobre a mecânica das agregações nas respectivas tecnologias, recomendamos o post no blog “ClickHouse vs. Elasticsearch: The Mechanics of Count Aggregations”.
Gerenciamento de dados
Gerenciamento do ciclo de vida de índices vs TTL nativo
Camadas de armazenamento e arquiteturas hot-warm
MergeTree, que podem mover automaticamente dados mais antigos entre diferentes volumes (por exemplo, de SSD para HDD para armazenamento de objetos) com base em regras personalizadas. Isso pode simular a abordagem hot-warm-cold do Elastic — mas sem a complexidade de gerenciar várias funções de nós ou clusters.
ClickHouse CloudNo ClickHouse Cloud, isso se torna ainda mais simples: todos os dados são armazenados em armazenamento de objetos (por exemplo, S3), e o processamento é desacoplado. Os dados podem permanecer no armazenamento de objetos até serem consultados; nesse momento, são buscados e armazenados em cache localmente (ou em um cache distribuído) — oferecendo o mesmo perfil de custo do tier frozen do Elastic, com melhor desempenho. Essa abordagem significa que não é preciso mover dados entre camadas de armazenamento, tornando arquiteturas hot-warm redundantes.
Rollups vs agregações incrementais
blue (11, 12 e 13) que passaram a existir desde o checkpoint anterior. Portanto, o índice de origem é filtrado para todos os documentos blue existentes e, com uma composite aggregation (para utilizar a paginação dos resultados), os valores agregados são recalculados (e o índice de destino é atualizado com um documento que substitui o documento que continha os valores de agregação anteriores). Da mesma forma, em ② e ③, novos checkpoints são processados verificando mudanças e recalculando os valores agregados a partir de todos os documentos existentes que pertencem ao mesmo bucket blue.
O ClickHouse adota uma abordagem fundamentalmente diferente. Em vez de reagregar os dados periodicamente, o ClickHouse oferece suporte a visões materializadas incrementais, que transformam e agregam os dados no momento da inserção. Quando novos dados são gravados em uma tabela de origem, uma visão materializada executa uma consulta SQL de agregação predefinida apenas sobre os novos blocos inseridos e grava os resultados agregados em uma tabela de destino.
Esse modelo é possível graças ao suporte do ClickHouse a estados de agregação parciais — representações intermediárias de funções de agregação que podem ser armazenadas e depois mescladas. Isso permite manter resultados parcialmente agregados que são rápidos de consultar e baratos de atualizar. Como a agregação acontece à medida que os dados chegam, não é necessário executar jobs recorrentes caros nem resumir novamente os dados antigos.
A seguir, ilustramos de forma abstrata a mecânica das visões materializadas incrementais (observe que usamos a cor azul para todas as linhas que pertencem ao mesmo grupo para o qual queremos pré-calcular valores agregados):
No diagrama acima, a tabela de origem da visão materializada já contém uma parte de dados que armazena algumas linhas blue (de 1 a 10) pertencentes ao mesmo grupo. Para esse grupo, também já existe uma parte de dados na tabela de destino da view armazenando um estado de agregação parcial para o grupo blue. Quando ① ② ③ inserções na tabela de origem com novas linhas ocorrem, uma parte de dados correspondente é criada na tabela de origem para cada inserção e, em paralelo, (apenas) para cada bloco de linhas recém-inseridas, um estado de agregação parcial é calculado e inserido na forma de uma parte de dados na tabela de destino da visão materializada. ④ Durante as mesclagens de partes em segundo plano, os estados de agregação parciais são mesclados, resultando em agregação incremental de dados.
Observe que todas as funções de agregação (mais de 90), incluindo suas combinações com combinadores de função de agregação, oferecem suporte a estados de agregação parciais.
Para um exemplo mais concreto de Elasticsearch vs ClickHouse para agregações incrementais, veja este exemplo.
As vantagens da abordagem do ClickHouse incluem:
- Agregados sempre atualizados: visões materializadas ficam sempre em sincronia com a tabela de origem.
- Sem jobs em segundo plano: as agregações são feitas no momento da inserção, e não no momento da consulta.
- Melhor desempenho em tempo real: ideal para workloads de observabilidade e analytics em tempo real, em que agregados atualizados são necessários imediatamente.
- Composição flexível: visões materializadas podem ser organizadas em camadas ou combinadas com outras visões e tabelas para estratégias mais complexas de aceleração de consultas.
- TTLs distintos: diferentes configurações de TTL podem ser aplicadas à tabela de origem e à tabela de destino da visão materializada.
Suporte a lakehouse
- Integração com catálogo de dados: o ClickHouse oferece suporte à integração com catálogos de dados como AWS Glue, permitindo a descoberta automática e o acesso a tabelas no armazenamento de objetos.
- Suporte a armazenamento de objetos: suporte nativo para consultar dados armazenados em S3, GCS e Azure Blob Storage, sem exigir movimentação de dados.
- Federação de consultas: a capacidade de correlacionar dados entre várias fontes, incluindo tabelas de lakehouse, bancos de dados tradicionais e tabelas do ClickHouse, usando dicionários externos e funções de tabela.
- Carregamento incremental: suporte ao carregamento contínuo de tabelas de lakehouse em tabelas locais MergeTree, usando recursos como S3Queue e ClickPipes.
- Otimização de desempenho: execução distribuída de consultas sobre dados de lakehouse usando funções de cluster para melhorar o desempenho.