Skip to main content
Las cargas de trabajo de observabilidad imponen dos demandas muy distintas sobre los mismos datos. La ingestión es continua e intensiva en escritura, con fusiones en segundo plano que consumen CPU y memoria mucho después de que finalice un insert. La carga de consultas es irregular: los dashboards y las búsquedas alcanzan su punto máximo durante un incidente, justo cuando una respuesta lenta resulta menos aceptable. Con los warehouses de ClickHouse Cloud, ambas cargas de trabajo pueden atenderse a partir de los mismos datos mediante cómputo independiente, de modo que ninguna compita con la otra por CPU y memoria. Los warehouses son una característica de ClickHouse Cloud, por lo que la configuración descrita aquí se aplica a ClickStack ejecutándose sobre ClickHouse Cloud, donde cada lado del split se dimensiona, escala y pasa a estado idle de forma independiente sobre una única copia de los datos.
Cuándo vale la pena el aislamientoEl aislamiento está orientado a implementaciones grandes con ingestión continua. Por debajo de aproximadamente 100 TB/mes de datos almacenados, un único service de lectura y escritura suele absorber ambas cargas de trabajo, por lo que probablemente no haga falta un segundo service. Utilice el sizing model para estimar su volumen comprimido mensual.

Por qué aislar las lecturas de las escrituras

  • Las escrituras dejan de degradar las lecturas. La ingestión continua de OpenTelemetry —los inserts en sí, más las fusiones en segundo plano que los siguen— compite con las consultas de dashboards y búsquedas por CPU y memoria. La latencia de lectura puede degradarse de forma notable mientras la ingestión está en curso, y se recupera cuando esta se detiene.
  • Las lecturas dejan de interferir con las escrituras. La contención se produce en ambos sentidos: una consulta ad-hoc pesada o la renderización costosa de un dashboard pueden agotar la memoria del service y hacer que los inserts fallen directamente, no solo que se ralenticen.
  • El compute de solo lectura se dedica por completo a las consultas. Los read-only services no realizan fusiones en segundo plano fuera de las system tables. Además, pasan a estado idle sin demora, a diferencia de los read-write services, a los que las fusiones pueden mantener activos.
  • Cada lado se dimensiona por separado. El sizing model estima por separado el compute de ingestión y el de consultas, y un warehouse te permite provisionar cada uno como un service independiente. Por encima del baseline de 1 QPS del modelo, el compute de consultas predomina —su ejemplo práctico con 5 QPS llega a 58 vCPU para la ingestión frente a 290 para las consultas—, por lo que un service de escritura pequeño puede alimentar a un service de lectura mucho mayor.
  • El idling y el autoscaling se configuran por service. Cada service tiene su propio número de réplicas y sus propios ajustes de autoscaling y auto-idling, de modo que el service de escritura puede permanecer siempre activo para la ingestión continua mientras el service de lectura pasa a idle fuera del horario laboral.
  • El almacenamiento no se duplica. Los services de un warehouse comparten la misma carpeta de object storage y las mismas tablas, y el almacenamiento se factura una sola vez.
  • El acceso puede restringirse por endpoint. Las IP access lists se aplican por service, por lo que el endpoint de escritura puede ser accesible únicamente desde tus collectors y el endpoint de lectura únicamente desde tu implementación de ClickStack. Consulta nuestra guía sobre Control de acceso de red.

Arquitectura

La topología recomendada es un warehouse con un servicio read-write para la ingestión y un servicio read-only para ClickStack: Ten en cuenta lo siguiente al planificar la topología:
  • El primer servicio de un warehouse siempre es read-write, y el tipo de servicio queda fijado en el momento de su creación: para cambiar entre read-only y read-write, crea un nuevo servicio en el warehouse.
  • Todos los servicios de un warehouse comparten el mismo proveedor de nube, región, versión de ClickHouse y Keeper, así como la programación de upgrade del servicio primario.
  • Usa un solo servicio read-write para la ingestión. Las fusiones se reparten entre todos los servicios read-write que comparten el almacenamiento, de modo que la fusión correspondiente a un insert en un servicio puede acabar ejecutándose en otro. Si ese otro servicio además atiende consultas pesadas, esas consultas competirán con la fusión por CPU y memoria en el servicio que la ejecuta, lo que ralentiza las fusiones de los inserts del primer servicio y, con ellas, el rendimiento de inserción. Mantén los workloads de consulta en el servicio read-only y añade un segundo servicio read-write solo si necesitas separar las fusiones de la ingestión.

