サービスでのブロックストレージボリュームの使用¶
Snowflake は、コンテナ化アプリケーション用に、Snowflake内部ステージ、ローカルストレージ、メモリストレージボリューム、ブロックストレージボリュームのストレージボリュームタイプをサポートしています。
サービス仕様におけるブロックストレージの指定¶
ブロックストレージを使用するサービス(ジョブサービスを含む)を作成するには、以下のようにサービス仕様書に必要な構成を記述します。
ステップ1: ブロックストレージ量を定義する¶
spec.volumes フィールドを指定して、作成するブロックストレージボリュームを定義します。
spec:
containers:
...
volumes:
- name: <name>
source: block
size: <size-in-Gi>
blockConfig: # optional
initialContents:
fromSnapshot: <snapshot-name>
iops: <number-of-operations>
throughput: <MiB-per-second>
encryption: SNOWFLAKE_SSE | SNOWFLAKE_FULL
以下のフィールドは必須です。
name: ボリュームの名前。source: ボリュームのタイプ。ブロックストレージボリュームの場合、値はblockです。size: ブロックストレージボリュームのストレージ容量(バイト単位)。値は常に整数でなければならず、Gi単位のサフィックスを使って指定します。たとえば、5Giは5*1024*1024*1024バイトを意味します。クラウドプロバイダーのサイズ値の範囲:1Gito65536Gifor AWS.1Gito16384Gifor Azure.Google Cloudに対して
4Giを16384Giに。
以下はオプションのフィールドです。
blockConfig.initialContents.fromSnapshot: ブロックボリュームを初期化するために、別のボリュームの以前に取得したスナップショットを指定します。スナップショット名には、 完全修飾オブジェクト識別子、例えばTUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOTを使用することができます。また、スナップショット名は、データベースとサービスのスキーマに関連して解決されます。つまり、TUTORIAL_DB.DATA_SCHEMAでサービスを作成した場合、fromSnapshot: MY_SNAPSHOTはfromSnapshot: TUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOTと同等です。次の点に注意してください。
スナップショットは、ボリュームの作成に使用する前に CREATED の状態になっている必要があります。そうでないと、サービスの作成は失敗します。
スナップショットの暗号化タイプは、作成されるボリュームの暗号化タイプと一致する必要があります。
スナップショットのステータスと暗号化タイプを取得するには、 DESCRIBE SNAPSHOT コマンドを使用します。
blockConfig.iops:1秒間にサポートされる入出力操作のピーク数を指定します。なお、1回あたりのデータサイズの上限は256 KiB です。For AWS: The supported range is 3000-80000, with a default of 3000.
Azureの場合: 対応範囲は3000~80000で、デフォルトは3000です。
Google Cloudの場合:
Google Cloud CPU instances: The supported range is 2000-160000, with the following defaults:
4 Giディスクサイズの場合、2000 IOPS
5 Giディスクサイズの場合、2500 IOPS
その他すべてのディスクサイズの場合、3000 IOPS
Google Cloud GPU インスタンス:Snowflakeでは、スループットのみを指定することを推奨しています。Google Cloudの GPU インスタンスの場合、
blockConfig.iopsは16 *blockConfig.throughputである必要があります。
blockConfig.throughput: ボリュームにプロビジョニングするピークスループットを MiB/秒で指定します。For AWS: The supported range is 125 - 2000, with a default of 125.
Azureの場合: 対応範囲は125~1200で、デフォルトは125です。
Google Cloudの場合:
Google Cloud CPU インスタンス: 対応範囲は140~2400で、デフォルトは140です。
Google Cloud GPU インスタンス: 対応範囲は400~1,200,000で、デフォルトは400ですが、ボリュームサイズの GB あたり0.12を下回ることはありません。
blockConfig.encryption: ボリュームの暗号化タイプを指定:SNOWFLAKE_SSEまたはSNOWFLAKE_FULL。詳細については、 暗号化のサポート をご参照ください。
ステップ2:コンテナ内の量をマウントする場所を指定する¶
spec.volumes フィールドを追加してブロックストレージ量を定義した後、次の例に示すように spec.containers.volumeMounts フィールドを使用して、アプリケーションコンテナの量をマウントする場所を記述します。
spec:
containers:
- name: ...
image: ...
volumeMounts:
- name: <volume-name>
mountPath: <absolute_directory_path>
例¶
10Giサイズのブロックストレージ量がマウントされたサービスを作成する量はメインコンテナ内のパス
/opt/block/pathにマウントされます。CREATE SERVICE my_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest volumeMounts: - name: block-vol mountPath: /opt/block/path readinessProbe: port: 8080 path: /healthcheck endpoints: - name: echoendpoint port: 8080 public: true volumes: - name: block-vol source: block size: 10Gi $$;
スナップショットから初期化されたブロックストレージ量でサービスを作成します。
CREATE SERVICE new_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:tutorial volumeMounts: - name: vol-from-snapshot mountPath: /opt/block/path readinessProbe: port: 8080 path: /healthcheck endpoints: - name: echoendpoint port: 8080 public: true volumes: - name: vol-from-snapshot source: block size: 50Gi blockConfig: initialContents: fromSnapshot: BACKUP_DB.SNAPSHOTS.MY_SNAPSHOT $$
ステップバイステップの手順の例については、 チュートリアル5:ブロックストレージボリュームがマウントされたサービスを作成する をご参照ください。このチュートリアルでは、マウントされたブロックストレージ量でサービスを作成する方法を説明します。
IOPS とスループットについて¶
サービス IO のパフォーマンスが期待に満たず、サービスがブロック量 IO またはスループットの影響を受けている場合、 IOPS またはスループットの増加を検討することができます。現在の実装では、そのような変更はサービスを再作成する必要があります。
これらの 利用可能なプラットフォーム・メトリクス を確認することで、サービスがブロック・ストレージ上でボトルネックになっているかどうかを特定することができます。
container.cpu.usage
volume.read.iops
volume.write.iops
volume.read.throughput
volume.write.throughput
クラウドプロバイダーによっては、以下の考慮事項が適用されます。
AWS のiopsとスループットの構成:
The maximum IOPS that can be configured is 500 IOPS per GiB of volume size, to a maximum of 80,000 IOPS. For example, the maximum IOPS of a 10 GiB volume can be 500 * 10 = 5000. Accordingly, note that the maximum IOPS of 80,000 can only be configured if your volume is 160 GiB or larger.
The maximum throughput that can be configured is 1 MiB/second for every 4 IOPS, to a maximum of 2000 MiBs/second. For example, with the default 3000 IOPS you can configure throughput up to 750 MiB/second (3000/4=750).
Azureのiopsとスループットの構成:
ボリュームサイズが6 GB の後、サポートされる IOPS の数は、6 GB (ディスクタイプ)を超える GB ごとに500ずつ増加します。10GB ボリュームの最大 IOPS は500 * 4 + 3000 = 5000です。したがって、最大80,000の IOPS は、ボリュームが160 GiB 以上の場合にのみ設定できることに注意してください。
6 GB 以降、設定可能な最大スループットは、IOPS 毎に0.25 MiB/秒、最大1200 MiBs/秒です。例えば、デフォルトの3000 IOPS では、最大750 MiB/秒(3000*0.25=750)のスループットを設定できます。
Google Cloudのiopsとスループットの構成:
CPU インスタンスの場合:
IOPS は、ボリュームサイズ1 Giあたり最大500 IOPS まで構成可能で、最大160,000 IOPS です。例えば、10 Giのボリュームは最大5,000 IOPS (500 IOPS * 10 Gi)を達成することができます。最大160,000 IOPS を達成するには、320 Gi以上のボリュームサイズが必要です。
最大スループットは2400 MiB/秒の構成が可能で、4 IOPS ごとに1 MiB/秒のレートとなります。例えば、3000 IOPS の場合、最大750 MiB/秒のスループットが可能になります(3000 / 4 = 750)。
GPU インスタンスの場合:
IOPS はスループットとは独立してセットすることはできません。IOPS は16にスループット値を掛けて計算されます。したがって、スループットを指定すると、自動的に IOPS が決まります。GPU インスタンスで使用するディスクには、 IOPS の構成はお勧めしません。
最小スループットを構成する必要があります。少なくとも400 MiB/秒、またはボリュームサイズ GiB ごとに0.12 MiB/秒のいずれか高い方でなければなりません。
構成可能なスループットレートは、最大1,200,000 MiB/秒まで、ボリュームサイズ GiB あたり1600 MiB/秒です。一例として、10 GiB のボリュームで最大スループット16,000 MiB/秒(1600 * 10)を達成できます。なお、上限の1,200,000 MiB/秒は、750 GiB 以上のボリュームでのみ達成可能です。
削除時のスナップショット¶
以下のコマンドは、サービスに関連付けられたブロックボリュームを削除します。
DROP SERVICE <service-name> FORCE
ALTER COMPUTE POOL <compute-pool-name> STOP ALL
ALTER SERVICE <service-name> RESTORE VOLUME <volume-name> FROM SNAPSHOT
The snapshotOnDelete option defaults to true for services and false for jobs. When the value is true, Snowflake takes a snapshot of the volume before deletion, to protect you from accidental data loss. You add this option in the service specification as part of the blockConfig configuration.
他のスナップショットとは異なり、これらのスナップショットは一定期間が経過すると自動的に削除されます。スナップショットの保持期間はデフォルトで7日間で、 snapshotDeleteAfter フィールドを使用して構成できます。
Snowflakeは、次の形式でスナップショット名を割り当てます。 SYS_BACKUP_ON_DELETE<string>_<timestamp>
アクセス制御の要件¶
既存のスナップショット(fromSnapshot は仕様にあります)を使用してボリュームを初期化する場合は、サービスの所有者ロールがスナップショットで USAGE 権限を持っている必要があります。
サービスの所有者ロールには、スナップショットを含むデータベースとスキーマに対する USAGE 権限も必要です。
スナップショットの管理¶
ブロックストレージボリュームのスナップショットを取り、後でそのバックアップを以下のように使用できます。
スナップショットバックアップを使用して、既存のブロックストレージボリュームを復元します。
スナップショットバックアップは、新しいサービスを作成する際に、新しいブロックストレージボリュームを初期化するためのシードデータとして使用します。
スナップショットを取る前に、すべてのアップデートがディスクにフラッシュされていることを確認する必要があります。
Snowflakeには、スナップショットを作成および管理するための以下のコマンドがあります。
In addition, to restore a snapshot on an existing block storage volume, you can execute the ALTER SERVICE ... RESTORE VOLUME command. Note that you need to suspend the service before you can restore a snapshot. After restoring a volume, the service is automatically resumed.
ブロックストレージコスト¶
クレジット消費の詳細については、 Snowflake Service Consumption Table をご参照ください。
ブロックストレージボリュームがジョブサービスで使用されている場合、Snowflakeは、ジョブサービスがユーザーによって停止されるか、完了後にSnowflakeによってクリーンアップされた後、ブロックストレージコストの課金を停止します。
スナップショットがドロップされた後も、設定済みの データ保持期間 を通じて引き続き請求されます。デフォルトのデータ保持期間は1日です。
暗号化のサポート¶
ブロックストレージボリュームとスナップショットは、他のSnowflake管理ストレージでも使用されている同じ2つの暗号化モードをサポートしています。
SNOWFLAKE_SSE: サーバー側の暗号化のみ。これは、SnowflakeアカウントでTri-Secret-Secureを有効にしていないお客様のデフォルト構成です。
Snowflakeは、ブロックストレージボリュームとスナップショットにクラウドサービスプロバイダー(CSP)の暗号化を使用します。
SNOWFLAKE_FULL: ホスト上およびサーバー側の暗号化。これは、SnowflakeアカウントでTri-Secret-Secureが有効になっているお客様のデフォルト構成です。
データはまずクライアント(Snowpark Container Services ホスト)で暗号化されてから、 CSP に送信されストレージされます。各ボリュームは一意のボリュームキーで暗号化されます。同じキーは、そのボリュームから作成するスナップショットの暗号化にも使用されます。
Snowflakeはデータの暗号化を追加で実行するため、
SNOWFLAKE_FULLボリュームを使用するとパフォーマンスとリソース使用量に影響があります。SnowflakeはLinuxカーネルが提供する暗号化メカニズムを使用しているため、影響は大きくないはずです。パフォーマンスへの影響はワークロードに依存する可能性が高いため、サービスまたはジョブのボトルネックを特定するか、ボリュームのスループットを向上させるか、より強力なサーバーを提供することをお勧めします。Snowflakeのブロックストレージボリュームおよびスナップショットでは、キーのローテーションまたはキー更新はサポートされていません。ボリュームの暗号化キーを変更するには、新しいボリュームを作成し、スナップショットからデータをコピーします。
アカウントでTri-Secret Secureを有効にしているお客様の場合、お客様が管理するキーへのアクセスが取り消された場合でも、そのボリュームを使用して現在実行中のサービスでは、ボリュームのデータは引き続きご利用いただけます。お客様が管理するキーへのアクセスを取り消す際には、これらのサービスを停止し、データが利用できないようにすることをお勧めします。また、キーを取り消すと、暗号化されたボリュームのサービスは開始できなくなります。
Volume snapshots retain the encryption type of their source volume. For example, a snapshot of a SNOWFLAKE_SSE volume also uses SNOWFLAKE_SSE encryption. When a snapshot is used as the initial content of a volume or with the ALTER SERVICE ... RESTORE VOLUME command, its encryption type must match the volume's encryption type. Otherwise, the command fails.
アカウントのすべてのSnowpark Container Servicesブロックストレージボリュームとスナップショットに対して SNOWFLAKE_FULL 暗号化タイプを義務付けることができます。これには、アカウントの ENABLE_SPCS_BLOCK_STORAGE_SNOWFLAKE_FULL_ENCRYPTION_ENFORCEMENT パラメーターを TRUE に設定します。
このパラメーターを有効にした後は、SNOWFLAKE_SSE 暗号化タイプでのブロックストレージボリュームとスナップショットの作成は許可されません。
例¶
例については、 チュートリアル をご参照ください。このチュートリアルでは、ブロックストレージボリュームがマウントされたサービスを作成するための手順を順を追って説明します。
ガイドラインと制約¶
ブロックストレージボリュームを使用するサービスには、以下の制限が適用されます。
一般的な制限これらの制限に関する問題が発生した場合は、担当者にお問い合わせください。
1サービスあたりのブロックストレージボリュームの最大数は3です。
Snowflakeアカウントあたりのブロックストレージボリュームの最大数は100です。
次のテーブルは、ノードのインスタンスタイプに応じて、コンピューティングプールノードごとにマウントできるブロックストレージボリュームの最大数をリストしたものです。Snowflakeは、ブロックストレージボリュームを使用するサービスインスタンスがこれらの制限に従って配置されるようにします。その結果、 PENDING 状態のサービスが追加リソースを待つことになるかもしれません。
インスタンスファミリー
AWS 制限
Azure制限
GCP 制限
CPU_X64_XS
22
3
14
CPU_X64_S
22
8
14
CPU_X64_M
22
16
14
CPU_X64_SL
27
31
14
CPU_X64_L
22
32
14
HIGHMEM_X64_S
22
16
14
HIGHMEM_X64_M
22
32
14
HIGHMEM_X64_SL
なし
32
14
HIGHMEM_X64_L
22
なし
なし
GPU_NV_S (AWS のみ)
22
なし
なし
GPU_NV_M (AWS のみ)
21
なし
なし
GPU_NV_L (AWS のみ)
14
なし
なし
GPU_NV_XS (Azureのみ)
なし
8
なし
GPU_NV_SM (Azureのみ)
なし
32
なし
GPU_NV_2M (Azureのみ)
なし
32
なし
GPU_NV_3M (Azureのみ)
なし
16
なし
GPU_NV_SL (Azureのみ)
なし
32
なし
GPU_GCP_NV_L4_1_24G(Google Cloudのみ)
なし
なし
14
GPU_GCP_NV_L4_4_24G(Google Cloudのみ)
なし
なし
14
GPU_GCP_NV_A100_8_40G(Google Cloudのみ)
なし
なし
14
Snowflakeアカウントごとに許可されるスナップショットの最大数は100です。
サービスの最小インスタンス数と最大インスタンス数は同じでなければなりません。
サービスが作成された後、以下が適用されます。
サービスがブロック・ストレージ・ボリュームを使用している場合、 ALTER SERVICE ... SET ...コマンドを使用してサービスインスタンス数を変更することはできません。
ブロックストレージボリュームの
size、iops、throughput、またはencryptionフィールドは変更できません。新しいブロックストレージボリュームを追加したり、既存のブロックストレージボリュームを削除することはできません。
Block storage volumes are preserved if a service is upgraded, or suspended and resumed. When a service is suspended, you continue to pay for the volume because it is preserved. After you upgrade or resume a service, Snowflake attaches each block storage volume to the same service instance ID as before.
Block storage volumes are deleted if the service is dropped. To preserve data in the volumes, take snapshots of the volumes. You can use the snapshots later to initialize new volumes.
