Revisión de solo lectura del disco de ClickHouse® en Langfuse, SigNoz y ClickStack autoalojados
El disco se llena, pero tus propios datos ocupan poco. Normalmente el espacio se lo llevan las tablas de registro del sistema (system log tables) de ClickHouse, que por defecto no tienen límite de tamaño. diskvet muestra qué ocupa el disco e imprime los comandos exactos para solucionarlo. No ejecuta nada por su cuenta: cada comando lo ejecutas tú.
Gratuito, Apache-2.0, sin registro. Son dos archivos cortos que puedes leer antes de ejecutarlos. El script solo se comunica con tu ClickHouse; no envía nada a ningún otro lugar.
Lo que suele pasar
- 66.86 GiB en
system.trace_logfrente a unos 51 MiB en las tablas de Langfuse (langfuse#13123); - 80+ GB en tablas de registro del sistema frente a menos de 500 MB de telemetría (SigNoz#12050);
- un volumen de 10 Gi que se llenó en 10 días (ClickStack-helm-charts#275).
La solución principal es conocida: hacer TRUNCATE de las tablas de registro y añadir
un TTL. El informe también cubre las trampas que aparecen al aplicarla en la práctica:
el límite de 50 GB de TRUNCATE, las copias antiguas *_log_N que quedan
tras un reinicio, la configuración especial de opentelemetry_span_log, los logs de
Docker sin rotación y las filas eliminadas que siguen ocupando espacio.
Inicio rápido: Langfuse con docker compose (30 segundos)
En la máquina donde se ejecuta el docker-compose.yml de Langfuse:
cd langfuse # la carpeta con el docker-compose.yml de Langfuse
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/diskvet.sh
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/checks.sql
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS # opcional: comprueba que ambos archivos coinciden con la versión publicada
less checks.sql # léelo primero: solo SELECT sobre system.*
sh diskvet.sh report --docker auto > report.md
--docker auto encuentra por sí solo el contenedor de ClickHouse y ejecuta
clickhouse-client dentro de él, así que no necesitas ni un cliente en el host ni un
puerto abierto. Sin --user, usa los valores de CLICKHOUSE_USER /
CLICKHOUSE_PASSWORD del propio contenedor, y la contraseña nunca sale del
contenedor.
Otras formas de conectarse:
sh diskvet.sh report --docker signoz-clickhouse # un contenedor por nombre
sh diskvet.sh report --host 127.0.0.1 --user diskvet --password '...' # clickhouse-client local
Requiere sh POSIX, awk, sed,
od y date, además de docker o clickhouse-client.
No hace falta jq ni Python. El script genera el informe en inglés. La última versión
está en GitHub Releases.
Qué comprueba
| # | Comprobación | Fuentes | Solución típica en el informe |
|---|---|---|---|
| 1 | Tablas de registro del sistema sin TTL | system.tables, system.parts | TRUNCATE (con el flag de un solo uso para tablas de más de 50 GB), un archivo de TTL listo para config.d, copias antiguas *_log_N para eliminar |
| 2 | Espacio en disco fuera de las partes (parts) de las tablas de ClickHouse | system.disks frente a todas las partes | rotación de los logs de Docker y en qué otros lugares buscar |
| 3 | Uso del disco y previsión aproximada | system.disks, system.asynchronous_metric_log | qué liberar primero |
| 4 | Crecimiento diario | system.part_log | en qué tabla se escribió más en 24 h |
| 5 | Demasiadas partes | system.parts, system.merge_tree_settings, system.events | cuánto falta para los límites de inserción de la tabla |
| 6 | Partes inactivas y partes separadas (detached) | system.parts, system.detached_parts | partes atascadas, DROP DETACHED PART |
| 7 | Filas eliminadas y mutaciones atascadas | system.parts, system.mutations | APPLY DELETED MASK para las particiones concretas, KILL MUTATION |
Cada comprobación da un resultado OK, INFO, WARN o CRITICAL; los umbrales están en el
README. Cada solución indica su
grado de seguridad y si requiere un reinicio. Si la consulta de una comprobación falla, esta
muestra NOT_RUN con el motivo; las demás se ejecutan de todos modos.
Qué lee y qué no lee nunca
Lee
- metadatos de
system.tables,system.parts,system.disks,system.detached_parts,system.merge_tree_settings,system.mutations,system.part_log,system.asynchronous_metric_log,system.asynchronous_metrics,system.events; - si tiene permiso,
system.server_settings(solomax_table_size_to_drop); - una consulta de verificación,
SELECT getSetting('readonly'), para confirmar que la sesión es de solo lectura.
Nunca lee
- filas de tus propias tablas: ningún
FROMniJOINsobre ellas, ninguna función de tabla, ningúndictGet; el conjunto de pruebas lo verifica; system.query_log, el texto de las consultas, los comandos de las mutaciones ni los textos de error.
El informe local muestra los nombres reales de las bases de datos y las tablas, porque los necesitas para aplicar las soluciones. No sale de tu máquina.
Dos formas seguras de ejecutarlo
- Con un usuario existente. Las consultas se ejecutan con
readonly=2y límites (30 s, 10 000 filas, 2 hilos, 500 MB). Si el servidor no permite el modo de solo lectura para este usuario, el script se detiene sin ejecutar nada. - Con un usuario dedicado, para auditorías de seguridad: permisos limitados a las tablas del sistema citadas arriba y ningún acceso a los datos del producto. El SQL exacto está en el README.
Probado con las imágenes estándar de clickhouse/clickhouse-server 24.1, 24.8,
25.12 y 26.9, en instalaciones similares a las de Langfuse y SigNoz. Aún sin probar: clústeres
replicados, Kubernetes, discos en almacenamiento de objetos, macOS.
¿Prefieres solucionarlo a mano?
Por qué ClickHouse llena el disco en Langfuse y SigNoz autoalojados y cómo solucionarlo
Una consulta de solo lectura para confirmarlo, cómo liberar el espacio ahora mismo y cómo evitar que vuelva a pasar sin caer en las trampas conocidas. Cada comando de la guía se ejecutó en ClickHouse 24.8, 25.12 y 26.9. No necesitas diskvet para seguirla.
Revisiones cada hora: beta gratuita en octubre
El script es gratuito y lo seguirá siendo. Pero una sola ejecución no puede saber cuándo se quedará realmente sin espacio el disco. Esa es la parte que estoy desarrollando ahora:
- una instantánea cada hora: exactamente el JSON que imprime
sh diskvet.sh --print-payload, nada más; - un correo antes de que se llene el disco, solo cuando cambia un estado;
- un aviso cuando las instantáneas dejan de llegar;
- un informe breve cada lunes.
No tienes que alojar nada ni abrir ningún puerto: tu servidor envía una pequeña instantánea firmada y no recibe ninguna conexión entrante. Nunca se envían nombres de host, direcciones IP, usuarios, textos de consultas ni errores; los nombres de tus propias tablas solo salen de tu servidor como hashes con sal.
¿Quieres participar? Comenta en el hilo «Early access» (discusión #1) en qué entorno se ejecuta tu ClickHouse y qué tamaño aproximado tiene el disco. Puedes escribir en español, aunque la respuesta puede llegar en inglés. Cuando se abra la beta, recibirás una respuesta allí mismo. Por favor, no publiques allí nombres de empresas ni de hosts: es un hilo público.
La beta dura 30 días; después, las revisiones cada hora pasan a ser un plan de pago, y el script sigue siendo gratuito y de código abierto. Servidores en Kazajistán: por ahora, solo el informe local.
¿El script pasa por alto algún problema o propone una solución incorrecta? Abre un issue: es lo más útil que puedes hacer. Puedes escribir en español, aunque la respuesta puede llegar en inglés.