Configurar un despliegue aislado

1

Prepare el servicio de lectura y escritura

Utiliza tu servicio existente —o el servicio principal de un nuevo warehouse— para la ingestión, dimensionado según el compute de ingesta del sizing model.Crea la base de datos y el usuario dedicado a la ingestión en este servicio. Como todos los servicios de un warehouse comparten los controles de acceso, los usuarios que crees aquí estarán disponibles en todos los servicios del warehouse:
Genere la contraseña con una herramienta como openssl rand -base64 24 y almacénela en un gestor de secretos, no en un manifest ni en el historial del shell. Consulte nuestra guía sobre Crear un usuario de ingestión para más detalles.Si este service ya forma parte de un warehouse, tenga en cuenta que el DDL a nivel de database puede quedarse bloqueado cuando otro service del mismo está idled; consulte Administración y DDL.
2

Añada un servicio de solo lectura al warehouse

En la consola de ClickHouse Cloud, haga clic en el signo más del service que acaba de preparar para crear un segundo service que comparta sus datos. Seleccione read-only como service type y dimensiónelo según el compute de consultas que indique el sizing model.Para ver el procedimiento completo, consulte nuestra guía Cómo configurar un warehouse.
3

Dirija la ingestión al servicio de lectura/escritura

Configure su collector para exportar al service endpoint de lectura-escritura, autenticándose como el usuario de ingestión:
Consulta las opciones de configuración del collector para más detalles, o los ajustes equivalentes para Vector y otras vías de ingestión.Las escrituras enviadas al endpoint de solo lectura se rechazan, por lo que el collector siempre debe apuntar al servicio de lectura y escritura.
4

Configure ClickStack para usar el servicio de solo lectura

La UI de ClickStack siempre se conecta al ClickHouse service desde el que se inicia en la ClickHouse Cloud console. Para ejecutarla en read-only compute:
  1. Seleccione el read-only service en la ClickHouse Cloud console.
  2. Seleccione ClickStack en la barra de navegación izquierda.
A partir de ese momento, todas las consultas que emita la UI se ejecutan en ese read-only compute. No hace falta ninguna configuración dentro de ClickStack. Consulte nuestra guía sobre Uso de ClickStack con read-only compute.
El estado de ClickStack está acotado al serviceLos dashboards, saved searches, alerts y sources pertenecen al service desde el que se inició ClickStack y no le acompañan a otro service del mismo warehouse, aunque ambos services compartan los mismos datos. Los sources que utilizan el esquema predeterminado de OpenTelemetry se detectan automáticamente en el nuevo service, por lo que la búsqueda sobre esos datos funciona de inmediato, pero los sources personalizados o configurados manualmente —y todo lo demás que haya guardado— deben recrearse.Elija el service desde el que desea ejecutar ClickStack antes de crear dashboards. Si va a cambiar una implementación ya establecida, tenga en cuenta que los alerts creados en el service anterior se siguen evaluando allí —en el compute de ese service— hasta que los elimine.
5

Verifique la división

