- Almacenamiento de objetos Amazon S3.
- Azure Blob Storage.
- No compatible: Hadoop Distributed File System (HDFS)
ClickHouse también admite motores de tabla externos, que son distintos de
la opción de almacenamiento externo descrita en esta página, ya que permiten leer datos
almacenados en formatos de archivo genéricos (como Parquet). En esta página describimos
la configuración de almacenamiento para las tablas de la familia
MergeTree o de la familia Log.- para trabajar con datos almacenados en discos
Amazon S3, use el motor de tabla S3. - para trabajar con datos almacenados en Azure Blob Storage, use el motor de tabla AzureBlobStorage.
- para trabajar con datos en Hadoop Distributed File System (no compatible), use el motor de tabla HDFS.
Configurar almacenamiento externo
MergeTree y Log
pueden almacenar datos en S3, AzureBlobStorage y HDFS (no compatible) usando un disco de tipo s3,
azure_blob_storage o hdfs (no compatible), respectivamente.
La configuración del disco requiere:
- Una sección
type, igual a uno des3,azure_blob_storage,hdfs(no compatible),local_blob_storage,web. - La configuración de un tipo específico de almacenamiento externo.
- Un
typeigual aobject_storage object_storage_type, igual a uno des3,azure_blob_storage(o simplementeazurea partir de24.3),hdfs(no compatible),local_blob_storage(o simplementelocala partir de24.3),web.
Opcionalmente, se puede especificar
metadata_type (su valor predeterminado es local), pero también puede establecerse en plain, web y, a partir de 24.4, plain_rewritable.
El uso del tipo de metadatos plain se describe en la sección sobre almacenamiento plain; el tipo de metadatos web solo puede usarse con el tipo de almacenamiento de objetos web; el tipo de metadatos local almacena los archivos de metadatos localmente (cada archivo de metadatos contiene la asignación a archivos en el almacenamiento de objetos y cierta metainformación adicional sobre ellos).
Por ejemplo:
24.1):
MergeTree,
agregue la siguiente sección al archivo de configuración:
disk en lugar de storage_policy. En este caso, no es necesario
tener la sección storage_policy en el archivo de configuración; basta con una sección disk.
refresh_parts_interval y table_disk
refresh_parts_interval permite actualizar periódicamente la lista de partes de datos desde el almacenamiento subyacente (por ejemplo, para detectar partes escritas externamente). La distinción importante es entre metadatos compartidos entre réplicas y metadatos locales de cada réplica (por ejemplo, S3 con metadatos locales por réplica): solo cuando los metadatos se comparten las partes nuevas serán visibles para todas las réplicas. Usar solo almacenamiento de objetos no implica metadatos compartidos.
-
Almacenamiento de objetos (por ejemplo,
disk = 's3') no implica metadatos compartidos. Cuando los metadatos se almacenan localmente en cada réplica (el comportamiento predeterminado), cada réplica gestiona de forma independiente sus punteros a blobs en almacenamiento de objetos. Los cambios realizados en una réplica no son visibles para las demás. En ese caso,refresh_parts_intervalno hace que las partes nuevas sean visibles entre réplicas, porque los metadatos que lee cada réplica son locales a esa réplica. -
La actualización automática de partes requiere que los metadatos del filesystem se compartan (o que la tabla use metadatos de solo lectura propiedad de la propia tabla para que la actualización sea aplicable). Configurar
table_disk = truejunto con un disco local de la tabla (por ejemplo,SETTINGS disk = disk(type=object_storage, ...), table_disk = true) es una forma de obtener la semántica correcta: la tabla controla el ciclo de vida de los metadatos y el almacenamiento se trata como de solo lectura, por lo querefresh_parts_intervalse ejecuta y pueden detectarse las partes añadidas externamente. -
Con un disco definido globalmente (por ejemplo,
disk = 's3'enstorage_configuration) y los metadatos locales predeterminados, cada réplica tiene su propio estado de metadatos. Aunque los blobs puedan estar en S3, el almacenamiento no se considera compartido a efectos derefresh_parts_interval, y las partes nuevas creadas fuera de ClickHouse o en otra réplica no se detectarán.
table_disk = true, como se indicó anteriormente. Si se confía solo en refresh_parts_interval con metadatos locales de la réplica, las partes no se actualizarán como se espera.
refresh_parts_interval no se usa para tablas ReplicatedMergeTree.
Las tablas replicadas ya sincronizan las partes mediante el mecanismo de replicación.
Esta configuración solo se aplica a tablas MergeTree no replicadas en las que las partes se escriben externamente y se requiere actualizar los metadatos.Configuración dinámica
CREATE/ATTACH.
La siguiente consulta de ejemplo se basa en la configuración dinámica de disco anterior y
muestra cómo usar un disco local para almacenar en caché datos de una tabla almacenada en una URL.
type=web está anidado dentro
del disco de type=cache.
El ejemplo usa
type=web, pero cualquier tipo de disco puede configurarse como dinámico,
incluido un disco local. Los discos locales requieren que el argumento path esté dentro del
parámetro de configuración del servidor custom_local_disks_base_directory, que no tiene
ningún valor predeterminado, así que establézcalo también cuando use un disco local.web procede del archivo de configuración del servidor:
Uso del almacenamiento S3
Parámetros obligatorios
| Parámetro | Descripción |
|---|---|
endpoint | URL del endpoint de S3 con estilo path o virtual hosted styles. Debe incluir el bucket y la ruta raíz para almacenar los datos. |
access_key_id | ID de la clave de acceso de S3 utilizada para la autenticación. |
secret_access_key | Clave de acceso secreta de S3 utilizada para la autenticación. |
Parámetros opcionales
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
region | Nombre de la región de S3. | - |
support_batch_delete | Controla si se comprueba la compatibilidad con la eliminación por lotes. Establézcalo en false cuando use Google Cloud Storage (GCS), ya que GCS no admite eliminaciones por lotes. | true |
use_environment_credentials | Lee las credenciales de AWS de las variables de entorno AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY y AWS_SESSION_TOKEN, si existen. Nota: las credenciales del entorno se comparten entre todos los discos S3. Para usar credenciales distintas en diferentes discos, especifique access_key_id y secret_access_key explícitos para cada disco. | false |
use_insecure_imds_request | Si es true, usa una solicitud IMDS no segura al obtener credenciales de los metadatos de Amazon EC2. | false |
expiration_window_seconds | Período de gracia (en segundos) para comprobar si las credenciales basadas en expiración han caducado. | 120 |
proxy | Configuración del proxy para el endpoint de S3. Cada elemento uri dentro del bloque proxy debe contener una URL de proxy. | - |
connect_timeout_ms | Tiempo de espera de conexión del socket, en milisegundos. | 10000 (10 segundos) |
request_timeout_ms | Tiempo de espera de la solicitud, en milisegundos. | 5000 (5 segundos) |
retry_attempts | Número de reintentos para solicitudes fallidas. | 10 |
single_read_retries | Número de reintentos ante caídas de conexión durante la lectura. | 4 |
min_bytes_for_seek | Número mínimo de bytes para usar la operación seek en lugar de la lectura secuencial. | 1 MB |
metadata_path | Ruta local del sistema de archivos donde se almacenan los archivos de metadatos de S3. | /var/lib/clickhouse/disks/<disk_name>/ |
skip_access_check | Si es true, omite las comprobaciones de acceso al disco durante el arranque. | false |
header | Añade el encabezado HTTP especificado a las solicitudes. Puede especificarse varias veces. | - |
server_side_encryption_customer_key_base64 | Encabezados necesarios para acceder a objetos S3 con cifrado SSE-C. | - |
server_side_encryption_kms_key_id | Encabezados necesarios para acceder a objetos S3 con cifrado SSE-KMS. Una cadena vacía usa la clave S3 administrada por AWS. | - |
server_side_encryption_kms_encryption_context | Encabezado de contexto de cifrado para SSE-KMS (usado con server_side_encryption_kms_key_id). | - |
server_side_encryption_kms_bucket_key_enabled | Habilita las claves de bucket de S3 para SSE-KMS (usado con server_side_encryption_kms_key_id). | Coincide con la configuración del bucket |
s3_max_put_rps | Número máximo de solicitudes PUT por segundo antes de aplicar throttling. | 0 (ilimitado) |
s3_max_put_burst | Número máximo de solicitudes PUT simultáneas antes de alcanzar el límite de RPS. | Igual que s3_max_put_rps |
s3_max_get_rps | Número máximo de solicitudes GET por segundo antes de aplicar throttling. | 0 (ilimitado) |
s3_max_get_burst | Número máximo de solicitudes GET simultáneas antes de alcanzar el límite de RPS. | Igual que s3_max_get_rps |
read_resource | Nombre del recurso para programar solicitudes de lectura. | Cadena vacía (deshabilitado) |
write_resource | Nombre del recurso para programar solicitudes de escritura. | Cadena vacía (deshabilitado) |
key_template | Define el formato de generación de claves de objeto mediante la sintaxis de re2. Requiere la marca storage_metadata_write_full_object_key. Es incompatible con root path en endpoint. Requiere key_compatibility_prefix. | - |
key_compatibility_prefix | Obligatorio con key_template. Especifica el root path anterior de endpoint para leer versiones antiguas de metadatos. | - |
read_only | Solo permite leer desde el disco. | - |
Google Cloud Storage (GCS) también es compatible mediante el tipo
s3. Consulte GCS backed MergeTree.Uso de Plain Storage
22.10 se introdujo un nuevo tipo de disco, s3_plain, que proporciona almacenamiento de escritura única.
Sus parámetros de configuración son los mismos que los del tipo de disco s3.
A diferencia del tipo de disco s3, almacena los datos tal cual. En otras palabras,
en lugar de usar nombres de blob generados aleatoriamente, usa nombres de archivo normales
(de la misma forma en que ClickHouse almacena archivos en el disco local) y no almacena
metadatos localmente. Por ejemplo, estos se derivan de los datos en s3.
Este tipo de disco permite mantener una versión estática de la tabla, ya que no
permite ejecutar merges sobre los datos existentes ni insertar nuevos
datos. Un caso de uso de este tipo de disco es crear backups en él, lo que puede hacerse
mediante BACKUP TABLE data TO Disk('plain_disk_name', 'backup_name'). Después,
puede hacer RESTORE TABLE data AS data_restored FROM Disk('plain_disk_name', 'backup_name')
o usar ATTACH TABLE data (...) ENGINE = MergeTree() SETTINGS disk = 'plain_disk_name'.
Configuración:
24.1, es posible configurar cualquier disco de almacenamiento de objetos (s3, azure, hdfs (no compatible), local) usando
el tipo de metadatos plain.
Configuración:
Uso de almacenamiento S3 simple reescribible
s3_plain_rewritable en 24.4.
Al igual que el tipo de disco s3_plain, no requiere almacenamiento adicional para
los archivos de metadatos. En su lugar, los metadatos se almacenan en S3.
A diferencia del tipo de disco s3_plain, s3_plain_rewritable permite ejecutar merges
y admite operaciones INSERT.
No se admiten las mutaciones ni la replicación de tablas.
Un caso de uso de este tipo de disco es en tablas MergeTree no replicadas. Aunque
el tipo de disco s3 es adecuado para tablas MergeTree no replicadas, puede optar
por el tipo de disco s3_plain_rewritable si no necesita metadatos locales
para la tabla y está dispuesto a aceptar un conjunto limitado de operaciones. Esto puede
resultar útil, por ejemplo, para las tablas del sistema.
Configuración:
24.5, es posible configurar cualquier disco de almacenamiento de objetos
(s3, azure, local) con el tipo de metadatos plain_rewritable.
Uso de Azure Blob Storage
MergeTree pueden almacenar datos en Azure Blob Storage
mediante un disco de tipo azure_blob_storage.
Configuración:
Parámetros de conexión
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
storage_account_url (Obligatorio) | URL de la cuenta de Azure Blob Storage. Ejemplos: http://account.blob.core.windows.net o http://azurite1:10000/devstoreaccount1. | - |
container_name | Nombre del contenedor de destino. | default-container |
container_already_exists | Controla el comportamiento de creación del contenedor: - false: crea un contenedor nuevo - true: se conecta directamente al contenedor existente - Si no se establece: comprueba si el contenedor existe y lo crea si es necesario | - |
| Parámetro | Descripción |
|---|---|
connection_string | Para la autenticación mediante una cadena de conexión. |
account_name | Para la autenticación mediante Shared Key (se usa con account_key). |
account_key | Para la autenticación mediante Shared Key (se usa con account_name). |
Parámetros de límite
| Parámetro | Descripción |
|---|---|
s3_max_single_part_upload_size | Tamaño máximo de una sola carga de bloque en Blob Storage. |
min_bytes_for_seek | Tamaño mínimo de una región en la que se puede cambiar la posición de lectura. |
max_single_read_retries | Número máximo de intentos para leer un fragmento de datos desde Blob Storage. |
max_single_download_retries | Número máximo de intentos para descargar un búfer legible desde Blob Storage. |
thread_pool_size | Número máximo de hilos para la creación de instancias de IDiskRemote. |
s3_max_inflight_parts_for_one_file | Número máximo de solicitudes PUT simultáneas para un solo objeto. |
Otros parámetros
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
metadata_path | Ruta local del sistema de archivos para almacenar archivos de metadatos de Blob Storage. | /var/lib/clickhouse/disks/<disk_name>/ |
skip_access_check | Si es true, omite las comprobaciones de acceso al disco durante el inicio. | false |
read_resource | Nombre del recurso para la planificación de solicitudes de lectura. | Cadena vacía (deshabilitado) |
write_resource | Nombre del recurso para la planificación de solicitudes de escritura. | Cadena vacía (deshabilitado) |
metadata_keep_free_space_bytes | Cantidad de espacio libre que se debe reservar en el disco de metadatos. | - |
La replicación zero-copy no está lista para producciónLa replicación zero-copy está deshabilitada de forma predeterminada en ClickHouse versión 22.8 y posteriores. Esta funcionalidad no se recomienda para uso en producción.
Uso del almacenamiento HDFS (sin soporte)
- el disco es de tipo
hdfs(sin soporte) - los datos están alojados en
hdfs://hdfs1:9000/clickhouse/
Uso del cifrado de datos
encrypted y elegir el disco en el que se guardarán los datos. Un disco encrypted cifra todos los archivos escritos en tiempo real y, al leer archivos desde un disco encrypted, los descifra automáticamente. Así, puede trabajar con un disco encrypted como si fuera uno normal.
Ejemplo de configuración de disco:
store/all_1_1_0/data.bin en disk1, en realidad ese archivo se escribirá en el disco físico en la ruta /path1/store/all_1_1_0/data.bin.
Al escribir el mismo archivo en disk2, en realidad se escribirá en el disco físico en la ruta /path1/path2/store/all_1_1_0/data.bin, en modo cifrado.
Parámetros requeridos
| Parámetro | Tipo | Descripción |
|---|---|---|
type | String | Debe establecerse en encrypted para crear un disco cifrado. |
disk | String | Tipo de disco que se utilizará para el almacenamiento subyacente. |
key | Uint64 | Clave para el cifrado y descifrado. Puede especificarse en formato hexadecimal mediante key_hex. Se pueden especificar varias claves usando el atributo id. |
Parámetros opcionales
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
path | String | Directorio raíz | Ubicación en el disco donde se guardarán los datos. |
current_key_id | String | - | El identificador de clave usado para el cifrado. Todas las claves especificadas pueden usarse para el descifrado. |
algorithm | Enum | AES_128_CTR | Algoritmo de cifrado. Opciones: - AES_128_CTR (clave de 16 bytes) - AES_192_CTR (clave de 24 bytes) - AES_256_CTR (clave de 32 bytes) |
Uso de la caché local
s3. En las versiones >= 22.8, la caché es compatible con cualquier tipo de disco: S3, Azure, Local, Encrypted, etc.
En las versiones >= 23.5, la caché solo es compatible con tipos de disco remotos: S3, Azure, HDFS (sin soporte).
La caché usa la política LRU.
Ejemplo de configuración para versiones posteriores o iguales a 22.8:
| Parameter | Type | Default | Description |
|---|---|---|---|
path | String | - | Obligatorio. Ruta al directorio donde se almacenará la caché. |
max_size | Size | - | Obligatorio. Tamaño máximo de la caché en bytes o en un formato legible (p. ej., 10Gi). Los archivos se expulsan según la política LRU cuando se alcanza el límite. Admite formatos ki, Mi, Gi (desde la v22.10). |
cache_on_write_operations | Boolean | false | Habilita la caché write-through para las consultas INSERT y las fusiones en segundo plano. Se puede anular para cada consulta con enable_filesystem_cache_on_write_operations. |
enable_filesystem_query_cache_limit | Boolean | false | Habilita límites de tamaño de caché por consulta basados en max_query_cache_size. |
enable_cache_hits_threshold | Boolean | false | Cuando está habilitado, los datos solo se almacenan en caché después de leerse varias veces. |
cache_hits_threshold | Integer | 0 | Número de lecturas necesarias antes de que los datos se almacenen en caché (requiere enable_cache_hits_threshold). |
enable_bypass_cache_with_threshold | Boolean | false | Omite la caché para rangos de lectura grandes. |
bypass_cache_threshold | Size | 256Mi | Tamaño del rango de lectura que activa la omisión de la caché (requiere enable_bypass_cache_with_threshold). |
max_file_segment_size | Size | 8Mi | Tamaño máximo de un único archivo de caché en bytes o en un formato legible. |
max_elements | Integer | 10000000 | Número máximo de archivos de caché. |
load_metadata_threads | Integer | 16 | Número de hilos para cargar los metadatos de la caché durante el arranque. |
use_split_cache | Boolean | false | Separa los archivos entre sistema y datos. |
split_cache_ratio | Double | 0.1 | Proporción del segmento del sistema con respecto al tamaño total de la caché para split_cache. |
Nota: Los valores de tamaño admiten unidades comoki,Mi,Gi, etc. (p. ej.,10Gi).
Configuración de consulta/perfil de la caché del sistema de archivos
| Configuración | Tipo | Predeterminado | Descripción |
|---|---|---|---|
enable_filesystem_cache | Booleano | true | Habilita o deshabilita el uso de la caché por consulta, incluso cuando se utiliza un tipo de disco cache. |
read_from_filesystem_cache_if_exists_otherwise_bypass_cache | Booleano | false | Cuando está habilitado, usa la caché solo si los datos ya existen; los datos nuevos no se almacenarán en caché. |
enable_filesystem_cache_on_write_operations | Booleano | false (Cloud: true) | Habilita la caché write-through. Requiere cache_on_write_operations en la configuración de la caché. |
enable_filesystem_cache_log | Booleano | false | Habilita el registro detallado del uso de la caché en system.filesystem_cache_log. |
filesystem_cache_allow_background_download | Booleano | true | Permite que los segmentos descargados parcialmente se completen en segundo plano. Desactívelo para mantener las descargas en primer plano para la consulta o sesión actual. |
max_query_cache_size | Tamaño | false | Tamaño máximo de la caché por consulta. Requiere enable_filesystem_query_cache_limit en la configuración de la caché. |
filesystem_cache_skip_download_if_exceeds_per_query_cache_write_limit | Booleano | true | Controla el comportamiento cuando se alcanza max_query_cache_size: - true: Detiene la descarga de datos nuevos - false: Expulsa datos antiguos para dejar espacio para los datos nuevos |
Tablas del sistema de la caché del sistema de archivos
| Nombre de la tabla | Descripción | Requisitos |
|---|---|---|
system.filesystem_cache | Muestra el estado actual de la caché del sistema de archivos. | Ninguno |
system.filesystem_cache_log | Proporciona estadísticas detalladas del uso de la caché por consulta. | Requiere enable_filesystem_cache_log = true |
Comandos de la caché
SYSTEM CLEAR|DROP FILESYSTEM CACHE (<cache_name>) (ON CLUSTER) — ON CLUSTER
<cache_name>
SHOW FILESYSTEM CACHES
22.8, el comando se llama SHOW CACHES)
Query
Response
DESCRIBE FILESYSTEM CACHE '<cache_name>'
SHOW FILESYSTEM CACHES. (En versiones anteriores
o iguales a 22.8, el comando se llama DESCRIBE CACHE)
Query
Response
| Métricas actuales de la caché | Métricas asíncronas de la caché | Eventos de perfil de la caché |
|---|---|---|
FilesystemCacheSize | FilesystemCacheBytes | CachedReadBufferReadFromSourceBytes, CachedReadBufferReadFromCacheBytes |
FilesystemCacheElements | FilesystemCacheFiles | CachedReadBufferReadFromSourceMicroseconds, CachedReadBufferReadFromCacheMicroseconds |
CachedReadBufferCacheWriteBytes, CachedReadBufferCacheWriteMicroseconds | ||
CachedWriteBufferCacheWriteBytes, CachedWriteBufferCacheWriteMicroseconds |
Uso de almacenamiento web estático (solo lectura)
ATTACH TABLE (consulte el ejemplo a continuación). En realidad, el disco local
no se utiliza; cada consulta SELECT dará lugar a una solicitud http para
obtener los datos necesarios. Cualquier modificación de los datos de la tabla producirá una
excepción; es decir, no se permiten los siguientes tipos de consultas: CREATE TABLE,
ALTER TABLE, RENAME TABLE,
DETACH TABLE y TRUNCATE TABLE.
El almacenamiento web puede utilizarse con fines de solo lectura. Un caso de uso
es alojar datos de muestra o migrar datos. Existe una herramienta, clickhouse-static-files-uploader,
que prepara un directorio de datos para una tabla determinada (SELECT data_paths FROM system.tables WHERE name = 'table_name').
Para cada tabla que necesite, se obtiene un directorio de archivos. Estos archivos se pueden cargar
en, por ejemplo, un servidor web de archivos estáticos. Después de esta preparación,
puede cargar esta tabla en cualquier servidor de ClickHouse mediante DiskWeb.
En esta configuración de ejemplo:
- el disco es de tipo
web - los datos están alojados en
http://nginx:80/test1/ - se utiliza una caché en el almacenamiento local
ATTACH TABLE, el UUID proporcionado coincide con el nombre del directorio de los datos, y el endpoint es la URL del contenido raw de GitHub.
Parámetros obligatorios
| Parámetro | Descripción |
|---|---|
type | web. De lo contrario, el disco no se crea. |
endpoint | La URL del endpoint en formato path. La URL del endpoint debe incluir una ruta raíz donde se almacenan los datos cargados. |
Parámetros opcionales
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
min_bytes_for_seek | El número mínimo de bytes para usar la operación de seek en lugar de una lectura secuencial | 1 MB |
remote_fs_read_backoff_threashold | El tiempo máximo de espera al intentar leer datos desde el disco remoto | 10000 segundos |
remote_fs_read_backoff_max_tries | El número máximo de intentos de lectura con backoff | 5 |
DB:Exception Unreachable URL, puedes intentar ajustar esta configuración: http_connection_timeout, http_receive_timeout, keep_alive_timeout.
Para obtener archivos para la carga, ejecuta:
clickhouse static-files-disk-uploader --metadata-path <path> --output-dir <dir> (--metadata-path se puede encontrar en la consulta SELECT data_paths FROM system.tables WHERE name = 'table_name').
Al cargar archivos mediante endpoint, deben cargarse en la ruta <endpoint>/store/, pero la configuración solo debe contener endpoint.
Si la URL no es accesible al cargar el disco mientras el servidor inicia las tablas, se capturan todos los errores. Si en este caso hubo errores, las tablas pueden volver a cargarse (hacerse visibles) mediante DETACH TABLE table_name -> ATTACH TABLE table_name. Si los metadatos se cargaron correctamente durante el inicio del servidor, las tablas están disponibles de inmediato.
Usa la configuración http_max_single_read_retries para limitar el número máximo de reintentos durante una sola lectura HTTP.
Replicación zero-copy (no lista para producción)
S3 y HDFS (no compatibles). La replicación zero-copy significa que, si los datos se almacenan de forma remota en varias máquinas y es necesario sincronizarlos, solo se replican los metadatos (las rutas a las partes de datos), pero no los datos en sí.
La replicación zero-copy no está lista para producciónLa replicación zero-copy está deshabilitada de forma predeterminada en ClickHouse 22.8 y versiones posteriores. Esta funcionalidad no se recomienda para uso en producción.