La función de tabla s3 y el tipo de disco S3 de ClickHouse son compatibles con SeaweedFS, un almacén distribuido de objetos de código abierto con un gateway compatible con S3. SeaweedFS gestiona solicitudes con rutas de estilo path de forma nativa, por lo que una implementación self-hosted funciona sin DNS con comodines. SeaweedFS también admite tablas Iceberg: sus buckets de tablas almacenan los datos en archivos Parquet, y el catálogo REST de Iceberg integrado proporciona los metadatos de las tablas. Consulte la guía del catálogo de SeaweedFS para consultarlas a través del mismo endpoint.
Use SeaweedFS 4.42 o una versión posterior. Las versiones anteriores pueden eliminar un objeto cuyo commit de escritura se produce mientras se elimina su carpeta principal por estar vacía, lo que se manifiesta como Object ... suddenly disappeared justo después de una escritura correcta.
Ejecutar SeaweedFS localmente
Para realizar pruebas locales, cree un archivo s3config.json con las credenciales de S3:
{
"identities": [
{
"name": "analyst",
"credentials": [
{
"accessKey": "your_access_key_id",
"secretKey": "your_secret_access_key"
}
],
"actions": ["Admin", "Read", "Write", "List", "Tagging"]
}
]
}A continuación, inicie toda la pila de SeaweedFS en un contenedor; el indicador -bucket crea el bucket al iniciarse:
docker run -d --name seaweedfs -p 8333:8333 \
-v "$(pwd)/s3config.json:/etc/seaweedfs/s3config.json" \
chrislusf/seaweedfs:latest \
mini -dir=/data -s3.config=/etc/seaweedfs/s3config.json -bucket=clickhouse -admin.port=12646-admin.port=12646 mantiene el puerto gRPC de administración que SeaweedFS deriva de él por debajo del rango de puertos efímeros de Linux, donde, de lo contrario, una conexión de inicio podría ocuparlo antes.
El endpoint de S3 está a la escucha en el puerto 8333; espere a que responda antes de continuar:
until curl -s -o /dev/null http://localhost:8333; do sleep 1; doneSe pueden crear más buckets en cualquier momento con echo "s3.bucket.create -name mybucket" | docker exec -i seaweedfs weed shell.
De forma predeterminada, una escritura se confirma cuando se entrega al sistema operativo. Para sincronizar cada escritura con el disco mediante fsync antes de confirmarla, habilite fsync en el bucket:
echo "fs.configure -locationPrefix=/buckets/clickhouse/ -fsync -apply" | \
docker exec -i seaweedfs weed shellMergeTree respaldado por S3
La configuración de MergeTree respaldado por S3 es compatible con cambios menores:
<clickhouse>
<storage_configuration>
<disks>
<s3>
<type>s3</type>
<endpoint>http://seaweedfs:8333/clickhouse/tables/</endpoint>
<access_key_id>your_access_key_id</access_key_id>
<secret_access_key>your_secret_access_key</secret_access_key>
<region></region>
<metadata_path>/var/lib/clickhouse/disks/s3/</metadata_path>
</s3>
<s3_cache>
<type>cache</type>
<disk>s3</disk>
<path>/var/lib/clickhouse/disks/s3_cache/</path>
<max_size>10Gi</max_size>
</s3_cache>
</disks>
<policies>
<s3_main>
<volumes>
<main>
<disk>s3</disk>
</main>
</volumes>
</s3_main>
</policies>
</storage_configuration>
</clickhouse>A continuación, las tablas almacenan sus datos en SeaweedFS mediante la política de almacenamiento:
CREATE TABLE trips (id UInt64, rider String, fare Float64)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';Para mantener una caché local de los datos de acceso frecuente, cree la tabla con SETTINGS disk = 's3_cache'; el disco de caché definido anteriormente se superpone al disco S3.
La función de tabla s3
La función de tabla s3 lee y escribe objetos en el mismo endpoint:
INSERT INTO FUNCTION s3(
'http://seaweedfs:8333/clickhouse/sample/trips.parquet',
'your_access_key_id',
'your_secret_access_key',
'Parquet'
)
SELECT number AS id, concat('rider_', toString(number % 10)) AS rider, number * 1.5 AS fare
FROM numbers(1000);
SELECT count()
FROM s3(
'http://seaweedfs:8333/clickhouse/sample/*.parquet',
'your_access_key_id',
'your_secret_access_key',
'Parquet'
);Los patrones glob permiten leer varios objetos.
Copia de seguridad y restauración
BACKUP y RESTORE aceptan un endpoint de SeaweedFS como destino S3:
BACKUP TABLE trips
TO S3('http://seaweedfs:8333/clickhouse/backups/trips1', 'your_access_key_id', 'your_secret_access_key');
--- DROP TABLE trips;
RESTORE TABLE trips
FROM S3('http://seaweedfs:8333/clickhouse/backups/trips1', 'your_access_key_id', 'your_secret_access_key');