Ejecuta una búsqueda o abre un dashboard en ClickStack y luego comprueba dónde se ejecutaron las consultas. Las tablas system se escriben en el nodo que ejecutó la consulta, por lo que un servicio con más de una réplica necesita clusterAllReplicas con el nombre de cluster default para abarcarlas todas. En el servicio de solo lectura deberías ver las consultas de ClickStack:
Un resultado vacío aquí no significa por sí solo que las consultas hayan ido a otra parte: system.query_log se vuelca periódicamente —cada 7,5 segundos de forma predeterminada—, por lo que una consulta ejecutada inmediatamente después de una búsqueda puede que aún no aparezca. Espera un momento y vuelve a ejecutarla, o fuerza el volcado con SYSTEM FLUSH LOGS si cuentas con el grant correspondiente.Agrupar por user y http_user_agent es lo que permite atribuir el tráfico: distingue la UI de la consola SQL y de cualquier otro elemento que se conecte al endpoint, sean cuales sean las tablas a las que apunten tus sources. Filtrar por is_initial_query = 1 conserva una fila por consulta tal y como se envió; las consultas secundarias derivadas de la ejecución distribuida, así como las consultas internas que evalúan las vistas materializadas, se registran por separado con is_initial_query = 0.En el service read-write, esa misma consulta debería mostrar inserts del usuario de ingestión y ningún tráfico de consultas de ClickStack.Ejecutar la consulta en cada service, uno por uno, es la comprobación fiable, ya que el cluster default contiene únicamente las réplicas del service al que estás conectado. Para obtener una vista de agregación de todo el warehouse, utiliza en su lugar el nombre de cluster all_groups.default:
Hay dos aspectos a tener en cuenta con esta consulta: los servicios que han quedado inactivos (idled) no pueden aportar filas, por lo que debes reactivarlos primero si necesitas resultados completos, y hostName() identifica una réplica, no un servicio; para atribuir la actividad a un servicio concreto, consulta directamente ese servicio.

Separar las fusiones de la ingestión

Con tasas de ingestión sostenidas muy altas, las fusiones —y no las inserciones en sí— se convierten en el coste dominante del servicio de ingestión. Dado que las fusiones se reparten entre todos los servicios de lectura y escritura que comparten el almacenamiento, también pueden acabar ejecutándose en un servicio que habías destinado a otra cosa. En estas implementaciones, las fusiones pueden sacarse por completo del servicio de ingestión, lo que da lugar a una topología de tres servicios:
Requiere una solicitud a soporteDeshabilitar las fusiones en un servicio de lectura y escritura no se puede configurar desde la consola de Cloud. Contacta con soporte para aplicarlo a un servicio.
Merece la pena considerar esta topología cuando la ingestión por sí sola satura un servicio, o cuando necesitas dos servicios de lectura y escritura porque ambos deben escribir. Si ClickStack atiende por completo tu carga de consultas —y solo lee—, la división más sencilla de lectura y escritura más solo lectura cubre el requisito y es la opción mejor soportada. Al utilizar esta topología, ten en cuenta lo siguiente:
  • No dependas del auto-idling en ninguno de los dos servicios de lectura y escritura. Un servicio con las fusiones deshabilitadas sigue procesando los eventos de descarga y eliminación de partes que generan las inserciones en otros puntos del warehouse, y un número elevado de partes sin fusionar puede bloquear el idling por sí solo. Prevé que ambos servicios de lectura y escritura estén continuamente activos.
  • Mantén las consultas fuera de ambos servicios de lectura y escritura. Las consultas SELECT pesadas en un servicio de lectura y escritura compiten por CPU y memoria con el trabajo de fusión, que es precisamente el modo de fallo que esta topología pretende evitar. Apunta ClickStack al servicio de solo lectura tal como se describe más arriba.
  • Las mutaciones, cuando las haya, se registran en el servicio que las ejecuta. Las mutaciones son poco frecuentes en observabilidad: el esquema de ClickStack establece ttl_only_drop_parts = 1, por lo que la retención ordinaria elimina partes expiradas completas durante las fusiones de TTL en lugar de mutar filas para borrarlas. Si envías al servicio de ingestión un ALTER que produce una mutación, la ejecuta el servicio de fusión, y su progreso aparece allí en system.mutations y no en el servicio de ingestión.

Administración y DDL

