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:
- Seleccione el read-only service en la ClickHouse Cloud console.
- Seleccione ClickStack en la barra de navegación izquierda.
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 Un resultado vacío aquí no significa por sí solo que las consultas hayan ido a otra parte: 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
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: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: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.
- 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
SELECTpesadas 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 unALTERque produce una mutación, la ejecuta el servicio de fusión, y su progreso aparece allí ensystem.mutationsy 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:- Creación de tablas: la realiza automáticamente el collector de ClickStack en la primera ingestión
- Modificar TTL para cambiar la retención
- Crear vistas materializadas para acelerar las consultas
- Añadir skip indexes, projections y otras optimizaciones de rendimiento
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 Cualquier MCP client puede enviar el encabezado: consulte Targeting a specific service para ver la configuración equivalente en Cursor, VS Code y otros.
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: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.
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í:
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.