> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse で SeaweedFS の S3 互換オブジェクトストレージを使用する

# SeaweedFS の使用

export const CloudNotSupportedBadge = () => {
  return <a href="https://clickhouse.com/docs/products/cloud/guides/cloud-compatibility#list-of-unsupported-features" className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            ClickHouse Cloud ではサポートされていません
        </a>;
};

<CloudNotSupportedBadge />

<Note>
  このページは [ClickHouse Cloud](https://clickhouse.com/cloud) には適用されません。ここで説明している機能は ClickHouse Cloud サービスではご利用いただけません。
  詳しくは、ClickHouse の [Cloud Compatibility](/docs/ja/products/cloud/guides/cloud-compatibility) ガイドを参照してください。
</Note>

ClickHouse の `s3` テーブル関数と `S3` ディスクタイプは、S3 互換ゲートウェイを備えたオープンソースの分散オブジェクトストアである [SeaweedFS](https://github.com/seaweedfs/seaweedfs) に対応しています。SeaweedFS は path-style リクエストをネイティブに処理するため、セルフホストのストアでもワイルドカード DNS は不要です。SeaweedFS は Iceberg テーブルもサポートしています。テーブルバケットにはテーブルデータが Parquet ファイルとして保存され、組み込みの Iceberg REST カタログがテーブルメタデータを提供します。同じエンドポイント経由でこれらをクエリする方法については、[SeaweedFS カタログガイド](/docs/ja/guides/use-cases/data-warehousing/seaweedfs-catalog)を参照してください。

[SeaweedFS 4.42](https://github.com/seaweedfs/seaweedfs/releases/tag/4.42) 以降を使用してください。以前のバージョンでは、空であるため親フォルダが削除されている間に書き込みがコミットされたオブジェクトが削除されることがあり、書き込みが成功した直後に `Object ... suddenly disappeared` と表示されます。

<div id="running-seaweedfs-locally">
  ## SeaweedFS をローカルで実行する
</div>

ローカルでテストするには、S3 認証情報を含む `s3config.json` ファイルを作成します。

```json theme={null}
{
  "identities": [
    {
      "name": "analyst",
      "credentials": [
        {
          "accessKey": "your_access_key_id",
          "secretKey": "your_secret_access_key"
        }
      ],
      "actions": ["Admin", "Read", "Write", "List", "Tagging"]
    }
  ]
}
```

次に、SeaweedFS スタック全体を単一のコンテナーで起動します。`-bucket` フラグを指定すると、起動時にバケットが作成されます。

```bash theme={null}
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
```

S3 エンドポイントはポート 8333 で待ち受けます。応答するまで待ってから続行してください。

```bash theme={null}
until curl -s -o /dev/null http://localhost:8333; do sleep 1; done
```

`echo "s3.bucket.create -name mybucket" | docker exec -i seaweedfs weed shell` を使用して、いつでもバケットを追加で作成できます。

デフォルトでは、書き込みはオペレーティングシステムに渡された時点で確認応答されます。確認応答前にすべての書き込みをディスクに fsync するには、バケットで fsync を有効にします。

```bash theme={null}
echo "fs.configure -locationPrefix=/buckets/clickhouse/ -fsync -apply" | \
  docker exec -i seaweedfs weed shell
```

<div id="s3-backed-mergetree">
  ## S3 バックエンドの MergeTree
</div>

S3 バックエンドの MergeTree 構成は、軽微な変更を加えることで互換性があります。

```xml theme={null}
<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>
```

<Tip>
  エンドポイントには、バケット名 (`clickhouse`) と、それに続くテーブルデータ用のパスプレフィックス (`tables/`) が含まれます。SeaweedFS ではリージョンは不要なため、タグは空のままで構いません。`seaweedfs` は、S3 ゲートウェイを実行しているホストに置き換えてください。
</Tip>

テーブルは、ストレージポリシーを通じてデータを SeaweedFS に配置します。

```sql theme={null}
CREATE TABLE trips (id UInt64, rider String, fare Float64)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';
```

頻繁に読み取るデータのローカルキャッシュを保持するには、代わりに `SETTINGS disk = 's3_cache'` を指定してテーブルを作成します。上で定義したキャッシュディスクは、S3 ディスクをラップしています。

<div id="the-s3-table-function">
  ## s3 テーブル関数
</div>

`s3` テーブル関数は、同じエンドポイントに対してオブジェクトの読み取りと書き込みを行います。

```sql theme={null}
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 パターンを使用すると、複数のオブジェクトを読み取ることができます。

<div id="backup-and-restore">
  ## バックアップと復元
</div>

`BACKUP` と `RESTORE` では、S3 宛先として SeaweedFS エンドポイントを指定できます。

```sql theme={null}
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');
```