Todos los cambios de esquema deben ejecutarse contra el servicio de lectura-escritura, incluidos: Los usuarios, roles y grants no son cambios de esquema: los comparten todos los servicios del warehouse, por lo que basta con crear cada uno una sola vez, desde cualquier servicio. Los pasos de configuración anteriores crean el usuario de ingestión. Cualquier otro client que apuntes al servicio de solo lectura debería autenticarse como un usuario de consulta de solo lectura independiente, con los permisos que requiere la UI de ClickStack, y no con los grants de ingestión mostrados arriba. Conéctate al servicio de lectura-escritura mediante la SQL Console o el clickhouse client. Como el warehouse comparte almacenamiento y controles de acceso, los cambios son visibles de inmediato para el servicio de solo lectura. Si has separado los merges de la ingestión, las sentencias pueden enviarse a cualquiera de los dos servicios de lectura-escritura, pero ten en cuenta que las mutations se ejecutan y se registran en el servicio de merge.
El DDL de base de datos puede quedarse colgado cuando otro servicio está idledLas sentencias CREATE, RENAME y DROP DATABASE pueden verse bloqueadas por servicios idled o detenidos del warehouse, lo que provoca que se queden colgadas. Es fácil que ocurra en esta topología, porque los servicios de solo lectura pasan a idle sin demora. Ejecuta las sentencias a nivel de base de datos con distributed_ddl_task_timeout=0, establecido por consulta o para la session:
Un servicio que hayas detenido manualmente debe iniciarse de nuevo antes de que se puedan ejecutar consultas contra él.
Las vistas materializadas se activan con la inserción, por lo que las ejecuta el servicio de lectura-escritura. El servicio de solo lectura consulta sus tablas de destino como cualquier otra tabla, incluidas las views registradas contra una fuente de ClickStack para acelerar las consultas.

Aislamiento de cargas de trabajo agénticas

Los AI assistants conectados a través del servidor MCP de ClickStack generan tráfico de lectura como cualquier dashboard, pero su patrón de carga es distinto: un agent que investiga un incidente emite muchas queries exploratorias en rápida sucesión, sobre rangos que nadie eligió por adelantado. Compartir un único read-only service entre los agents y la UI hace que esa ráfaga se anteponga a los dashboards que un ingeniero está consultando durante ese mismo incidente. Aquí se aplica el mismo patrón de warehouse: dar a los agents su propio read-only compute:
1

Añadir un segundo read-only service

Cree otro read-only service en el warehouse, exactamente como en la configuración anterior. Lee las mismas tablas que el service que atiende la UI, sin datos que copiar.Después, inicie ClickStack en él una vez desde la Cloud console, como en apuntar ClickStack a un read-only service. Cloud MCP necesita un service con ClickStack habilitado, además de MCP en sí: consulte los prerequisites de MCP.Dimensiónelo según la carga de queries que espere de los agents y no según el QPS de dashboards del sizing model, y deje el auto-idling habilitado: el uso agéntico suele ser intermitente, por lo que el service puede permanecer inactivo entre investigaciones.
2

Habilitar MCP en ese service

Abra el read-only service en la ClickHouse Cloud console, haga clic en Connect, seleccione Connect with MCP y actívelo. Consulte habilitar el Remote MCP server.
3

Apuntar los MCP clients a él

El Cloud MCP endpoint es el mismo para todos los services: las solicitudes se enrutan mediante el encabezado x-service-id y, si falta, se dirigen al primer ClickStack service utilizado por su cuenta. Copie su configuración de MCP existente y añada el encabezado con el ID del nuevo read-only service:
Cualquier MCP client puede enviar el encabezado: consulte Targeting a specific service para ver la configuración equivalente en Cursor, VS Code y otros.
MCP escribe state en el service al que apuntaEl servidor MCP puede crear dashboards, alerts y saved searches, además de ejecutar queries, y ese state queda delimitado al service al que se enrutó la solicitud, como todo el state de ClickStack. Un dashboard que un agent cree en el service de agents no aparecerá en la UI de ClickStack iniciada desde el service que atiende a sus ingenieros, y un alert creado allí se evalúa con el compute de ese service, donde un service de agents en idling retrasará u omitirá las evaluaciones, como se explica más abajo. Enrute al mismo service que usa su equipo los agents de los que se espere que creen artifacts duraderos.

Alertas

