Quando o isolamento vale a penaO isolamento é voltado a implantações grandes com ingestão contínua. Abaixo de aproximadamente 100 TB/mês de dados armazenados, um único serviço de leitura e escrita normalmente absorve as duas cargas de trabalho, e um segundo serviço provavelmente não é necessário. Use o sizing model para estimar seu volume comprimido por mês.
Por que isolar leituras de gravações
- As gravações deixam de degradar as leituras. A ingestão contínua do OpenTelemetry — os próprios inserts, somados às mesclagens em segundo plano que vêm depois — compete com as consultas de dashboards e buscas por CPU e memória. A latência de leitura pode piorar de forma perceptível enquanto a ingestão está em execução, e se recupera assim que ela para.
- As leituras deixam de atrapalhar as gravações. A contenção ocorre nos dois sentidos: uma consulta ad-hoc pesada ou a renderização custosa de um dashboard pode esgotar a memória do service e fazer os inserts falharem por completo, e não apenas ficarem mais lentos.
- O compute somente leitura fica totalmente dedicado às consultas. Os read-only services não executam mesclagens em segundo plano fora das system tables. Eles também entram em idle sem atraso, ao contrário dos read-write services, que as mesclagens podem manter ativos.
- Cada lado é dimensionado separadamente. O sizing model estima o compute de ingestão e o compute de consulta separadamente, e um warehouse permite provisionar cada um como um service próprio. Acima do baseline de 1 QPS do modelo, o compute de consulta domina — seu exemplo prático a 5 QPS chega a 58 vCPUs para ingestão contra 290 para consultas —, de modo que um service de gravação pequeno pode alimentar um service de leitura muito maior.
- Idling e autoscaling são configurados por service. Cada service tem sua própria contagem de réplicas e suas próprias configurações de autoscaling e auto-idling, de modo que o service de gravação pode permanecer sempre ativo para a ingestão contínua enquanto o service de leitura fica em idle fora do horário de trabalho.
- O armazenamento não é duplicado. Os services em um warehouse compartilham a mesma pasta de armazenamento de objetos e as mesmas tabelas, e o armazenamento é cobrado apenas uma vez.
- O acesso pode ser restringido por endpoint. As IP access lists são aplicadas por service, portanto o endpoint de gravação pode ficar acessível apenas a partir dos seus collectors e o endpoint de leitura apenas a partir da sua implantação do ClickStack. Consulte nosso guia sobre Controle de acesso de rede.
Arquitetura
A topologia recomendada é um warehouse contendo um service read-write para ingestão e um service read-only para o ClickStack:
Ao planejar a topologia, tenha em mente:
- O primeiro service de um warehouse é sempre read-write, e o tipo do service é definido no momento da criação — para alternar entre read-only e read-write, crie um novo service no warehouse.
- Todos os services de um warehouse compartilham o mesmo cloud provider, região, versão do ClickHouse e Keeper, além do upgrade schedule do primary service.
- Use um service read-write para ingestão. As mesclagens são distribuídas entre todos os services read-write que compartilham o storage, portanto a mesclagem referente a um insert feito em um service pode ser executada por outro. Se esse outro service também estiver atendendo consultas pesadas, essas consultas vão competir com a mesclagem por CPU e memória no service que a executa — o que atrasa as mesclagens dos inserts do primeiro service e, com elas, o desempenho de insert. Mantenha os workloads de consulta no service read-only e só adicione um segundo service read-write se precisar separar as mesclagens da ingestão.
Configurando uma implantação isolada
1
Prepare o serviço com acesso de leitura e gravação
Use seu service existente — ou o primary service de um novo warehouse — para a ingestão, dimensionado conforme o compute de ingestão indicado pelo sizing model.Crie o database e o usuário dedicado de ingestão nesse service. Como todos os services de um warehouse compartilham os access controls, os usuários criados aqui ficam disponíveis em todos os services do warehouse:Gere a senha com uma ferramenta como
openssl rand -base64 24 e armazene-a em um gerenciador de secrets, em vez de em um manifest ou no histórico do shell. Consulte nosso guia sobre Criação de um usuário de ingestão para mais detalhes.Se este service já fizer parte de um warehouse, observe que DDL em nível de database pode travar quando outro service do warehouse estiver idled — consulte Administração e DDL.2
Adicione um serviço somente de leitura ao warehouse
No ClickHouse Cloud console, clique no sinal de mais no serviço que você acabou de preparar para criar um segundo serviço que compartilha seus dados. Selecione read-only como tipo de serviço e dimensione-o de acordo com o compute de consultas indicado pelo sizing model.Para o passo a passo completo, consulte nosso guia Como configurar um warehouse.
3
Direcione a ingestão para o serviço com acesso de leitura e escrita
Configure seu collector para exportar para o service endpoint read-write, autenticando-se como o usuário de ingestão:Consulte as opções de configuração do collector para mais detalhes, ou as configurações equivalentes para o Vector e outros caminhos de ingestão.As gravações enviadas ao endpoint read-only são rejeitadas, portanto o collector deve sempre apontar para o service read-write.
4
Direcione o ClickStack para o serviço somente de leitura
A ClickStack UI sempre se conecta ao ClickHouse service a partir do qual foi iniciada no ClickHouse Cloud console. Para executá-la em read-only compute:
- Selecione o read-only service no ClickHouse Cloud console.
- Selecione ClickStack no menu de navegação à esquerda.
5
Verifique a divisão
Execute uma busca ou abra um dashboard no ClickStack e, em seguida, verifique onde as consultas foram executadas. As tabelas Um resultado vazio aqui, por si só, não significa que as consultas foram para outro lugar: a Dois pontos a considerar nessa consulta: services que estejam em estado idle não contribuem com linhas, portanto ative-os primeiro caso precise de resultados completos; e
system são gravadas no node que executou a consulta, portanto um service com mais de uma réplica precisa do clusterAllReplicas com o nome de cluster default para abranger todas elas. No service read-only, você deve ver as consultas do ClickStack:system.query_log é gravada periodicamente — a cada 7,5 segundos, por padrão —, então uma consulta executada imediatamente após uma busca pode ainda não vê-la. Aguarde um instante e execute novamente, ou force o flush com SYSTEM FLUSH LOGS caso você tenha o grant necessário.O agrupamento por user e http_user_agent é o que atribui o tráfego: ele distingue a UI do SQL Console e de qualquer outra coisa que se conecte ao endpoint, independentemente das tabelas para as quais suas sources apontem. Filtrar por is_initial_query = 1 mantém uma linha por consulta conforme ela foi submetida — consultas secundárias da execução distribuída e as consultas internas que avaliam visões materializadas são registradas separadamente, com is_initial_query = 0.No service read-write, a mesma consulta deve mostrar inserts do usuário de ingestão e nenhum tráfego de consultas do ClickStack.Executar a consulta em cada service, um por vez, é a verificação confiável, porque o cluster default contém apenas as réplicas do service ao qual você está conectado. Para uma visão agregada de todo o warehouse, use o nome de cluster all_groups.default:hostName() identifica uma réplica, e não um service — para atribuir atividade a um service específico, consulte esse service diretamente.Separando mesclagens da ingestão
Em taxas de ingestão sustentadas muito altas, as mesclagens — e não os inserts em si — tornam-se o custo dominante no serviço de ingestão. Como as mesclagens são distribuídas entre todos os read-write services que compartilham o armazenamento, elas também podem acabar recaindo sobre um serviço que você destinou a outra finalidade. Nessas implantações, as mesclagens podem ser retiradas por completo do serviço de ingestão, resultando em uma topologia de três serviços:Requer uma solicitação ao suporteDesabilitar mesclagens em um read-write service não é configurável pelo Cloud console. Entre em contato com o suporte para aplicar essa configuração a um serviço.
- Não conte com o auto-idling em nenhum dos read-write services. Um serviço com mesclagens desabilitadas ainda processa os eventos de download e remoção de partes gerados por inserts em outros pontos do warehouse, e uma contagem alta de partes não mescladas pode, por si só, impedir o idling. Planeje manter ambos os read-write services continuamente ativos.
- Mantenha as consultas fora dos dois read-write services. Consultas
SELECTpesadas em um read-write service competem com o trabalho de mesclagem por CPU e memória — justamente o modo de falha que essa topologia existe para evitar. Aponte o ClickStack para o read-only service conforme descrito acima. - As mutações, quando houver, são rastreadas no serviço que as executa. Mutações são raras em observabilidade — o schema do ClickStack define
ttl_only_drop_parts = 1, de modo que a retenção comum descarta partes expiradas inteiras durante as mesclagens de TTL, em vez de remover linhas por mutação. Se você enviar ao serviço de ingestão umALTERque gere mutação, ele será executado pelo serviço de mesclagem, e seu progresso aparecerá emsystem.mutationsnesse serviço, e não no serviço de ingestão.
Administração e DDL
Todas as alterações de schema devem ser executadas no serviço read-write, incluindo:- Criação de tabelas — realizada automaticamente pelo ClickStack collector na primeira ingestão
- Como modificar o TTL para alterar a retenção
- Criação de visões materializadas para acelerar consultas
- Adição de skip indexes, projeções e outras otimizações de desempenho
Isolando workloads agênticos
Os AI assistants conectados por meio do servidor MCP do ClickStack geram tráfego de leitura como qualquer dashboard, mas com um padrão de carga diferente: um agent que investiga um incidente dispara muitas queries exploratórias em rápida sucessão, sobre intervalos que ninguém escolheu de antemão. Compartilhar um único read-only service entre os agents e a UI faz com que esse pico de carga passe na frente dos dashboards que um engenheiro está consultando durante o mesmo incidente. O mesmo padrão de warehouse se aplica — dê aos agents seu próprio compute read-only:1
Adicione um segundo read-only service
Crie outro read-only service no warehouse, exatamente como na configuração acima. Ele lê as mesmas tabelas que o service que atende a UI, sem nenhum dado para copiar.Em seguida, inicie o ClickStack nele uma vez pelo Cloud console, como em apontar o ClickStack para um read-only service. O Cloud MCP precisa de um service com o ClickStack habilitado, além do próprio MCP — consulte os prerequisites do MCP.Dimensione-o para a carga de queries que você espera dos agents, e não pela QPS de dashboards do sizing model, e mantenha o auto-idling habilitado: o uso agêntico costuma ser intermitente, então o service pode ficar em idle entre as investigations.
2
Habilite o MCP nesse service
Abra o read-only service no ClickHouse Cloud console, clique em Connect, selecione Connect with MCP e ative a opção. Consulte habilitar o remote MCP server.
3
Aponte os MCP clients para ele
O Cloud MCP endpoint é o mesmo para todos os services — as requests são roteadas pelo cabeçalho Qualquer MCP client pode enviar o cabeçalho — consulte direcionar para um service específico para ver a configuração equivalente no Cursor, no VS Code e em outros.
x-service-id e, sem ele, vão para o primeiro ClickStack service usado pela sua conta. Copie sua configuração MCP existente e adicione o cabeçalho com o ID do novo read-only service:Alertas
O ClickStack avalia um alerta no service a partir do qual ele foi criado, portanto os alertas são executados no mesmo compute da UI — o read-only service nesta topologia.Managed ClickStackPara habilitar alertas, pelo menos um usuário com permissões de Service Admin precisa fazer login no ClickStack ao menos uma vez. Isso provisiona o database user dedicado que executa as consultas dos alertas, e esse usuário é compartilhado por todos os services do warehouse. Consulte nosso guia sobre Concessão de acesso ao Managed ClickStack.
Isolando a avaliação de alertas
A carga de alertas não pode ser roteada de forma centralizada, porque os alertas são criados pelos usuários: quem adiciona um alerta no ClickStack o adiciona ao service em que está trabalhando, e ele é avaliado no compute desse service. Não existe setting que mova os alertas de um service para outro lugar. O que você pode isolar são os alertas mantidos centralmente — aqueles que uma equipe de plataforma mantém para toda a organização, que normalmente também são os avaliados com mais frequência. Dê a eles um read-only service próprio no warehouse e crie-os a partir de um ClickStack iniciado ali:
Os demais trade-offs decorrem do fato de o state ser por service:
- Os alertas comuns, e quaisquer dashboards associados a eles, existem apenas no service de alertas e não ficam visíveis para os usuários que trabalham no service de consulta. As notificações são entregues aos mesmos destinos em qualquer um dos casos, então o que os usuários perdem é a visibilidade das definições, não o alerta em si.
- As sources no service de alertas são objetos separados. Aquelas que usam o schema padrão do OpenTelemetry são detectadas automaticamente, mas sources custom também precisam ser configuradas ali antes que um alerta possa referenciá-las.