La fonction de table s3 et le type de disque S3 de ClickHouse sont compatibles avec SeaweedFS, un stockage d’objets distribué open source doté d’une passerelle compatible S3. SeaweedFS traite nativement les requêtes de type chemin, de sorte qu’un stockage auto-hébergé fonctionne sans DNS générique. SeaweedFS prend également en charge les tables Iceberg : ses buckets de tables stockent les données sous forme de fichiers Parquet, et le catalogue REST Iceberg intégré fournit les métadonnées des tables. Consultez le guide du catalogue SeaweedFS pour les interroger via le même endpoint.
Utilisez SeaweedFS 4.42 ou une version ultérieure. Les versions antérieures peuvent supprimer un objet dont l’écriture est validée alors que son dossier parent est supprimé car considéré comme vide, ce qui se manifeste par Object ... suddenly disappeared juste après une écriture réussie.
Exécuter SeaweedFS en local
Pour effectuer des tests en local, créez un fichier s3config.json contenant les identifiants S3 :
{
"identities": [
{
"name": "analyst",
"credentials": [
{
"accessKey": "your_access_key_id",
"secretKey": "your_secret_access_key"
}
],
"actions": ["Admin", "Read", "Write", "List", "Tagging"]
}
]
}Démarrez ensuite l’ensemble de la stack SeaweedFS dans un conteneur : le flag -bucket crée le bucket au démarrage :
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 garantit que le port gRPC d’administration que SeaweedFS en dérive reste inférieur à la plage des ports éphémères Linux, où une connexion au démarrage pourrait sinon s’en emparer en premier.
Le endpoint S3 écoute sur le port 8333 ; attendez qu’il réponde avant de continuer :
until curl -s -o /dev/null http://localhost:8333; do sleep 1; doneVous pouvez créer d’autres buckets à tout moment avec echo "s3.bucket.create -name mybucket" | docker exec -i seaweedfs weed shell.
Par défaut, une écriture est confirmée dès qu’elle est transmise au système d’exploitation. Pour synchroniser chaque écriture sur le disque avec fsync avant de la confirmer, activez fsync sur le bucket :
echo "fs.configure -locationPrefix=/buckets/clickhouse/ -fsync -apply" | \
docker exec -i seaweedfs weed shellMergeTree adossé à S3
La configuration de MergeTree adossée à S3 est compatible, moyennant quelques modifications mineures :
<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>Les tables stockent ensuite leurs données sur SeaweedFS à l’aide de la storage policy :
CREATE TABLE trips (id UInt64, rider String, fare Float64)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';Pour conserver localement en cache les données fréquemment lues, créez plutôt la table avec SETTINGS disk = 's3_cache' : le disque de cache défini ci-dessus repose sur le disque S3.
La fonction de table s3
La fonction de table s3 lit et écrit des objets via le même 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'
);Les motifs glob permettent de lire plusieurs objets.
Sauvegarde et restauration
BACKUP et RESTORE acceptent un endpoint SeaweedFS comme destination 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');