ClickStack evalúa cada alerta en el service desde el que se creó, por lo que las alertas se ejecutan en el mismo compute que la UI: el read-only service en esta topología.
Managed ClickStackPara habilitar las alertas, al menos un usuario con permisos de Service Admin debe iniciar sesión en ClickStack al menos una vez. Esto aprovisiona el usuario de base de datos dedicado que ejecuta las consultas de las alertas, usuario que se comparte entre todos los services del warehouse. Consulte nuestra guía sobre cómo otorgar acceso a Managed ClickStack.
La evaluación de alertas constituye un workload de consultas recurrente. Téngalo en cuenta al calcular el QPS con el que dimensiona el read-only service: el sizing model trata las consultas de búsqueda, dashboards y alertas como una única cifra agregada.

Aislar la evaluación de alertas

La carga de las alertas no se puede enrutar de forma centralizada, porque las alertas las crean los usuarios: quien añade una alerta en ClickStack la añade al servicio en el que está trabajando, y esta se evalúa con el compute de ese servicio. No existe ninguna configuración que traslade las alertas de un servicio a otro lugar. Lo que sí puedes aislar son las alertas que gestionas de forma centralizada: las que un equipo de plataforma mantiene para toda la organización, que además suelen ser las que se evalúan con mayor frecuencia. Asígnales su propio servicio de solo lectura en el warehouse y créalas desde un ClickStack lanzado allí:
Desactiva el auto-idling en el servicio de alertasTener alertas configuradas en un servicio no lo mantiene activo. Las evaluaciones de alertas que llegan a un servicio en estado idle se retrasan por la reactivación o fallan directamente, de modo que un servicio de alertas con el auto-idling habilitado puede perder evaluaciones. Desactiva el auto-idling en ese servicio y prevé que esté siempre activo. Lo mismo se aplica allí donde se evalúen tus alertas: si se ejecutan en el servicio que da servicio a la UI, ese servicio tampoco puede quedar en idle.
Las demás contrapartidas se derivan de que el state sea propio de cada servicio:
  • Las alertas comunes, y cualquier dashboard asociado a ellas, existen únicamente en el servicio de alertas y no son visibles para los usuarios que trabajan en el servicio de consulta. En ambos casos, las notificaciones se entregan a los mismos destinos, por lo que lo que los usuarios pierden es la visibilidad de las definiciones, no las alertas en sí.
  • Las sources del servicio de alertas son objetos independientes. Las que usan el esquema predeterminado de OpenTelemetry se detectan automáticamente, pero las sources personalizadas también deben configurarse allí antes de que una alerta pueda hacer referencia a ellas.
Si un único conjunto de alertas es lo bastante pequeño como para que su carga de evaluación resulte insignificante frente al tráfico de los dashboards, mantén todo en un solo servicio de solo lectura: el coste operativo de mantener las definiciones en dos lugares es el mayor de los dos costes.

Consideraciones adicionales

Auto-idling. La primera consulta a un read-only service que ha entrado en estado idled debe esperar a que el service arranque, por lo que el uso intermitente sacrifica algo de latencia a cambio de un menor gasto. No cuentes con las alertas para evitar el idling: desactiva el auto-idling en cualquier service del que dependas para evaluarlas, tal como se describe más arriba. La continuous ingestion sí mantiene despierto el read-write service, pero si tu ingestión es intermitente o programada, el primer batch tras un periodo de inactividad tendrá que esperar igualmente, lo que se traduce en telemetría retrasada. Copias de seguridad. Las copias de seguridad se realizan únicamente en el primary service, y abarcan los datos de todo el warehouse. Restaurar una copia de seguridad crea un service completamente nuevo que no está conectado al warehouse existente. Límites de réplicas. El número combinado de réplicas de todos los services de un warehouse está limitado de forma predeterminada; consulta los límites de uso. Aislar ClickStack de otros workloads. Si añades ClickStack a un service que ya ejecuta otros workloads, como analítica de aplicaciones en tiempo real, se recurre a esa misma funcionalidad de warehouse para dotar a la observabilidad de su propio compute. Consulta nuestra guía sobre Aislar workloads de observabilidad. Para conocer el conjunto completo de comportamientos y limitaciones de los warehouses, consulta nuestra guía sobre Warehouses.
Última modificación el 26 de septiembre de 2026