ClickHouse の s3 テーブル関数と S3 ディスクタイプは、S3 互換ゲートウェイを備えたオープンソースの分散オブジェクトストアである SeaweedFS に対応しています。SeaweedFS は path-style リクエストをネイティブに処理するため、セルフホストのストアでもワイルドカード DNS は不要です。SeaweedFS は Iceberg テーブルもサポートしています。テーブルバケットにはテーブルデータが Parquet ファイルとして保存され、組み込みの Iceberg REST カタログがテーブルメタデータを提供します。同じエンドポイント経由でこれらをクエリする方法については、SeaweedFS カタログガイドを参照してください。
SeaweedFS 4.42 以降を使用してください。以前のバージョンでは、空であるため親フォルダが削除されている間に書き込みがコミットされたオブジェクトが削除されることがあり、書き込みが成功した直後に Object ... suddenly disappeared と表示されます。
SeaweedFS をローカルで実行する
ローカルでテストするには、S3 認証情報を含む s3config.json ファイルを作成します。
{
"identities": [
{
"name": "analyst",
"credentials": [
{
"accessKey": "your_access_key_id",
"secretKey": "your_secret_access_key"
}
],
"actions": ["Admin", "Read", "Write", "List", "Tagging"]
}
]
}次に、SeaweedFS スタック全体を単一のコンテナーで起動します。-bucket フラグを指定すると、起動時にバケットが作成されます。
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 を指定すると、SeaweedFS がそこから導出する管理 gRPC ポートが Linux のエフェメラルポート範囲未満に保たれるため、起動時の接続に先に確保されることを防げます。
S3 エンドポイントはポート 8333 で待ち受けます。応答するまで待ってから続行してください。
until curl -s -o /dev/null http://localhost:8333; do sleep 1; doneecho "s3.bucket.create -name mybucket" | docker exec -i seaweedfs weed shell を使用して、いつでもバケットを追加で作成できます。
デフォルトでは、書き込みはオペレーティングシステムに渡された時点で確認応答されます。確認応答前にすべての書き込みをディスクに fsync するには、バケットで fsync を有効にします。
echo "fs.configure -locationPrefix=/buckets/clickhouse/ -fsync -apply" | \
docker exec -i seaweedfs weed shellS3 バックエンドの MergeTree
S3 バックエンドの MergeTree 構成は、軽微な変更を加えることで互換性があります。
<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>テーブルは、ストレージポリシーを通じてデータを SeaweedFS に配置します。
CREATE TABLE trips (id UInt64, rider String, fare Float64)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';頻繁に読み取るデータのローカルキャッシュを保持するには、代わりに SETTINGS disk = 's3_cache' を指定してテーブルを作成します。上で定義したキャッシュディスクは、S3 ディスクをラップしています。
s3 テーブル関数
s3 テーブル関数は、同じエンドポイントに対してオブジェクトの読み取りと書き込みを行います。
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'
);glob パターンを使用すると、複数のオブジェクトを読み取ることができます。
バックアップと復元
BACKUP と RESTORE では、S3 宛先として SeaweedFS エンドポイントを指定できます。
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');