Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Utiliser SeaweedFS

Non pris en charge par ClickHouse Cloud

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; done

Vous 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 shell

MergeTree 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');
Navigation