Este tema aborda las preguntas frecuentes sobre ApsaraDB for ClickHouse, como la selección de instancias, el escalado, las conexiones, la migración de datos, las consultas y el almacenamiento.
-
Selección y compra
-
Escalado
-
Conexiones
-
Migración y sincronización
How do I resolve the "too many parts" error that occurs during data import?
Why do row counts differ between Hive and ClickHouse after data import?
Why do row counts differ between Kafka and ClickHouse after data import?
How do I import data from an existing ClickHouse cluster to Alibaba Cloud ClickHouse?
How do I resolve the "Too many partitions for single INSERT block (more than 100)" error?
How do I resolve network connectivity issues between the destination cluster and a data source?
Can I migrate a Community-Compatible Edition cluster to an Enterprise Edition cluster?
-
Escritura y consulta de datos
How do I handle the memory limit exceeded error that occurs during a query?
Why does an Enterprise Edition cluster report a memory limit error when I run an SQL statement?
How do I handle the "concurrency limit exceeded" error that occurs during queries?
How do I resolve inconsistent results for the same query after data writes have stopped?
Why are created tables sometimes not visible and why do query results fluctuate?
How do I resolve timestamp mismatches between queried and written data?
How do I handle the "table does not exist" error that occurs after I create a table?
Why is no new data ingested after a Kafka external table is created?
Why does the time returned by a query not match the time zone of the client?
Why isn't data merged by primary key after an OPTIMIZE task completes?
Why doesn't the TTL setting take effect after an OPTIMIZE task completes?
Why don't UPDATE and DELETE operations take effect after an OPTIMIZE task completes?
How do I use DDL statements to add, delete, or modify columns?
How do I handle the "set global on cluster default" syntax error?
Why does deduplication by using the FINAL keyword in ClickHouse fail due to a JOIN operation?
Why are results inconsistent across consecutive queries in a Community-Compatible Edition cluster?
Why do DELETE/UPDATE operations in a Community-Compatible Edition cluster not complete?
-
Almacenamiento de datos
-
Monitoreo, actualizaciones y parámetros del sistema
-
Otros
Comparación entre ApsaraDB for ClickHouse y la versión comunitaria
ApsaraDB for ClickHouse corrige los errores de estabilidad de la versión comunitaria y ofrece resource queues para establecer prioridades de uso de recursos según el rol del usuario.
Versiones recomendadas para ApsaraDB for ClickHouse
ApsaraDB for ClickHouse utiliza versiones estables LTS del kernel de la comunidad de código abierto. Las nuevas versiones suelen estar disponibles después de un periodo de estabilización de tres meses. Se recomienda usar la versión 21.8 o posterior. Version Feature Comparison.
Instancias de réplica única frente a instancias maestro-réplica
Una instancia de réplica única no cuenta con un nodo de réplica por cada nodo de fragmento, por lo que no ofrece alta disponibilidad. La seguridad de sus datos depende del almacenamiento multirréplica del disco en la nube subyacente, lo que la convierte en una opción muy rentable.
Una instancia maestro-réplica incluye un nodo de réplica por cada nodo de fragmento. Si falla un nodo principal, el nodo de réplica correspondiente se encarga de la recuperación ante desastres.
Error de recursos insuficientes
Intente comprar recursos en otra zona dentro de la misma región. Las zonas de una misma región se conectan mediante VPC con una latencia insignificante.
Factores que afectan el tiempo de escalado horizontal
El escalado horizontal implica una migración de datos, por lo que el proceso tarda más en las instancias con mayor volumen de información.
Impacto del escalado
Para garantizar la consistencia de los datos durante la migración, la instancia entra en estado de solo lectura mientras se ejecuta el escalado.
Recomendaciones para el escalado horizontal
El escalado horizontal es lento. Si su clúster carece de rendimiento, dé prioridad al escalado vertical. Vertical scaling and horizontal scaling for Community Edition clusters.
Descripción de puertos
|
Protocolo |
Número de puerto |
Descripción |
|
TCP |
3306 |
Use este puerto para conectarse a ApsaraDB for ClickHouse con la herramienta clickhouse-client. Connect to ClickHouse using a command line interface. |
|
HTTP |
8123 |
Use este puerto para conectarse a ApsaraDB for ClickHouse mediante JDBC para el desarrollo de aplicaciones. Connect to ClickHouse using JDBC. |
|
HTTPS |
8443 |
Use este puerto para acceder a ApsaraDB for ClickHouse a través de HTTPS. Connect to ClickHouse using the HTTPS protocol. |
Puertos de conexión del SDK para Alibaba Cloud ClickHouse
Lenguaje | HTTP | TCP |
Java | 8123 | 3306 |
Python | ||
Go |
SDK para Go y Python
Los SDK recomendados se enumeran en Third-Party Client Libraries.
Solución del error "connect timed out"
Pruebe estas soluciones:
Compruebe la conectividad de red. Use
pingpara verificar si la red es accesible ytelnetpara comprobar que los puertos de base de datos 3306 y 8123 estén abiertos.Verifique la configuración de la lista blanca de ClickHouse. Configure a whitelist.
Confirme la dirección IP pública de su computadora cliente. En una red corporativa, esta dirección cambia con frecuencia, así que utilice un servicio de búsqueda de IP como whatsmyip.
Imposibilidad de conectar con tablas externas
En las versiones 20.3 y 20.8, el sistema valida automáticamente la conexión cuando usted crea una tabla externa. Si la tabla se crea correctamente, la conectividad de red está confirmada. Si la creación falla, las causas más comunes son:
El endpoint de destino y ClickHouse no están en la misma VPC, lo que impide la conectividad de red.
El servidor MySQL usa una lista blanca. Debe agregar ClickHouse a dicha lista.
En el caso de las tablas externas de Kafka, si la tabla se crea correctamente pero las consultas no devuelven datos, suele deberse a que la información de Kafka no se puede analizar sintácticamente según el esquema de la tabla. El mensaje de error indicará la ubicación exacta del fallo de análisis.
Solución de problemas de conexión
Causas comunes de los fallos de conexión y sus soluciones:
-
Causa: el entorno de red está mal configurado. Solo es posible conectarse por red interna si la aplicación y la instancia están en la misma VPC. Si se encuentran en VPC distintas, debe habilitar un endpoint público y conectarse por la red pública.
Solución: habilite el acceso por red pública. Apply for and release public IP addresses.
-
Causa: la dirección IP del cliente no está en la lista blanca de la instancia.
Solución: agregue la IP del cliente a la lista blanca. Configure a whitelist.
-
Causa: el security group de su instancia ECS bloquea el tráfico en el puerto necesario.
Solución: actualice las reglas del security group de ECS. Security group operation guide.
-
Causa: un firewall corporativo está bloqueando la conexión.
Solución: modifique las reglas del firewall para permitir el tráfico saliente hacia la instancia.
-
Causa: el nombre de usuario o la contraseña de la cadena de conexión contiene caracteres especiales, como !@#$%^&*()_+=. Es posible que el cliente no interprete estos caracteres correctamente, lo que provoca un fallo de conexión.
Solución: debe codificar en URL cualquier carácter especial de la cadena de conexión. Las reglas de codificación son las siguientes:
! : %21 @ : %40 # : %23 $ : %24 % : %25 ^ : %5e & : %26 * : %2a ( : %28 ) : %29 _ : %5f + : %2b = : %3dPor ejemplo, si su contraseña es ab@#c, la contraseña codificada en la cadena de conexión debe ser ab%40%23c.
-
Causa: ApsaraDB for ClickHouse aprovisiona automáticamente una instancia pay-as-you-go de Server Load Balancer (SLB) para su clúster. Si su cuenta de Alibaba Cloud tiene pagos pendientes, la instancia SLB podría suspenderse y dejar inaccesible su instancia de ApsaraDB for ClickHouse.
Solución: compruebe si su cuenta de Alibaba Cloud tiene pagos pendientes y liquide el saldo adeudado para restaurar el servicio.
Manejo de problemas de tiempo de espera en ClickHouse
ApsaraDB for ClickHouse ofrece diversos parámetros relacionados con los tiempos de espera para los protocolos HTTP y TCP.
Protocolo HTTP
El protocolo HTTP es el método más común para interactuar con ApsaraDB for ClickHouse en entornos de producción. Clientes como el controlador JDBC oficial, Alibaba Cloud DMS y DataGrip utilizan este protocolo en segundo plano. El puerto predeterminado para HTTP es 8123.
-
Cómo manejar problemas de tiempo de espera de distributed_ddl_task_timeout
-
Este parámetro especifica el tiempo de espera para ejecutar consultas DDL distribuidas (con la cláusula ON CLUSTER). Su valor predeterminado es 180 segundos. Ejecute el siguiente comando en Alibaba Cloud DMS para configurarlo como parámetro global. La nueva configuración surte efecto tras reiniciar el clúster.
set global on cluster default distributed_ddl_task_timeout = 1800;Dado que ZooKeeper gestiona y ejecuta las tareas DDL distribuidas de forma asíncrona en una cola, un tiempo de espera agotado indica que la tarea sigue en la cola de ejecución, no que haya fallado. No vuelva a enviar la tarea.
-
-
Cómo manejar problemas de tiempo de espera de max_execution_time
-
Este parámetro define el tiempo máximo de ejecución de una consulta. El valor predeterminado es 7200 segundos en la plataforma Alibaba Cloud DMS y 30 segundos en clientes como el controlador JDBC y DataGrip. Al alcanzar este límite, ClickHouse cancela automáticamente la consulta. Puede anular esta configuración a nivel de consulta. Por ejemplo:
select * from system.numbers settings max_execution_time = 3600. También puede ejecutar el siguiente comando en Alibaba Cloud DMS para establecerlo como parámetro global.set global on cluster default max_execution_time = 3600;
-
-
Cómo manejar problemas de socket_timeout
Este parámetro define el tiempo de espera para que un socket de escucha devuelva un resultado mediante el protocolo HTTP. El valor predeterminado es 7200 s en la plataforma DMS y 30 s en el controlador JDBC y DataGrip. No es un parámetro del sistema de ClickHouse, sino un parámetro JDBC para el protocolo HTTP. Sin embargo, afecta la eficacia del parámetro max_execution_time, ya que determina el límite de tiempo del lado del cliente para esperar un resultado. Por lo tanto, cuando ajuste el parámetro max_execution_time, también deberá ajustar el parámetro socket_timeout a un valor ligeramente superior a max_execution_time. Para configurar este parámetro, agregue la propiedad socket_timeout a la cadena de conexión JDBC. El valor se especifica en milisegundos. Por ejemplo: 'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'.
-
El cliente se bloquea al conectarse directamente a la dirección IP del servidor ClickHouse
-
Cuando una instancia ECS se conecta a un servidor ClickHouse a través de distintos security groups, puede producirse un fallo de conexión silencioso. Esto ocurre si la dirección IP del servidor ClickHouse no está en la lista blanca del security group de la instancia ECS que ejecuta el cliente JDBC. Si se ejecuta una consulta de larga duración, los problemas de enrutamiento pueden impedir que los paquetes de respuesta lleguen al cliente, lo que provoca que este se bloquee.
De manera similar a la resolución de problemas de conexión transitorios con una instancia SLB, habilitar send_progress_in_http_headers soluciona la mayoría de estos casos. En las raras ocasiones en que esta configuración no funcione, agregue la dirección IP del servidor ClickHouse a la lista blanca del security group de la instancia ECS donde se ejecuta el cliente.
-
Protocolo TCP
El protocolo TCP se usa principalmente para el análisis interactivo con la herramienta nativa de línea de comandos de ClickHouse. El puerto habitual para los clústeres de Community Edition es 3306. Como el protocolo TCP incluye paquetes keep-alive, no presenta tiempos de espera a nivel de socket. Solo necesita gestionar los parámetros distributed_ddl_task_timeout y max_execution_time. Puede configurarlos con el mismo método que se usa para el protocolo HTTP.
Solución del error "Connection refused (localhost:9000)"
Problema: después de crear un diccionario en una instancia de Alibaba Cloud ClickHouse, la ejecución de una consulta devuelve el siguiente error : "Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR) (version 23.8.16.1)".
Causa: Alibaba Cloud ClickHouse utiliza asignación de puertos. El puerto que muestra la consola (por ejemplo, 9000) es el del load balancer, no el puerto real del nodo. Para acceder a la instancia con localhost, use el puerto real del nodo en lugar del puerto del load balancer.
-
Solución: acceda al puerto real del nodo. Por ejemplo, change
localhost:9000tolocalhost:3003. La siguiente tabla muestra las asignaciones de puertos habituales para Community Edition.Puerto del load balancer
Puerto real del nodo
3306
3003
9000
3003
8123
3002
9004
3005
8443
3006
Puerto de Prometheus inaccesible en ApsaraDB for ClickHouse
Problema: Configuró los parámetros de Prometheus para su clúster de ApsaraDB for ClickHouse, pero no puede acceder al puerto de Prometheus especificado. Por ejemplo, el comando
telnet cc-xxxx.clickhouse.ads.aliyuncs.com:port-numberfalla.Causa: La dirección de conexión que proporciona la consola apunta a un load balancer, mientras que el servicio de Prometheus se ejecuta en los nodos subyacentes de ApsaraDB for ClickHouse. El load balancer no está configurado para reenviar el tráfico de puertos personalizados a estos nodos.
-
Solución: Conéctese directamente a las direcciones IP de los nodos subyacentes para acceder a Prometheus. Ejecute el siguiente comando para obtener las direcciones IP de dichos nodos. Después, utilice una de las direcciones obtenidas para conectarse al puerto de Prometheus.
SELECT * FROM system.clusters;
Errores OOM durante la importación de datos desde OSS
Causa común: uso elevado de memoria.
Para resolver este problema, aplique una de las siguientes opciones:
Divida los archivos grandes de OSS en archivos más pequeños antes de importarlos.
Escale verticalmente el clúster para aumentar su memoria. Vertical and horizontal scaling for Community Edition clusters.
Cómo resolver el error "too many parts"
ClickHouse genera una parte de datos por cada operación de escritura. Si escribe una sola fila o volúmenes pequeños de datos cada vez, se crea una cantidad excesiva de partes de datos, lo cual sobrecarga las operaciones de fusión y las consultas. El error "too many parts" ocurre porque ClickHouse aplica límites internos para evitar esta situación. Si se presenta este error, aumente el tamaño del lote de escritura. Si no es posible ajustar dicho tamaño, incremente el valor del parámetro merge_tree.parts_to_throw_insert en la consola.
¿Por qué las importaciones con DataX son lentas?
Causas comunes y soluciones:
-
Causa 1: configuración de parámetros poco óptima. ClickHouse ofrece el mejor rendimiento con un tamaño de
batchgrande y un número reducido deconcurrent operations. Un solobatchsuele contener decenas o incluso cientos de miles de filas, según el tamaño promedio de cada fila. Como regla general, calcule unos 100 bytes por fila, aunque debe ajustar este valor según las características reales de sus datos.Solución: Establezca el número de
concurrent operationsen 10 o menos. Pruebe distintos valores de parámetros hasta encontrar la configuración óptima para su carga de trabajo. -
Causa 2: recursos insuficientes en el
exclusive resource groupde DataWorks. Es posible que las instancias deECSdelexclusive resource grouptengan un tamaño inferior al necesario. La falta de CPU o memoria limita la cantidad deconcurrent operationsy elnetwork egress bandwidthdisponible. Asimismo, configurar un tamaño debatchgrande en una máquina con poca memoria provoca recolecciones de basura (GC) de Java frecuentes en el proceso de DataWorks, lo que reduce el rendimiento.Solución: Revise los registros de salida de DataWorks para comprobar las especificaciones de la instancia de
ECS. -
Causa 3: el cuello de botella se encuentra en el
data source.Solución: En los registros de salida de DataWorks, busque las métricas
totalWaitReaderTimeytotalWaitWriterTime. SitotalWaitReaderTimees significativamente mayor quetotalWaitWriterTime, el cuello de botella está en la lectura (eldata source) y no en la escritura. -
Causa 4: uso de un
public network endpoint. Unpublic network endpointtiene un ancho de banda limitado y no es adecuado para operaciones de importación o exportación de datos de alto rendimiento.Solución: Cambie a un endpoint de
VPC network. -
Causa 5: presencia de
dirty data. Normalmente, los datos se escriben en unbatch. Sin embargo, si se detectandirty data, la escritura delbatchactual falla. Entonces, DataX recurre a un modo de inserción fila por fila. Este mecanismo alternativo genera una cantidad excesiva dedata partsy reduce drásticamente el rendimiento de escritura.Utilice los dos métodos siguientes para detectar
dirty data.-
Busque mensajes de error. Si el registro contiene un error
Cannot parse, significa que haydirty data.Ejecute la siguiente consulta SQL para localizar excepciones.
SELECT written_rows, written_bytes, query_duration_ms, event_time, exception FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' and exception_code != 0 ORDER BY event_time DESC LIMIT 30; -
Supervise el número de filas del
batch. Si la cantidad de filas porbatchcae a 1, es muy probable que DataX haya encontradodirty datay haya cambiado al modo fila por fila.Ejecute la siguiente consulta SQL para comprobar el número de filas.
SELECT written_rows, written_bytes, query_duration_ms, event_time FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' ORDER BY event_time DESC LIMIT 30;
Solución: Identifique y corrija o elimine los
dirty datadeldata source. -
Discrepancia en el número de filas tras importar desde Hive
Realice las siguientes comprobaciones:
Revise la tabla del sistema
query_logpara detectar errores durante la importación. Si existen errores, es probable que se hayan perdido datos.Compruebe si el motor de la tabla admite deduplicación. Por ejemplo, si utiliza el motor de tabla
ReplacingMergeTree, el número de filas en ClickHouse puede ser menor que en Hive porque este motor elimina duplicados.Verifique la exactitud del número de filas en el origen de Hive, ya que el conteo inicial podría ser incorrecto.
Discrepancia en el número de filas entre ClickHouse y Kafka
Compruebe lo siguiente:
Revise la tabla del sistema
query_logpara detectar errores ocurridos durante la importación. Si hay errores, es posible que se hayan perdido datos.Compruebe si el motor de la tabla realiza deduplicación de datos. Por ejemplo, el motor
ReplacingMergeTreeelimina entradas duplicadas, lo que reduce el número de filas en ClickHouse respecto a Kafka.Verifique si el parámetro
kafka_skip_broken_messagesestá habilitado en la configuración de la tabla externa de Kafka. Si está habilitado, ClickHouse omite los mensajes que no se pueden analizar sintácticamente, lo que disminuye el número de filas en ClickHouse frente a Kafka.
Importación de datos con Spark y Flink
Importar datos desde un clúster de ClickHouse existente
Utilice uno de estos métodos:
Exporte los archivos mediante ClickHouse Client. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
-
Utilice la función remote.
INSERT INTO <destination_table> SELECT * FROM remote('<connection_string>', '<database>', '<table>', '<username>', '<password>');
Error de sincronización de MaterializeMySQL: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires
Este error indica que el motor MaterializeMySQL dejó de sincronizarse durante un periodo prolongado, lo que provocó que el registro binario de MySQL caducara y se purgara.
Para resolver este problema, elimine la base de datos afectada y vuelva a crearla en ApsaraDB for ClickHouse.
¿Por qué las tablas dejan de sincronizarse y el campo sync_failed_tables de la tabla del sistema system.materialize_mysql no está vacío al usar el motor MaterializeMySQL para sincronizar datos de MySQL?
Causa común: durante la sincronización se ejecutó una instrucción de lenguaje de definición de datos (DDL) de MySQL que ApsaraDB for ClickHouse no admite.
Solución: Siga estos pasos para volver a sincronizar los datos de MySQL.
-
Elimine la tabla que dejó de sincronizarse.
DROP TABLE <table_name> ON cluster default;NotaEn este comando,
table_namees el nombre de la tabla que dejó de sincronizarse. Si se trata de una tabla distribuida, debe eliminar tanto la tabla distribuida como su tabla local. -
Reinicie el proceso de sincronización.
ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;NotaEn este comando,
<database_name>es el nombre de la base de datos sincronizada en ApsaraDB for ClickHouse.
Resolución del error "Too many partitions for single INSERT block (more than 100)"
Este error ocurre cuando una sola operación INSERT intenta escribir en más particiones de las que permite el parámetro max_partitions_per_insert_block, cuyo valor predeterminado es 100. En ClickHouse, cada operación de escritura crea una parte de datos, y una partición puede contener una o varias de estas partes. Si una instrucción INSERT escribe datos en demasiadas particiones distintas a la vez, genera un exceso de partes de datos que puede saturar las operaciones de fusión y consulta. Para evitar la degradación del rendimiento, ClickHouse aplica este límite.
Para resolver este problema, ajuste la estrategia de particionamiento o modifique el parámetro max_partitions_per_insert_block.
Ajuste el esquema de la tabla, modifique el método de particionamiento o asegúrese de que una sola operación de inserción no supere el límite de particiones.
-
Si su caso de uso requiere escribir en muchas particiones a la vez, aumente el límite de
max_partitions_per_insert_blocksegún el volumen de datos. Utilice la siguiente sintaxis para modificar el parámetro:Instancia de nodo único
SET GLOBAL max_partitions_per_insert_block = XXX;Instancia de varios nodos
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;NotaLa comunidad de ClickHouse recomienda el valor predeterminado de 100. Establecer un valor demasiado alto puede degradar el rendimiento. Una vez finalizada la importación masiva de datos, restaure el valor predeterminado del parámetro.
Error de límite de memoria excedido en insert into select
-
Causa: uso elevado de memoria.
Solución: Ajuste el parámetro
max_insert_threadspara reducir el consumo de memoria. -
Causa: uso de una instrucción
insert into selectpara importar datos entre clústeres de ClickHouse.Solución: Migre los datos importándolos desde archivos. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
Consulta del uso de CPU y memoria
La tabla del sistema system.query_log proporciona estadísticas de uso de CPU y memoria para cada consulta.
Solución de errores de límite de memoria
El servidor de ClickHouse supervisa el uso de memoria en varios niveles. Para una consulta individual, un rastreador de memoria agrega el consumo de todos sus hilos de consulta y luego informa a un rastreador de memoria global. La solución depende del error específico que encuentre.
Un error con
Memory limit (for query)significa que la consulta falló porque consumió demasiada memoria y superó su límite del 70 % de la capacidad total de memoria de la instancia. Para resolverlo, realice una actualización vertical que aumente la capacidad de memoria de la instancia.Un error con
Memory limit (for total)indica que el uso general de memoria en la instancia superó el límite global del 90 % de la capacidad total de memoria de la instancia. Este error puede deberse a una alta concurrencia de consultas o a tareas asíncronas en segundo plano que consumen muchos recursos, como las fusiones de claves primarias que se ejecutan después de escribir datos. Primero, intente reducir la concurrencia de consultas. Si el error persiste, realice una actualización vertical para aumentar la capacidad de memoria de la instancia.
Error de consulta SQL memory limit en Enterprise Edition
Causa: Cada nodo de un clúster de Alibaba Cloud ApsaraDB for ClickHouse Enterprise Edition cuenta con 32 unidades de cómputo de ClickHouse (CCU) y 128 GB de memoria. El sistema operativo consume parte de esta memoria, por lo que quedan aproximadamente 115 GB disponibles para ejecutar consultas. De forma predeterminada, una consulta SQL se ejecuta en un solo nodo. Se produce un error de memory limit si una consulta utiliza más de 115 GB de memoria.
El límite máximo de CCU de un clúster determina su cantidad de nodos. Si el límite máximo de CCU supera 64, el número de nodos de un clúster de Enterprise Edition es: Maximum CCU limit / 32. Si el límite máximo de CCU es 64 o menor, el clúster de Enterprise Edition tiene dos nodos.
Solución: Agregue la siguiente cláusula SETTINGS a su instrucción SQL para habilitar la ejecución paralela en varios nodos. Esta técnica distribuye la carga de memoria y puede evitar el error de memory limit.
SETTINGS
allow_experimental_analyzer = 1,
allow_experimental_parallel_reading_from_replicas = 1;
Consumo excesivo de memoria en GROUP BY
Establezca el parámetro max_bytes_before_external_group_by para limitar el consumo de memoria en las operaciones GROUP BY. Tenga en cuenta que la configuración allow_experimental_analyzer determina si este parámetro surte efecto.
Manejo de errores de límite de concurrencia excedido
La concurrencia máxima predeterminada de consultas para un servidor es 100. Modifique este valor en la consola:
Inicie sesión en la consola de ApsaraDB for ClickHouse.
En la página Clusters, seleccione Clusters of Community-compatible Edition y haga clic en el ID del clúster de destino.
En el panel de navegación izquierdo, haga clic en Parameter Configuration.
En la página Parameter Configuration, haga clic en el icono de edición de la columna Parameter Value correspondiente al parámetro
max_concurrent_queries.Introduzca el nuevo valor en el cuadro de diálogo y haga clic en OK.
Haga clic en Submit Parameters.
Haga clic en OK.
Resultados de consulta inconsistentes cuando se detuvieron las escrituras de datos
Descripción del problema: Al consultar datos con select count(*), solo se devuelve aproximadamente la mitad de los datos totales o los resultados fluctúan.
Considere las siguientes soluciones:
Compruebe si utiliza un clúster de varios nodos. En este tipo de clúster, debe crear una tabla distribuida. Escriba y consulte esta tabla para obtener resultados consistentes; de lo contrario, cada consulta podría dirigirse a un fragmento distinto. Create a distributed table.
Compruebe si utiliza un clúster maestro-réplica. En este tipo de clúster, use tablas con un motor de la serie Replicated para sincronizar los datos entre réplicas. De lo contrario, cada consulta podría dirigirse a una réplica distinta y generar resultados inconsistentes. Table engines.
Tablas invisibles y resultados de consulta fluctuantes
Causas comunes y soluciones:
-
Causa 1: el proceso de creación de la tabla es incorrecto. Un clúster distribuido de ClickHouse no cuenta con semántica DDL distribuida nativa. Si ejecuta una instrucción
create tableen un clúster de ClickHouse autogestionado, es posible que devuelva un mensaje de éxito, pero la tabla solo se creará en el servidor actualmente conectado. Al conectarse a otro servidor, la tabla no será visible.Solución:
-
Cuando cree una tabla, utilice la instrucción
create table <table_name> on cluster default. La cláusulaon cluster defaulttransmite la instrucción a todos los nodos del clúster default.CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple(); -
Cree otra tabla que utilice el motor de tabla distribuida sobre la tabla test.
CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
-
-
Causa 2: la tabla ReplicatedMergeTree está mal configurada. El motor de tabla ReplicatedMergeTree es una versión mejorada del motor MergeTree que proporciona sincronización maestro-réplica. En una instancia de réplica única, solo puede crear tablas con el motor
MergeTree. En una instancia maestro-réplica, debe crear tablas con el motor ReplicatedMergeTree.Solución: Cuando cree una tabla en una instancia maestro-réplica, utilice
ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')oReplicatedMergeTree()para configurar el motor de tabla ReplicatedMergeTree. Los argumentos deReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')forman parte de una plantilla fija y no deben modificarse.
Discrepancias en los datos de marca de tiempo
Ejecute SELECT timezone() para comprobar si la zona horaria corresponde a la zona horaria local. Si no es así, establezca el elemento de configuración 'timezone' en la zona horaria local. Consulte Modify running parameter values for configuration items para ver las instrucciones.
Tabla no encontrada después de crearla
Este problema suele ocurrir cuando una instrucción DDL se ejecuta en un solo nodo.
Para resolverlo, asegúrese de que la instrucción DDL incluya la cláusula on cluster. Table creation syntax.
No hay datos nuevos en las tablas externas de Kafka
Primero, ejecute una consulta select * from en la tabla externa de Kafka. Si la consulta falla, revise el mensaje de error. Esto suele deberse a un fallo al analizar sintácticamente los datos. Si la consulta devuelve resultados, compruebe que los campos de la tabla de destino (la tabla de almacenamiento subyacente de la tabla externa de Kafka) coincidan con los de la tabla externa de Kafka. Si la escritura de datos falla, los campos no coinciden. Por ejemplo:
insert into <destination table> as select * from <Kafka external table>;
Desajuste de hora y zona horaria del cliente
Este problema ocurre cuando la configuración use_client_time_zone tiene una zona horaria incorrecta.
¿Los datos no son visibles después de una operación de escritura?
Síntoma: Tras escribir datos en una tabla, las consultas posteriores no los encuentran.
Causa: Las posibles causas incluyen las siguientes:
Los esquemas de la tabla distribuida y de las tablas locales son inconsistentes.
Después de escribir datos en una tabla distribuida, la distribución de archivos temporales quedó incompleta.
Tras escribir datos en una réplica de un clúster maestro-réplica, la sincronización de réplicas quedó incompleta.
Análisis y soluciones:
Esquemas inconsistentes
Consulte la tabla del sistema system.distribution_queue para comprobar si hubo errores durante las escrituras en la tabla distribuida.
Distribución de archivos incompleta
Análisis de la causa: En un clúster de varios nodos de ApsaraDB for ClickHouse, si su aplicación se conecta a la base de datos mediante un nombre de dominio y ejecuta una instrucción INSERT en una tabla distribuida, un Server Load Balancer (SLB) frontal enruta la solicitud a un nodo aleatorio del clúster. El nodo que recibe la solicitud escribe parte de los datos en su disco local y almacena el resto como archivos temporales. Luego, estos archivos se distribuyen de forma asíncrona a los demás nodos. Si se ejecuta una consulta antes de que termine este proceso de distribución, es posible que no devuelva los datos aún no distribuidos.
Solución: Si su aplicación requiere una coherencia estricta de lectura tras escritura, agregue la cláusula settings insert_distributed_sync = 1 a su instrucción INSERT. Esta configuración cambia la operación INSERT al modo síncrono. La instrucción solo devuelve un mensaje de éxito después de distribuir los datos a todos los nodos.
Habilitar esta configuración aumenta el tiempo de ejecución de las instrucciones INSERT, ya que la operación debe esperar a que termine la distribución de datos. Evalúe el equilibrio entre la coherencia de los datos y el rendimiento de escritura según las necesidades de su aplicación.
Esta configuración se aplica a nivel de clúster y debe usarse con precaución. Primero, pruébela en una sola consulta. Después de verificar los resultados, aplíquela a todo el clúster únicamente si su negocio lo requiere.
-
Para aplicar esta configuración a una sola consulta, agréguela al final de la instrucción. Por ejemplo:
INSERT INTO <table_name> values() settings insert_distributed_sync = 1; Para aplicar esta configuración a nivel de clúster, defínala en el archivo user.xml. Configure user.xml parameters.
Sincronización de réplicas incompleta
Análisis de la causa: En un clúster maestro-réplica de ApsaraDB for ClickHouse, cuando ejecuta una instrucción INSERT, el clúster realiza la operación en una réplica elegida al azar. Después, los datos se sincronizan de forma asíncrona con la otra réplica. Si una consulta SELECT posterior se enruta a la réplica que aún no terminó de sincronizarse, es posible que no devuelva los datos esperados.
Solución: Si su aplicación requiere una coherencia estricta de lectura tras escritura, agregue la cláusula settings insert_quorum = 2 a su instrucción INSERT. Esta configuración obliga a que la sincronización de réplicas se ejecute en modo síncrono. La instrucción INSERT solo devuelve un mensaje de éxito después de completar la sincronización de datos en ambas réplicas.
Tenga en cuenta lo siguiente al utilizar este parámetro:
Esta configuración aumenta el tiempo de ejecución de las instrucciones INSERT, ya que la operación debe esperar a que termine la sincronización de réplicas. Evalúe el equilibrio entre la coherencia de los datos y el rendimiento de escritura según las necesidades de su aplicación.
Una vez establecido este parámetro, las operaciones
INSERTdeben esperar a que la sincronización entre réplicas sea exitosa. Esto significa que, si una réplica no está disponible, todas las operaciones de escritura configuradas coninsert_quorum = 2fallarán, lo cual entra en conflicto con la garantía de confiabilidad de una configuración de doble réplica.Esta configuración se aplica a nivel de clúster y debe usarse con precaución. Primero, pruébela en una sola consulta. Después de verificar los resultados, aplíquela a todo el clúster únicamente si su negocio lo requiere.
-
Para aplicar esta configuración a una sola consulta, agréguela al final de la instrucción. Por ejemplo:
INSERT INTO <table_name> values() settings insert_quorum = 2; Para aplicar esta configuración a nivel de clúster, defínala en el archivo user.xml. Configure user.xml parameters.
Por qué el TTL no elimina los datos caducados
Síntoma
Se configuró correctamente un TTL para una tabla, pero los datos caducados no se eliminan automáticamente. Esto significa que la configuración del TTL no está surtiendo efecto.
Pasos para la solución de problemas
-
Compruebe si la configuración del TTL de la tabla es adecuada.
Establezca el TTL según sus requisitos de negocio. Se recomienda configurar el TTL a nivel de días y evitar configuraciones a nivel de segundos o minutos, como
TTL event_time + INTERVAL 30 SECOND. -
Revise el parámetro
materialize_ttl_after_modify.Este parámetro controls whether a new TTL rule applies to existing data after you run an
ALTER MODIFY TTLstatement. The default value is 1 (enabled). A value of 0 means the rule applies only to new data, and existing data is not affected by the TTL.-
Consulte la configuración del parámetro
SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify'; -
Modifique la configuración del parámetro
ImportanteEste comando analiza todos los datos existentes y puede generar una carga alta de recursos. Úselo con precaución.
ALTER TABLE $table_name MATERIALIZE TTL;
-
-
Diagnostique la estrategia de limpieza de particiones.
Cuando el parámetro
ttl_only_drop_partsis set to1, ClickHouse deletes a data part only when all rows within that part have expired.-
Consulte la configuración del parámetro
ttl_only_drop_partsSELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop'; -
Check the partition expiration status
SELECT partition, name, active, bytes_on_disk, modification_time, min_time, max_time, delete_ttl_info_min, delete_ttl_info_max FROM system.parts c WHERE database = 'your_dbname' AND TABLE = 'your_tablename' LIMIT 100;delete_ttl_info_min: The minimum datetime key value used for the TTL DELETE rule in this part.
delete_ttl_info_max: The maximum datetime key value used for the TTL DELETE rule in this part.
-
If the partition and TTL rules do not align, some data might not be cleaned up promptly. The following explains how partition and TTL rules interact.
Si las reglas de partición y de TTL están alineadas (por ejemplo, particionar por día y establecer un TTL diario), ClickHouse determina la caducidad con base en el ID de la partición y elimina toda la partición de una sola vez. Esta es la estrategia más eficiente. For optimal performance, we recommend combining a partitioning strategy (such as by day) with
ttl_only_drop_parts=1to efficiently delete expired data.Si las reglas no están alineadas y
ttl_only_drop_parts = 1, ClickHouse comprueba la información del TTL de cada parte. A part is deleted only after all its data has exceeded thedelete_ttl_info_maxtimestamp.Si las reglas no están alineadas y
ttl_only_drop_parts = 0, ClickHouse debe analizar los datos dentro de cada parte para encontrar y eliminar filas caducadas individuales. Esta es la estrategia que consume más recursos.
-
-
Control the merge trigger frequency.
Expired data is deleted asynchronously during merges, not in real time. You can control the merge frequency with the
merge_with_ttl_timeoutparameter or force TTL materialization byusing the ALTER TABLE ... MATERIALIZE TTLstatement.-
Check the parameter
SELECT * FROM system.merge_tree_settings WHERE name = 'merge_with_ttl_timeout';NotaThe unit is seconds. The default value for an online instance is 7200 seconds (2 hours).
-
Modify the parameter
If
merge_with_ttl_timeoutis set too high, the TTL merge trigger frequency decreases, delaying the cleanup of expired data. You can lower this parameter to increase the cleanup frequency. For details, seeDescripción del parámetro.
-
Check the parameter
-
Revise la configuración de los parámetros del pool de hilos.
La eliminación de datos por TTL ocurre durante la fase de fusión de partes y está limitada por los parámetros
max_number_of_merges_with_ttl_in_pool(predeterminado: 2 para instancias en línea) ybackground_pool_size(predeterminado: 16 para instancias en línea).-
Consulte la actividad actual de los hilos en segundo plano
SELECT * FROM system.metrics WHERE metric LIKE 'Background%';La métrica
BackgroundPoolTaskindica el número de tareas activas actualmente en el pool en segundo plano. -
Modifique los parámetros
Si el resto de sus parámetros son correctos y la utilización de CPU es baja, considere aumentar el parámetro
max_number_of_merges_with_ttl_in_poolsegún sus necesidades de negocio; por ejemplo, de 2 a 4, o de 4 a 8. Si esto no resuelve el problema, considere aumentar el parámetrobackground_pool_size.ImportanteDebe reiniciar el clúster si ajusta el parámetro
max_number_of_merges_with_ttl_in_pool. No es necesario reiniciar el clúster cuando aumenta el parámetrobackground_pool_size, pero sí debe reiniciarlo cuando disminuye el parámetrobackground_pool_size.
-
-
Compruebe si el esquema de la tabla y el diseño de particiones son adecuados.
If a table is not partitioned effectively or if the partition granularity is too coarse, TTL cleanup efficiency decreases. For efficient cleanup, we recommend matching the partition granularity with the TTL granularity (for example, setting both to a daily interval). For details, seeMejores prácticas.
-
Compruebe si el clúster tiene suficiente espacio en disco.
Las operaciones de fusión en segundo plano activan la limpieza por TTL y requieren espacio disponible en disco. Las partes de datos grandes o la falta de espacio en disco (por ejemplo, un uso superior al 90 %) pueden impedir las operaciones de fusión y las eliminaciones posteriores por TTL.
-
Revise otros parámetros del sistema en
system.merge_tree_settings.merge_with_recompression_ttl_timeout: El retraso mínimo antes de que se repita una fusión con un TTL de recompresión. De forma predeterminada, esto significa que las reglas de TTL se aplican a una tabla como mínimo cada 4 horas. Si necesita aplicar las reglas de TTL con mayor frecuencia, reduzca este valor .max_number_of_merges_with_ttl_in_pool: This parameter controls the maximum number of threads available for TTL tasks. If the number of ongoing merge tasks with TTL in the background thread pool exceeds this value, ClickHouse does not schedule new merge tasks with TTL.
Tareas optimize lentas
Una tarea optimize consume mucha CPU y disco. Compite por recursos con las consultas simultáneas, por lo que su ejecución puede ser lenta bajo cargas elevadas.
Error de fusión de clave primaria después de optimize
Para que una operación primary key merge funcione correctamente, debe cumplir los siguientes dos requisitos previos.
La clave
ORDER BYdebe incluir lapartition keyde lastorage table. Una operaciónprimary key mergeno se ejecuta entre distintas particiones.En una
distributed table, la claveORDER BYdebe incluir la clave de fragmentación, determinada por elhash algorithm. Una operaciónprimary key mergeno se ejecuta entre distintos nodos.
A continuación se describen los comandos optimize comunes y su comportamiento.
Comando | Descripción |
| Este comando intenta seleccionar y fusionar |
| Este comando se dirige a una Nota En las tablas sin |
| Este comando fuerza la fusión de todas las particiones de la tabla. Vuelve a fusionar las particiones incluso si ya constan de un solo |
Para cualquiera de estos comandos optimize, puede configurar el parámetro optimize_throw_if_noop. Si este parámetro está habilitado, el comando genera una excepción cuando no realiza ninguna fusión, lo que le permite determinar si la tarea realmente se ejecutó.
El TTL de datos no funciona después de optimize
A continuación se muestran las causas comunes y sus soluciones.
-
Causa 1: La expulsión de datos por TTL ocurre durante la fase de fusión de clave primaria. Si una parte de datos no se fusiona durante un periodo prolongado, el sistema no puede expulsar los datos caducados que contiene.
Solución:
Puede activar manualmente una tarea de fusión al ejecutar
optimize finalooptimize a specific partition.Al crear una tabla, configure parámetros como merge_with_ttl_timeout y ttl_only_drop_parts para fusionar con mayor frecuencia las partes de datos que contienen información caducada.
-
Causa 2: Si se modifica o agrega el TTL de una tabla, es posible que las partes de datos existentes tengan información de TTL faltante o incorrecta. Esto también puede impedir la expulsión de datos caducados.
Solución:
Puede regenerar la información del TTL al ejecutar
alter table materialize ttl.Puede actualizar la información del TTL al ejecutar
optimize partition.
Las actualizaciones y eliminaciones no surten efecto después de OPTIMIZE
ApsaraDB for ClickHouse ejecuta las operaciones de actualización y eliminación de forma asíncrona. Supervise el progreso mediante consultas a la tabla del sistema system.mutations.
Agregar, eliminar o modificar columnas con DDL
Para modificar una tabla local, ejecute una instrucción DDL. En una tabla distribuida, el procedimiento depende de si se están escribiendo datos en ella en ese momento.
Si no se están escribiendo datos en la tabla, modifique primero la tabla local y después la tabla distribuida.
-
Si se están escribiendo datos en la tabla, el procedimiento depende del tipo de modificación.
Tipo
Acciones
Agregar una columna nullable
Modifique la tabla local.
Modifique la tabla distribuida.
Modificar el tipo de datos de una columna (a un tipo convertible)
Eliminar una columna nullable
Modifique la tabla distribuida.
Modifique la tabla local.
Agregar una columna no nullable
Detenga la escritura de datos.
Ejecute
SYSTEM FLUSH DISTRIBUTEDen la tabla distribuida.Modifique la tabla local.
Modifique la tabla distribuida.
Reanude la escritura de datos.
Eliminar una columna no nullable
Cambiar el nombre de una columna
Operaciones DDL lentas o bloqueadas
La ejecución global de DDL es secuencial, y las consultas complejas pueden provocar interbloqueos.
Pruebe estas soluciones:
Espere a que finalice la operación.
Intente finalizar la consulta desde la consola.
Error de tiempo de espera agotado en tareas DDL distribuidas
Modifique el tiempo de espera predeterminado al ejecutar set global on cluster default distributed_ddl_task_timeout=xxx, donde xxx es el tiempo de espera en segundos. Modify cluster parameters.
Error de sintaxis: "set global on cluster default"
-
Causa 1: El cliente de ClickHouse analiza la sintaxis. Sin embargo,
set global on cluster defaultes una sintaxis del lado del servidor. Si la versión del cliente no es compatible con el servidor, el cliente bloquea esta instrucción.Solución:
Use una herramienta que no analice la sintaxis del lado del cliente. Algunos ejemplos son las herramientas basadas en JDBC, como DataGrip y DBeaver.
Desarrolle un programa JDBC para ejecutar la instrucción.
-
Causa 2: En la instrucción
set global on cluster default key = value;, elvaluees una cadena, pero no está entre comillas.Solución: Escriba el valor de cadena entre comillas.
Herramienta de BI recomendada
Se recomienda Quick BI.
IDE recomendados para consultar datos
DataGrip y DBeaver.
Compatibilidad con búsqueda vectorial
Sí. ApsaraDB for ClickHouse admite la búsqueda vectorial. Recursos relacionados:
Solución del error ON CLUSTER is not allowed for Replicated database
Si su clúster es de Enterprise Edition y la instrucción de creación de tabla incluye ON CLUSTER default, es posible que encuentre el error ON CLUSTER is not allowed for Replicated database. Esto ocurre en algunas versiones menores. Actualice su instancia a la versión más reciente. Upgrade minor engine versions.
Solución del error Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny')
Problema: Si usa un clúster de Community Edition con varios nodos, podría encontrar el error Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). cuando una consulta utiliza JOIN o IN para unir varias tablas distribuidas.
Causa: Cuando una consulta une varias tablas distribuidas, puede producirse una amplificación de consultas. Por ejemplo, en un clúster de tres nodos, una consulta de unión entre dos tablas distribuidas se expande en 3 x 3 subconsultas sobre las tablas locales subyacentes. Esto consume muchos recursos y aumenta la latencia. Para evitarlo, el sistema bloquea estas consultas de forma predeterminada.
Funcionamiento: Al reemplazar el operador IN o JOIN por GLOBAL IN o GLOBAL JOIN, se indica al motor que ejecute la subconsulta del lado derecho en un solo nodo. El resultado se almacena en una tabla temporal, que luego se transmite a todos los demás nodos para completar la unión de forma local.
Impacto de usar GLOBAL IN o GLOBAL JOIN:
La tabla temporal se envía a todos los servidores remotos. Evite esta estrategia con conjuntos de datos grandes.
-
Usar
GLOBAL INoGLOBAL JOINcon la funciónremote()puede generar resultados incorrectos. Esto sucede porque la subconsulta, que debería ejecutarse en la instancia externa, se ejecuta en la instancia actual.Por ejemplo, ejecute la siguiente instrucción en
instance_apara consultar datos de la instancia externacc-bp1wc089c****.SELECT * FROM remote('cc-bp1wc089c****.clickhouse.ads.aliyuncs.com:3306', `default`, test_tbl_distributed1, '<your_Account>', '<YOUR_PASSWORD>') WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);En este caso,
instance_aejecuta la subconsultaSELECT id FROM test_tbl_distributed1para generar una tabla temporal; llamémoslatemp_table_A. Luego, los datos detemp_table_Ase envían a la instancia externacc-bp1wc089c****para la consulta final. La instancia externacc-bp1wc089c****termina ejecutando la instrucciónSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temp_table_A);.El problema surge del origen de los datos de la tabla temporal.
Según la descripción anterior, la instrucción final que ejecuta la instancia
cc-bp1wc089c****esSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temporary table A);. Sin embargo, el conjunto de condiciones definido en la tabla temporal A se generó en la instancia a. En este ejemplo, la instanciacc-bp1wc089c****debió ejecutarSELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 );, y el conjunto de condiciones debió originarse en la instanciacc-bp1wc089c****. Por lo tanto, el uso de GLOBAL IN o GLOBAL JOIN hace que la subconsulta obtenga el conjunto de condiciones de un origen incorrecto, lo que produce un resultado erróneo.
Soluciones:
Solución 1: Modifique el código SQL de su aplicación para reemplazar manualmente IN o JOIN por GLOBAL IN o GLOBAL JOIN.
Por ejemplo, cambie esta instrucción:
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
por:
SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);
Solución 2: Modifique el parámetro del sistema distributed_product_mode o prefer_global_in_and_join para que el sistema convierta automáticamente IN o JOIN en GLOBAL IN o GLOBAL JOIN.
distributed_product_mode
Ejecute la siguiente instrucción para establecer distributed_product_mode en global. Esta configuración convierte automáticamente las operaciones estándar IN o JOIN en GLOBAL IN o GLOBAL JOIN cuando sea necesario.
SET GLOBAL ON cluster default distributed_product_mode='global';
Uso
Propósito: Controla cómo ClickHouse gestiona las subconsultas distribuidas.
-
Valores:
deny(predeterminado): Prohíbe las subconsultas distribuidasINyJOIN, y genera la excepción"Double-distributed IN/JOIN subqueries is denied".local: Reescribe la subconsulta para usar la tabla local en el fragmento de destino, y conserva un operador estándarINoJOIN.global: Convierte las consultasINoJOINen consultasGLOBAL INoGLOBAL JOIN.allow: Permite las subconsultas estándarINyJOIN, lo que puede causar amplificación de consultas.
Escenarios aplicables: Solo aplica a consultas que usan
INoJOINpara unir varias tablas distribuidas.
prefer_global_in_and_join
prefer_global_in_and_join
Ejecute la siguiente instrucción para establecer el parámetro prefer_global_in_and_join en 1. Esta configuración convierte automáticamente las operaciones estándar IN o JOIN en GLOBAL IN o GLOBAL JOIN.
SET GLOBAL ON cluster default prefer_global_in_and_join = 1;
Uso
Propósito: Controla el comportamiento de los operadores
INyJOIN.-
Valores:
0(predeterminado): Prohíbe las subconsultas distribuidasINyJOIN, y genera la excepción"Double-distributed IN/JOIN subqueries is denied".1: Habilita las subconsultas distribuidasINyJOINal convertirlas automáticamente en consultasGLOBAL INoGLOBAL JOIN.
Escenarios aplicables: Solo aplica a consultas que usan
INoJOINpara unir varias tablas distribuidas.
Consultar el espacio en disco de las tablas
Para consultar el espacio en disco que usa cada tabla, ejecute la siguiente consulta.
SELECT table, formatReadableSize(sum(bytes)) as size, min(min_date) as min_date, max(max_date) as max_date FROM system.parts WHERE active GROUP BY table;
Consultar el tamaño de los datos fríos
A continuación se muestra un ejemplo de consulta:
SELECT * FROM system.disks;
Consultar datos en almacenamiento frío
Use la siguiente consulta:
SELECT * FROM system.parts WHERE disk_name = 'cold_disk';
Mover datos de particiones al almacenamiento frío
Para mover una partición de datos al almacenamiento frío, ejecute la siguiente instrucción:
ALTER TABLE table_name MOVE PARTITION partition_expr TO DISK 'cold_disk';
Vacíos en los datos de monitoreo
Entre las causas comunes se incluyen:
Una consulta que activa un error OOM.
Un reinicio de instancia provocado por un cambio de configuración.
Un reinicio de instancia posterior a una actualización o reducción de versión.
Actualización sin interrupciones y sin migración de datos
La compatibilidad de un clúster de ClickHouse con la actualización sin interrupciones depende de su fecha de creación. Los clústeres adquiridos después del 1 de diciembre de 2021 admiten una actualización en el lugar sin necesidad de migrar datos. Los clústeres adquiridos antes de esa fecha requieren migración de datos. Upgrade the major engine version.
Tablas del sistema comunes
A continuación se describen las tablas del sistema más comunes y sus funciones.
|
Parámetro |
Descripción |
|
system.processes |
Contiene información sobre las sentencias SQL que se están ejecutando actualmente. |
|
system.query_log |
Contiene un registro de las sentencias SQL ejecutadas. |
|
system.merges |
Contiene información sobre las operaciones de fusión del clúster. |
|
system.mutations |
Contiene información sobre las operaciones de mutación del clúster. |
Modificar parámetros a nivel de sistema
Los parámetros a nivel de sistema corresponden a los ajustes del archivo config.xml. Para modificarlos, siga este procedimiento:
Inicie sesión en la consola de ApsaraDB for ClickHouse.
En la página Clusters, seleccione Clusters of Community-compatible Edition y luego haga clic en el ID del clúster de destino.
En el panel de navegación izquierdo, haga clic en Parameter Configuration.
En la página Parameter Configuration, haga clic en el ícono de edición de la columna Parameter Value correspondiente al parámetro
max_concurrent_queries.Introduzca el nuevo valor en el cuadro de diálogo y haga clic en OK.
Haga clic en Submit Parameters.
Haga clic en OK.
Después de hacer clic en OK, el proceso clickhouse-server se reinicia automáticamente. Esto provoca una desconexión transitoria de aproximadamente 1 minuto.
Modificar parámetros a nivel de usuario
Los parámetros a nivel de usuario corresponden a los elementos de configuración del archivo users.xml. Para modificar un parámetro, ejecute la siguiente sentencia.
SET global ON cluster default ${key}=${value};
Salvo que se indique lo contrario, el cambio surte efecto de inmediato.
Modificar una cuota
Especifique el parámetro de cuota en la sección settings de una sentencia de ejecución:
settings max_memory_usage = XXX;
Variaciones en el uso de CPU y memoria entre nodos
En un clúster node múltiple de tipo dual-replica o single-replica, el write node presenta un mayor CPU usage y memory usage que los demás node durante write operation intensivas. El uso se equilibra entre los node una vez que los datos se sincronizan.
Consultar registros detallados del sistema
-
Descripción del problema:
Cómo consultar los registros detallados del sistema para solucionar errores o identificar posibles problemas.
-
Solución:
-
Compruebe el parámetro
text_log.levelde su clúster y aplique una de las siguientes acciones:Si
text_log.levelestá vacío, el registro de texto está deshabilitado. Para habilitarlo, establezca un valor para este parámetro.Si
text_log.leveltiene un valor asignado, compruebe que el nivel de registro cumpla con sus requisitos. De lo contrario, modifique el parámetro al nivel deseado.
Conéctese a la base de datos de destino. Connect to a database.
-
Ejecute la siguiente sentencia para consultar y analizar los registros.
SELECT * FROM system.text_log;
-
Solucionar problemas de conectividad de red
Si el clúster de destino y el origen de datos se encuentran en la misma VPC y región, compruebe que la dirección IP de cada uno esté incluida en la lista blanca del otro.
Para configurar la lista blanca de ClickHouse, consulte Set a Whitelist.
Para otros orígenes de datos, consulte la documentación de cada producto.
Si no se cumplen estas condiciones, establezca primero la conectividad mediante una solución de red adecuada. Después, agregue la dirección IP de cada componente a la lista blanca del otro.
|
Escenario |
Solución |
|
Conectividad de nube híbrida |
|
|
Conectividad de VPC entre regiones y cuentas distintas |
|
|
Conectividad en la misma región con VPC diferentes |
Use Cloud Enterprise Network to Achieve Same-region VPC Connectivity (Basic Edition) |
|
Conectividad de VPC entre regiones y cuentas distintas |
|
|
Conectividad de red pública |
|
|
Conflicto de direcciones |
Migración de Community Edition a Enterprise Edition
Sí, es posible migrar un clúster de ClickHouse Community Edition a un clúster de Enterprise Edition.
Los datos se pueden migrar entre clústeres de Enterprise Edition y Community Edition mediante la función remote o al exportar e importar archivos de datos. Migrate data from a self-managed ClickHouse cluster to Alibaba Cloud ClickHouse Community-Compatible Edition.
Esquemas inconsistentes durante la migración de datos
Descripción del problema
La migración de datos requiere esquemas de bases de datos y tablas consistentes en todos los shards. De lo contrario, algunas bases de datos o tablas podrían fallar durante la migración.
Soluciones
-
El esquema de una tabla MergeTree (que no sea una tabla interna de una vista materializada) es inconsistente entre los shards.
Revise si la lógica de negocio genera las discrepancias de esquema entre los shards:
Si espera que los esquemas de las tablas sean idénticos en todos los shards, debe volver a crear las tablas para garantizar la consistencia.
Si la lógica de negocio utiliza intencionalmente esquemas de tabla distintos entre los shards, Submit a ticket para ponerse en contacto con el soporte técnico y obtener asistencia.
-
La tabla interna de una vista materializada es inconsistente entre los shards.
-
Solución 1: cambie el nombre de las tablas internas y apunte explícitamente la vista materializada y la tabla distribuida a la tabla MergeTree de destino. El siguiente procedimiento toma como ejemplo la vista materializada original
up_down_votes_per_day_mv.-
Enumere las tablas que no están presentes en todos los nodos.
NODE_NUM= Número de shards × Número de réplicas.SELECT database,table,any(create_table_query) AS sql,count() AS cnt FROM cluster(default, system.tables) WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA') GROUP BY database, table HAVING cnt != <NODE_NUM>; -
Identifique las vistas materializadas que tienen un número incorrecto de tablas internas.
SELECT substring(hostName(),38,8) AS host,* FROM cluster(default, system.tables) WHERE uuid IN (<UUID1>, <UUID2>, ...); -
Deshabilite el comportamiento predeterminado de sincronización del clúster. Este paso es obligatorio para los clústeres de ApsaraDB for ClickHouse, pero no para los clústeres de ClickHouse autogestionados. Luego, cambie el nombre de la tabla interna para asegurar la consistencia en todos los nodos. Para reducir el riesgo operativo, obtain the IP address of each node, conéctese al puerto 3005 y ejecute las siguientes sentencias de forma individual en cada nodo.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; RENAME TABLE `mv_test`.`.inner_id.9b40675b-3d72-4631-a26d-25459250****` TO `mv_test`.`up_down_votes_per_day`; -
Elimine la vista materializada. Ejecute las siguientes sentencias de forma individual en cada nodo.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; DROP TABLE mv_test.up_down_votes_per_day_mv; -
Cree una nueva vista materializada que apunte explícitamente a la tabla interna cuyo nombre modificó. Ejecute las siguientes sentencias de forma individual en cada nodo.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; CREATE MATERIALIZED VIEW mv_test.up_down_votes_per_day_mv TO `mv_test`.`up_down_votes_per_day` ( `Day` Date, `UpVotes` UInt32, `DownVotes` UInt32 ) AS SELECT toStartOfDay(CreationDate) AS Day, countIf(VoteTypeId = 2) AS UpVotes, countIf(VoteTypeId = 3) AS DownVotes FROM mv_test.votes GROUP BY Day;Nota: Debe definir explícitamente las columnas de la tabla de destino en la definición de la vista materializada. No dependa de la inference de tipos de la sentencia SELECT, ya que esto puede provocar errores inesperados. Por ejemplo, si una columna llamada
tcp_cnse calcula mediante una función de estado de agregación comosumIfStateen la sentenciaSELECT, debe definir su tipo en la tabla de destino como AggregateFunction, por ejemplo,AggregateFunction(sum, Float64).Uso correcto
CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner ( ... tcp_cnt AggregateFunction(sum, Float64), ) AS SELECT ... sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt, FROM net_obs.public_flow_5tuple_1m_local ...Uso incorrecto
CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner AS SELECT ... sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt, FROM net_obs.public_flow_5tuple_1m_local ...
-
Solución 2: cambie el nombre de las tablas internas, reconstruya las vistas materializadas en todos los nodos y luego migre los datos desde las tablas internas anteriores.
Solución 3: implemente una estrategia de escritura dual para las vistas materializadas y espere 7 días para que los datos se sincronicen.
-
Fallo de sentencias SQL en Enterprise Edition 24.5 o versiones posteriores
De manera predeterminada, las instancias de Enterprise Edition 24.5 o versiones posteriores utilizan el nuevo analizador de consultas. Este analizador ofrece un mejor rendimiento, pero podría no ser compatible con versiones anteriores para ciertas sentencias SQL heredadas. Si encuentra un error de análisis sintáctico, vuelva al analizador anterior. Más información sobre el nuevo analizador.
SET allow_experimental_analyzer = 0;
Suspender un clúster
La función de suspensión solo está disponible para clústeres de Enterprise Edition. Los clústeres de ClickHouse Community Edition no se pueden suspender. Para suspender un clúster de Enterprise Edition, vaya a la página Enterprise Edition Clusters. Seleccione la región de destino en la esquina superior izquierda. En la lista de clústeres, busque el clúster de destino y haga clic en
> Suspend en la columna Actions.
Convertir una tabla MergeTree a ReplicatedMergeTree
Descripción del problema
Los usuarios que no están familiarizados con ClickHouse pueden crear por error tablas con el motor MergeTree en un clúster de múltiples réplicas. Esto impide que los datos se sincronicen entre los nodos de réplica de cada shard. Como consecuencia, las consultas en la tabla distribuida correspondiente pueden devolver resultados inconsistentes. Para resolver este problema, debe convertir la tabla MergeTree en una tabla ReplicatedMergeTree.
Solución
ClickHouse no proporciona una sentencia DDL para cambiar directamente el motor de almacenamiento de una tabla. Para convertir una tabla MergeTree en una tabla ReplicatedMergeTree, debe crear una tabla nueva con el motor ReplicatedMergeTree y luego importar los datos de la tabla original.
Por ejemplo, suponga que tiene una tabla MergeTree llamada table_src y su tabla distribuida correspondiente llamada table_src_d en un clúster de múltiples réplicas. Para convertir esta tabla MergeTree en una tabla ReplicatedMergeTree, siga estos pasos:
Cree la tabla ReplicatedMergeTree de destino,
table_dst, y su tabla distribuida correspondiente,table_dst_d. CREATE TABLE.Importe los datos de la tabla MergeTree
table_srchaciatable_dst_d. Puede utilizar uno de los dos métodos siguientes.
Ambos métodos consultan los datos de origen desde la tabla MergeTree local.
Si el volumen de datos es pequeño, inserte los datos directamente en la tabla distribuida
table_dst_dpara distribuirlos de manera uniforme.Si los datos de la tabla MergeTree original
table_srcya están equilibrados entre todos los nodos y el volumen de datos es grande, puede insertarlos directamente en la tabla ReplicatedMergeTree localtable_dstde cada nodo.Si el conjunto de datos es grande, el proceso de importación puede tardar bastante tiempo. Cuando utilice la función
remote(), asegúrese de configurar un valor de tiempo de espera adecuado.
Usar la función remote
-
Obtenga la dirección IP de cada nodo.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe los datos mediante la función remote.
Pase secuencialmente las direcciones IP obtenidas en el paso anterior a la función
remote()y ejecute la sentencia para cada una de ellas.INSERT INTO table_dst_d SELECT * FROM remote('node1', db.table_src) ;Por ejemplo, si las direcciones IP de dos nodos son
10.10.0.165y10.10.0.167, ejecute por separado las siguientes sentenciasINSERT:INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.167', default.table_src) ; INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.165', default.table_src) ;Al ejecutar las sentencias para todas las direcciones IP de los nodos, la tabla MergeTree se convierte en una tabla ReplicatedMergeTree.
Usar tablas locales
Si cuenta con una instancia ECS que tenga instalado el cliente de ClickHouse en su VPC, puede iniciar sesión en cada nodo por separado para realizar las siguientes operaciones.
-
Obtenga la dirección IP de cada nodo.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe los datos.
Inicie sesión secuencialmente en cada nodo mediante su dirección IP y ejecute la siguiente sentencia.
INSERT INTO table_dst_d SELECT * FROM db.table_src ;Al ejecutar la sentencia en todos los nodos, la tabla MergeTree se convierte en una tabla ReplicatedMergeTree.
Ejecutar varias sentencias SQL en la misma sesión
Establecer un session_id único garantiza que el servidor de ClickHouse mantenga un contexto consistente para las solicitudes con el mismo session ID. Esto le permite ejecutar varias sentencias SQL en una sola sesión. En este ejemplo se muestra cómo hacerlo con ClickHouse Java Client (V2).
-
Agregue la dependencia al archivo pom.xml de su proyecto Maven.
<dependency> <groupId>com.clickhouse</groupId> <artifactId>client-v2</artifactId> <version>0.8.2</version> </dependency> -
Establezca un
session IDpersonalizado en CommandSettings.package org.example; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.command.CommandSettings; public class Main { public static void main(String[] args) { Client client = new Client.Builder() .addEndpoint("endpoint") // Instance endpoint .setUsername("username") // Username .setPassword("password") // Password .build(); try { client.ping(10); CommandSettings commandSettings = new CommandSettings(); // Set the session_id commandSettings.serverSetting("session_id","examplesessionid"); // Set the max_block_size parameter for the session client.execute("SET max_block_size=65409 ",commandSettings); // Execute the queries client.execute("SELECT 1 ",commandSettings); client.execute("SELECT 2 ",commandSettings); } catch (Exception e) { throw new RuntimeException(e); } finally { client.close(); } } }
En este ejemplo, ambas sentencias SELECT se ejecutan en la misma sesión con un max_block_size de 65409. ClickHouse Java Client: Java Client | ClickHouse Docs.
Por qué falla la deduplicación con FINAL al usar JOIN
Síntoma
Cuando utiliza la palabra clave FINAL para deduplicar los resultados de una consulta, la deduplicación falla si la sentencia SQL contiene una cláusula JOIN. Como resultado, los datos duplicados permanecen en la salida. A continuación se muestra un ejemplo de sentencia SQL:
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;
Causa
Se trata de un bug conocido de ClickHouse que aún no cuenta con parche. La deduplicación falla debido a un conflicto entre la lógica de ejecución de FINAL y JOIN. Problema n.º 8655 de ClickHouse.
Solución
-
Solución 1 (Recomendada): habilite el optimizador experimental. Habilite
FINALa nivel de consulta agregando un ajuste a su consulta. Este método no requiere una declaración a nivel de tabla. Por ejemplo:Si la sentencia SQL original es:
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;Quite la palabra clave
FINALdel nombre de la tabla y agreguesettings allow_experimental_analyzer = 1,FINAL = 1to the statement. The revised statement is as follows:SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportanteEl parámetro
allow_experimental_analyzersolo es compatible con las versiones 23.8 y posteriores. Si utiliza una versión anterior, actualícela antes de modificar la sentencia SQL. Upgrade a major engine version. -
Solución 2 (Utilizar con precaución):
Fuerce una fusión para la deduplicación ejecutando periódicamente
OPTIMIZE TABLE local_table_name FINAL. Esto fusiona los datos por adelantado, pero debe usarse con precaución en tablas grandes, ya que genera una alta sobrecarga de E/S.Modifique la consulta SQL: quite la palabra clave
FINAL. La deduplicación de datos dependerá entonces de consultar los datos fusionados.
ImportanteUse this approach with caution because this operation consumes significant I/O resources and can affect the performance of large tables.
¿Por qué las operaciones DELETE o UPDATE quedan incompletas?
Síntoma
Cuando ejecuta operaciones de eliminación (DELETE) o actualización (UPDATE) de datos en un clúster de ApsaraDB for ClickHouse Community-compatible Edition, las tareas permanecen incompletas durante mucho tiempo.
Causa
A diferencia de las operaciones síncronas de MySQL, las operaciones DELETE y UPDATE en un clúster de ApsaraDB for ClickHouse Community-compatible Edition son asíncronas y se ejecutan mediante el mecanismo Mutation. Por lo tanto, los cambios no surten efecto en tiempo real. El proceso principal de una Mutation es el siguiente:
Envío de la tarea: un usuario ejecuta el comando
ALTER TABLE ... UPDATE/DELETEpara generar una tarea asíncrona.Marcado de datos: el sistema crea un archivo
mutation_*.txten segundo plano para registrar el rango de datos que se modificará. Los cambios no se aplican de inmediato.Reescritura en segundo plano: ClickHouse reescribe gradualmente el
data partafectado y aplica los cambios durante el proceso de fusión.Limpieza de datos antiguos: una vez completada la fusión, los bloques de datos antiguos se marcan para su eliminación.
Por consiguiente, emitir demasiadas operaciones Mutation en un periodo corto puede bloquear las tareas y dejar incompletas las operaciones DELETE y UPDATE. Para evitar acumulaciones, ejecute la siguiente sentencia SQL y compruebe si hay Mutations en ejecución antes de emitir una nueva.
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
Solución
-
Compruebe si se está ejecutando una cantidad excesiva de tareas Mutation en el clúster.
Ejecute la siguiente sentencia SQL para consultar el estado actual de las Mutations en el clúster:
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0; -
Si hay muchas tareas Mutation en ejecución, utilice una cuenta con privilegios para cancelar algunas o todas.
-
Cancele todas las tareas Mutation de una sola tabla.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' -
Cancele una tarea Mutation específica.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' AND mutation_id = '<mutation_id>'Para obtener el mutation_id, ejecute la siguiente sentencia SQL:
SELECT mutation_id, * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
-
¿Cómo resolver el error "Code: 241. DB::Exception: Memory limit (total) exceeded" en ApsaraDB for ClickHouse Enterprise Edition?
-
Síntoma: al ejecutar una instrucción SQL, aparece a continuación el siguiente mensaje de error, incluso cuando la memoria total del clúster supera el límite indicado en dicho mensaje:
Code: 241. DB::Exception: Memory limit (total) exceeded: would use 115.28 GiB (attempt to allocate chunk of 133791376 bytes), maximum: 115.20 GiB. OvercommitTracker decision: Query was selected to stop by OvercommitTracker.: While executing AggregatingTransform. (MEMORY_LIMIT_EXCEEDED) (version 24.2.2.16476 (official build)) -
Causa: en ApsaraDB for ClickHouse Enterprise Edition, cada nodo tiene un límite de CCU (un máximo de 32 CCU, donde 1 CCU equivale aproximadamente a 1 vCore y 4 GiB de memoria). Si una sola consulta SQL consume más memoria que el umbral del nodo, MemoryTracker intercepta la consulta. El umbral predeterminado es 0.9 veces la memoria total del nodo. Ejecute la siguiente instrucción SQL para consultar el umbral:
SELECT * FROM system.server_settings WHERE name = 'max_server_memory_usage_to_ram_ratio'; Solución: establezca el
allow_experimental_parallel_reading_from_replicasparameter to 1. This distributes the data reading phase across multiple nodes, spreading the memory consumption. Enterprise Edition.
¿Por qué los resultados de las consultas son inconsistentes?
Síntoma
En un clúster de ApsaraDB for ClickHouse Community-compatible Edition, ejecutar varias veces la misma instrucción SQL devuelve resultados inconsistentes.
Causa
Los resultados inconsistentes para la misma consulta en un clúster de ApsaraDB for ClickHouse Community-compatible Edition se deben principalmente a dos razones:
-
Las consultas apuntan a una tabla local en un clúster con varios shards.
En un clúster con varios shards de ApsaraDB for ClickHouse Community-compatible Edition, debe crear una tabla distribuida además de las tablas locales. En este tipo de clústeres, el proceso de escritura de datos es el siguiente:
Primero se escriben los datos en la tabla distribuida, que luego los distribuye a las tablas locales de distintos shards para su almacenamiento.
Al consultar datos, el origen varía según el tipo de tabla consultada:
Consulta a una tabla distribuida: la tabla distribuida agrega y devuelve los datos de las tablas locales de todos los shards.
Consulta a una tabla local: cada consulta devuelve datos de la tabla local de un shard seleccionado de forma aleatoria, lo que genera resultados inconsistentes.
-
Una tabla en un clúster de dos réplicas no se creó con un motor de la serie
Replicated*.En un clúster de dos réplicas de ApsaraDB for ClickHouse Community-compatible Edition, las tablas deben crearse con un motor de la serie Replicated*, como ReplicatedMergeTree, para habilitar la sincronización de datos entre réplicas.
Si una tabla en un clúster de dos réplicas se crea sin un motor de la serie Replicated*, los datos no se sincronizan entre las réplicas, lo que puede provocar resultados de consulta inconsistentes.
Solución
-
Determine el tipo de clúster.
Revise la información del clúster para determinar si es un clúster con varios shards, un clúster de dos réplicas o un clúster con varios shards y dos réplicas. Siga estos pasos:
Inicie sesión en la consola de ApsaraDB for ClickHouse.
En la esquina superior izquierda de la página, seleccione Clusters of Community-compatible Edition.
-
En la lista de clústeres, haga clic en el ID del clúster de destino para abrir su página de información.
Consulte Edition en la sección Cluster Properties y Node Groups en la sección Configuration Information. Puede determinar el tipo de clúster según las siguientes propiedades:
Si el número de grupos de nodos es mayor que 1, el clúster tiene varios shards.
Si la serie es High-availability Edition, el clúster es de dos réplicas.
Si se cumplen ambas condiciones, el clúster tiene varios shards y dos réplicas.
-
Seleccione una solución según el tipo de clúster.
Clúster con varios shards
Compruebe el tipo de la tabla consultada. Si es una tabla local, consulte la tabla distribuida en su lugar.
Si no existe una tabla distribuida, debe crear una. Create a table.
Clúster de dos réplicas
Revise la instrucción
CREATE TABLEde la tabla de destino. Si su motor no pertenece a la serieReplicated*, vuelva a crear la tabla. Create a table.Clúster con varios shards y dos réplicas
Compruebe el tipo de la tabla consultada.
Si es una tabla local, consulte la tabla distribuida. Si no existe una tabla distribuida, debe crear una.
Si está consultando una tabla distribuida, compruebe si el motor de la tabla local correspondiente pertenece a la serie
Replicated*. De lo contrario, vuelva a crear la tabla local con un motor de la serieReplicated*. Create a table.
¿Por qué ReplacingMergeTree no logra deduplicar después de una combinación forzada?
Síntoma
El motor ReplacingMergeTree de ClickHouse deduplica los datos con la misma clave principal durante el proceso de combinación. Sin embargo, después de forzar una combinación de datos con el siguiente comando, es posible que sigan existiendo datos duplicados con la misma clave principal:
optimize TABLE <table_name> FINAL ON cluster default;
Causa
El motor ReplacingMergeTree solo deduplica datos en un único nodo. Si los datos con la misma clave principal se distribuyen en distintos nodos porque no se especificó explícitamente la expresión sharding_key (de forma predeterminada, los datos se asignan de manera aleatoria mediante la función rand()), el motor no puede deduplicarlos en todo el clúster.
Solución
Vuelva a crear la tabla local y la tabla distribuida. Al crear la tabla distribuida, establezca la expresión sharding_key como la clave principal de la tabla local. CREATE TABLE.
Debe volver a crear tanto la tabla distribuida como la tabla local. Si solo vuelve a crear la tabla distribuida, el cambio afectará únicamente a los datos nuevos y los datos existentes quedarán sin deduplicar.