Introducción
En esta guía, primero veremos cómo ClickHouse distribuye una consulta entre varios segmentos mediante tablas distribuidas, y luego cómo una consulta puede aprovechar varias réplicas durante su ejecución.En una arquitectura shared-nothing, los clústeres suelen dividirse en múltiples segmentos, y cada segmento contiene un subconjunto del total de datos. Una tabla distribuida se sitúa por encima de estos segmentos y proporciona una vista unificada de todos los datos. Las lecturas pueden enviarse a la tabla local. La ejecución de la consulta ocurrirá solo en el segmento especificado, o bien puede enviarse a la tabla distribuida, y en ese caso, cada segmento ejecutará las consultas indicadas. El servidor en el que se consultó la tabla distribuida agregará los datos y responderá al cliente: La figura anterior muestra lo que sucede cuando un cliente consulta una tabla distribuida:
- La consulta SELECT se envía arbitrariamente a una tabla distribuida en un nodo (mediante una estrategia round-robin o después de ser enrutada a un servidor específico por un balanceador de carga). Este nodo pasará a actuar como coordinador.
- El nodo localizará cada segmento que deba ejecutar la consulta mediante la información especificada por la tabla distribuida, y la consulta se enviará a cada segmento.
- Cada segmento lee, filtra y agrega los datos localmente, y luego devuelve un estado fusionable al coordinador.
- El nodo coordinador fusiona los datos y luego envía la respuesta al cliente.
Arquitectura sin segmentos
Introducción a las réplicas paralelas
- La consulta del cliente se envía a un nodo después de pasar por un balanceador de carga. Este nodo se convierte en el coordinador de esta consulta.
- El nodo analiza el índice de cada parte y selecciona las partes y los gránulos adecuados para procesar.
- El coordinador divide la carga de trabajo en un conjunto de gránulos que pueden asignarse a diferentes réplicas.
- Cada conjunto de gránulos es procesado por las réplicas correspondientes y se envía un estado fusionable al coordinador cuando terminan.
- Por último, el coordinador fusiona todos los resultados de las réplicas y luego devuelve la respuesta al cliente.
- Algunas réplicas pueden no estar disponibles.
- La replicación en ClickHouse es asíncrona; es posible que algunas réplicas no tengan las mismas partes en un momento dado.
- La latencia de cola entre réplicas debe gestionarse de algún modo.
- La caché del sistema de archivos varía de una réplica a otra según la actividad en cada réplica, lo que significa que una asignación aleatoria de tareas podría dar lugar a un rendimiento subóptimo debido a la localidad de la caché.
Anuncios
- La consulta del cliente se envía a un nodo tras pasar por un balanceador de carga. Ese nodo se convierte en el coordinador de la consulta.
- El nodo coordinador envía una solicitud para obtener anuncios de todas las réplicas del clúster. Las réplicas pueden tener vistas ligeramente diferentes del conjunto actual de partes de una tabla. Por ello, necesitamos recopilar esta información para evitar decisiones de planificación incorrectas.
- A continuación, el nodo coordinador usa los anuncios para definir un conjunto de gránulos que pueden asignarse a las distintas réplicas. Aquí, por ejemplo, podemos ver que no se asignó ningún gránulo de la parte 3 a la réplica 2 porque esta réplica no incluyó esa parte en su anuncio. Observe también que no se asignaron tareas a la réplica 3 porque la réplica no proporcionó ningún anuncio.
- Después de que cada réplica haya procesado la consulta sobre su subconjunto de gránulos y el estado fusionable se haya enviado de vuelta al coordinador, el coordinador fusiona los resultados y la respuesta se envía al cliente.
Coordinación dinámica
- Las réplicas informan al nodo coordinador de que pueden procesar tareas; también pueden especificar cuánta carga de trabajo pueden procesar.
- El coordinador asigna tareas a las réplicas.
- Las réplicas 1 y 2 pueden terminar su tarea muy rápidamente. Entonces solicitarán otra tarea al nodo coordinador.
- El coordinador asigna nuevas tareas a las réplicas 1 y 2.
- Todas las réplicas ya han terminado de procesar su tarea. Solicitan más tareas.
- El coordinador, usando los anuncios, comprueba qué tareas quedan por procesar, pero no queda ninguna.
- El coordinador informa a las réplicas de que todo ya se ha procesado. Ahora combinará todos los estados fusionables y responderá a la consulta.
Gestión de la localidad de la caché
| Réplica 1 | Réplica 2 | Réplica 3 | |
|---|---|---|---|
| Parte 1 | g1, g6, g7 | g2, g4, g5 | g3 |
| Parte 2 | g1 | g2, g4, g5 | g3 |
| Parte 3 | g1, g6 | g2, g4, g5 | g3 |
max_parallel_replicas es menor
que el número de réplicas, entonces se eligen réplicas aleatorias para la ejecución de consultas.
Robo de tareas
Limitaciones
Si encuentra un problema que no corresponde a ninguna de las limitaciones indicadas a continuación y
sospecha que las réplicas paralelas son la causa, abra un issue en GitHub con
la etiqueta
comp-parallel-replicas.| Limitación | Descripción |
|---|---|
| Consultas complejas | Actualmente, las réplicas paralelas funcionan bastante bien con consultas simples. Capas de complejidad como CTE, subconsultas, JOIN, consultas no planas, etc. pueden tener un impacto negativo en el rendimiento de la consulta. |
| Consultas pequeñas | Si está ejecutando una consulta que no procesa muchas filas, ejecutarla en varias réplicas puede no mejorar el tiempo de respuesta, ya que el tiempo de red necesario para la coordinación entre réplicas puede añadir ciclos adicionales a la ejecución de la consulta. Puede mitigar estos problemas usando la configuración parallel_replicas_min_number_of_rows_per_replica. |
| Las réplicas paralelas están deshabilitadas con FINAL | |
| Las proyecciones no se usan junto con las réplicas paralelas | |
| Datos de alta cardinalidad y agregación compleja | La agregación de alta cardinalidad que requiere enviar muchos datos puede ralentizar significativamente sus consultas. |
| Compatibilidad con el nuevo analizador | El nuevo analizador puede ralentizar o acelerar significativamente la ejecución de consultas en determinados escenarios. |
| Setting | Description |
|---|---|
enable_parallel_replicas | 0: deshabilitado1: habilitado 2: Fuerza el uso de réplicas paralelas; lanzará una excepción si no se utilizan. |
cluster_for_parallel_replicas | El nombre del clúster que se usará para las réplicas paralelas; si usas ClickHouse Cloud, utiliza default. |
max_parallel_replicas | Número máximo de réplicas que se usarán para ejecutar la consulta en múltiples réplicas; si se especifica un número inferior al de réplicas del clúster, los nodos se seleccionarán aleatoriamente. Este valor también puede sobreasignarse para tener en cuenta el escalado horizontal. |
parallel_replicas_min_number_of_rows_per_replica | Ayuda a limitar el número de réplicas utilizadas en función del número de filas que deben procesarse; el número de réplicas utilizadas se define mediante: estimated rows to read / min_number_of_rows_per_replica. |
enable_analyzer | La ejecución de consultas con réplicas paralelas solo es compatible cuando el analizador está habilitado |
Investigar problemas con las réplicas paralelas
system.query_log. También puedes
consultar la tabla system.events
para ver todos los eventos que han ocurrido en el servidor, y puedes usar la
función de tabla clusterAllReplicas para ver las tablas en todas las réplicas
(si usas Cloud, utiliza default).
Query
Respuesta
Respuesta
Response
system.text_log también
contiene información sobre la ejecución de consultas usando réplicas paralelas:
Query
Respuesta
Respuesta
Response
EXPLAIN PIPELINE. Muestra cómo ClickHouse
va a ejecutar una consulta y qué recursos se van a utilizar durante la
ejecución de la consulta. Tomemos la siguiente consulta como ejemplo:
EXPLAIN PIPELINE (without parallel replica)
EXPLAIN PIPELINE (with parallel replica)