このドキュメントでは、Spanner Omni デプロイを以前のバージョンから新しいバージョンにアップグレードする方法について説明します。
Spanner Omni は、非同期の段階的ロールアウト状態マシンを使用して、サービスの中断のない安全なアップグレードを実現します。段階的にアップグレードすると、次のことが可能になります。
- データベース スキーマの更新を適用する。
- ローリング再起動中にバイナリの互換性を確認します。
- 最終処理前にエラーが検出された場合は、以前のバージョンにロールバックします。
アップグレード ワークフロー
Spanner Omni のアップグレード プロセスは、複数の連続したフェーズで構成されます。
- スキーマ フェーズ: ターゲット バイナリ バージョンを使用して内部データベース スキーマの移行を実行し、デプロイを準備します。スキーマの移行はロールバックできませんが、以前のバイナリ バージョンとの下位互換性があります。
- バイナリ フェーズ: ローリング再起動を使用して、デプロイ内のすべてのサーバーでサーバー バイナリまたはコンテナ イメージを更新します。エラーが検出された場合は、ファイナライズが開始される前の任意の時点で、バイナリまたはコンテナ イメージを以前のバージョンにロールバックできます。
- 機能の有効化フェーズ: バージョン互換性のある機能を有効にします。すべてのサーバーでバイナリをアップグレードした後に開始されます。アップグレードにバージョン互換の機能が含まれていない場合、このフェーズは適用されないことがあります。また、機能が相互に依存している場合は、複数回のラウンドが必要になることがあります。ロールバックをサポートするオプションのフェーズでは、Spanner Omni CLI を使用してロールバックを開始できます。
- ファイナライズ フェーズ: ロールアウトを完了し、ターゲット バージョンを確定します。ファイナライズ フェーズが開始されると、ロールバックはできません。
始める前に
Spanner Omni デプロイをアップグレードする前に、次の前提条件を満たしていることを確認してください。
- Spanner Omni のデプロイが実行されている。詳細については、Kubernetes にデプロイを作成するまたは VM にデプロイを作成するをご覧ください。
- Spanner Omni CLI をダウンロードしてインストールした。
- CLI コマンドを実行するマシンからすべての Spanner Omni 内部ポート(TCP 15000 ~ 15027)へのネットワーク アクセス権があるか、デプロイ エンドポイントへのネットワーク アクセス権がある。
- デプロイで Transport Layer Security(TLS)または相互 TLS(mTLS)暗号化を使用している場合は、
BASE_DIR/tlsの下のベース ディレクトリに有効な証明書があるか、クラスタにマウントされていることを確認します。 - ターゲット リリースを特定しました。
- VM デプロイの場合: ターゲット リリース パッケージ
spanner-omni-server-TARGET_VERSION.tar.gzをダウンロードします。 - Helm と Kubernetes のデプロイの場合: Artifact Registry でターゲット コンテナ イメージ(
us-docker.pkg.dev/spanner-omni/images/spanner-omni:TARGET_VERSIONなど)を特定します。
- VM デプロイの場合: ターゲット リリース パッケージ
ステップ 1: スキーマのアップグレードを準備する
アップグレードを開始するには、ターゲット バージョンのロールアウトを準備します。このフェーズでは、既存のサーバーがトラフィックの処理を継続している間に、Spanner Omni が内部データベース スキーマの移行を実行します。
デプロイ環境のタブを選択します。
VM
VM デプロイでは、ターゲット リリース パッケージをダウンロードして解凍し、解凍した Spanner Omni CLI を使用してロールアウトの準備を開始します。
すべての Spanner Omni 内部ポート(TCP 15000 ~ 15027)にネットワーク アクセスできるデプロイ内のサーバーにログインします。
ターゲット リリース パッケージをダウンロードして解凍します。
tar -xzf spanner-omni-server-TARGET_VERSION.tar.gz -C EXTRACT_DIR次のように置き換えます。
TARGET_VERSION: アップグレード先のターゲット バージョン(2026.r4-ltsなど)。EXTRACT_DIR: リリース パッケージを抽出するディレクトリ(例:/tmp/target_spanner/)。
抽出した CLI から
rollouts prepareコマンドを実行して、ロールアウトの準備を開始します。EXTRACT_DIR/bin/spanner deployment rollouts prepare \ --target-server-binary=EXTRACT_DIR/bin/spanner_server \ --root-server=ROOT_SERVERS \ --base-dir=BASE_DIR次のように置き換えます。
EXTRACT_DIR: ターゲットのbin/spannerCLI とbin/spanner_serverバイナリを含む抽出ディレクトリ。ROOT_SERVERS: 1 つのルートサーバー エンドポイント、または複数のルートサーバーのカンマ区切りのリスト(例:localhost:15000、server1:15000,server2:15000,server3:15000)。BASE_DIR: Spanner Omni のベース ディレクトリ(例:/spanner)。- デプロイで TLS または mTLS 暗号化を使用する場合は、有効な証明書を指す
--ca-certificate-file=CA_CERT_FILEと--client-certificate-directory=CERT_DIRを追加します。
Helm
Helm デプロイでは、スキーマの準備はマルチサーバー デプロイとシングルサーバー デプロイのどちらを実行するかによって異なります。
マルチサーバー デプロイ(高可用性 / 本番環境): Helm がスキーマの準備を自動的に処理します。ステップ 3: バイナリまたはコンテナ イメージを更新するで
helm upgradeを実行すると、Helm チャートはspanner-prepare-for-upgradeアップグレード前フックジョブをトリガーして、StatefulSet を更新する前にスキーマ移行を実行します。ステップ 2: アクティブなロールアウトの状態を確認するに直接進みます。単一サーバーのデプロイ(
deployment.singleServer=true): 単一サーバーモードでは、内部サービスがループバック インターフェース(127.0.0.1)に厳密にバインドされるため、ネットワーク ジョブはこれらのサービスにアクセスできません。ターゲット コンテナ イメージを含むエフェメラル デバッグ コンテナを使用して、実行中の Pod 内でスキーマ移行をローカルで実行します。kubectl debug pod/POD_NAME -n NAMESPACE \ --image=us-docker.pkg.dev/spanner-omni/images/spanner-omni:TARGET_VERSION \ --container=upgrade-prepare -i \ -- /google/spanner/bin/spanner_server prepare_for_upgrade --root_server=127.0.0.1次のように置き換えます。
POD_NAME: サーバー Pod の名前(例:spanner-a-0)。NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。TARGET_VERSION: アップグレード先のターゲット バージョン(2026.r4-ltsなど)。
スタンドアロン Kubernetes
Helm を使用せずに Kubernetes に Spanner Omni をデプロイする場合は、スタンドアロンの Kubernetes バッチジョブを実行して、ターゲット イメージを使用してアクティブなルートサーバーに対してスキーマ移行を実行します。
次のジョブ マニフェストを含む
spanner-prepare-upgrade.yamlという名前のファイルを作成します。apiVersion: batch/v1 kind: Job metadata: namespace: NAMESPACE name: spanner-prepare-for-upgrade spec: # Fail fast on the first error to stop the rollout immediately. backoffLimit: 0 template: metadata: namespace: NAMESPACE spec: restartPolicy: Never containers: - name: spanner-upgrade image: us-docker.pkg.dev/spanner-omni/images/spanner-omni:TARGET_VERSION command: ["/google/spanner/bin/spanner_server"] args: - "prepare_for_upgrade" - "--root_server=ROOT_SERVER_ENDPOINT" volumeMounts: - name: tls-certs mountPath: "/spanner/tls" readOnly: true - name: spanner-data mountPath: /spanner volumes: - name: tls-certs secret: secretName: tls-certs optional: true defaultMode: 256 - name: spanner-data emptyDir: {}次のように置き換えます。
NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。TARGET_VERSION: アップグレード先のターゲット バージョン(2026.r4-ltsなど)。ROOT_SERVER_ENDPOINT: アクティブなルートサーバー Pod のエンドポイント(例:spanner-a-0.pod.spanner-ns)。
マニフェストを適用して準備ジョブを実行します。
kubectl apply -f spanner-prepare-upgrade.yaml
ステップ 2: アクティブなロールアウトの状態を確認する
準備手順が完了したら、ロールアウトが作成されたことを確認し、フェーズのステータスを調べます。
アクティブなロールアウトを一覧表示して、ロールアウト ID を取得します。
spanner deployment rollouts list \ --deployment-endpoint=DEPLOYMENT_ENDPOINTDEPLOYMENT_ENDPOINTは、デプロイ内のサーバーのエンドポイント(localhost:15000、spanner-a-0.pod.spanner-ns:15000など)に置き換えます。出力は次のようになります。
NAME STATE TARGET_VERSION START_TIME END_TIME rollouts/1788942172101727 IN_PROGRESS 2026.r3-beta 2026-09-09T08:22:52.101727Z -ロールアウト フェーズの詳細なステータスを確認します。
spanner deployment rollouts describe ROLLOUT_ID \ --deployment-endpoint=DEPLOYMENT_ENDPOINT次のように置き換えます。
ROLLOUT_ID: 数値のロールアウト ID(例:1788942172101727)。DEPLOYMENT_ENDPOINT: デプロイ内のサーバーのエンドポイント。
出力は次のようになります。
name: rollouts/1788942172101727 phases: - name: rollouts/1788942172101727/phases/schema startTime: "2026-09-09T08:22:52.101727Z" state: SUCCEEDED - name: rollouts/1788942172101727/phases/binary startTime: "2026-09-09T08:23:29.585375Z" state: IN_PROGRESS - name: rollouts/1788942172101727/phases/finalize state: PENDING sourceVersion: 2026.r2-beta.3 startTime: "2026-09-09T08:22:52.101727Z" state: IN_PROGRESS targetVersion: 2026.r3-beta続行する前に、次のフェーズのステータスを確認します。
schema: 内部データベース スキーマの移行が完了したことを示すSUCCEEDEDが表示されます。binary:IN_PROGRESSが表示されます。これは、ロールアウト エンジンがバイナリ アップデートの準備ができていることを示します。finalize:PENDINGを示します。バイナリ フェーズの完了を待機しています。
ステップ 3: バイナリまたはコンテナ イメージを更新する
スキーマ フェーズが成功したら、デプロイ内のすべてのノードで実行中のサーバー バイナリまたはコンテナ イメージをターゲット バージョンに更新します。
デプロイ環境のタブを選択します。
VM
VM デプロイでは、ローリング再起動を使用して、すべての VM で spanner_server バイナリを更新します。
- 一度に 1 つの障害発生ドメインまたはゾーンを更新する: マルチゾーン デプロイでは、1 つのゾーンのサーバーを更新し、安定性を確認してから次のゾーンを更新します。これにより、Paxos コンセンサス グループがクォーラムを保持します。
- 段階的に再起動する: 継続的クエリの可用性を維持するために、同時に再起動するサーバーの割合を 5% 以下にします。
- サーバーの健全性を確認する: 次の障害発生ドメインを更新する前に、再起動されたすべてのサーバーが正常で、クラスタに再参加していることを確認します。
Helm
Helm デプロイでは、--reuse-values を渡すか、値ファイルを提供して、既存の構成値を保持しながら helm upgrade を実行します。
マルチサーバー デプロイ(本番環境 / HA):
helm upgrade spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \ --version CHART_VERSION \ -n NAMESPACE \ --reuse-values \ --set image.tag=TARGET_VERSION \ --timeout 30mHelm は、アップグレード前のフックを使用してフェーズ 1 を自動的に実行し、StatefulSet(
rollout.staggered: true)のゾーンごとのローリング アップデートを順番に開始します。単一サーバーのデプロイ(
deployment.singleServer=true):フェーズ 1 はすでにローカルで完了しているため、Helm がアップグレード前のフックジョブをスキップするように、
--set skipPrepareUpgrade=trueを明示的に渡します。helm upgrade spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \ --version CHART_VERSION \ -n NAMESPACE \ --reuse-values \ --set skipPrepareUpgrade=true \ --set image.tag=TARGET_VERSION \ --timeout 30m
次のように置き換えます。
CHART_VERSION: ターゲット Helm チャートのバージョン(例:1.0.0)。NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。TARGET_VERSION: ターゲット コンテナ イメージのタグ(2026.r4-ltsなど)。
スタンドアロン Kubernetes
Helm を使用しないカスタム Kubernetes デプロイでは、StatefulSet または Deployment 仕様のコンテナ イメージを TARGET_VERSION に更新します。
障害ドメイン全体でローリング アップデートを実行し、一度に 1 つのゾーンを更新して、同時に再起動する Pod の数を 5% 以下に抑えてクォーラムを維持します。
ステップ 4: バイナリ フェーズの進行状況を確認する
すべてのサーバーまたは Pod をターゲット バージョンに更新したら、バイナリ フェーズが正常に完了したことを確認します。
ロールアウト フェーズのステータスを確認します。
spanner deployment rollouts describe ROLLOUT_ID \
--deployment-endpoint=DEPLOYMENT_ENDPOINT
次のように置き換えます。
ROLLOUT_ID: 数値のロールアウト ID(例:1788942172101727)。DEPLOYMENT_ENDPOINT: デプロイ内のサーバーのエンドポイント。
出力は次のようになります。
name: rollouts/1788942172101727
phases:
- name: rollouts/1788942172101727/phases/schema
startTime: "2026-09-09T08:22:52.101727Z"
state: SUCCEEDED
- name: rollouts/1788942172101727/phases/binary
startTime: "2026-09-09T08:23:29.585375Z"
state: SUCCEEDED
- name: rollouts/1788942172101727/phases/finalize
state: PENDING
sourceVersion: 2026.r2-beta.3
startTime: "2026-09-09T08:22:52.101727Z"
state: IN_PROGRESS
targetVersion: 2026.r3-beta
binary フェーズのステータスが SUCCEEDED に変わったことを確認します。残りのすべてのフェーズが完了するまで、全体的なロールアウト状態は IN_PROGRESS のままです。phases/binary が SUCCEEDED に移行すると、デプロイは残りのフェーズに進む準備が整います。
ステップ 5: 残りのフェーズのスケジュールを設定して実行する
バイナリ フェーズが成功し、デプロイが安定していることを確認したら、finalize フェーズまでのロールアウトの残りのフェーズをスケジュールします。finalize フェーズ(ロールアウトの最後のフェーズ)では、デプロイ全体で新しいバージョンが確定されます。このコマンドは、--deployment-endpoint を指定することで、Spanner Omni サービスにネットワーク アクセスできる任意のマシンから実行できます。
PENDING 状態の残りのフェーズ(enable_features が存在する場合は
、次に finalize など)ごとに、次の手順を完了します。
フェーズのスケジュールを設定します。
spanner deployment rollouts phases schedule PHASE_NAME \ --rollout=ROLLOUT_ID \ --deployment-endpoint=DEPLOYMENT_ENDPOINT次のように置き換えます。
PHASE_NAME: スケジュールするフェーズの名前(finalize、enable_featuresなど)。ROLLOUT_ID: 数値のロールアウト ID(例:1788942172101727)。DEPLOYMENT_ENDPOINT: デプロイ内のサーバーのエンドポイント。
出力には、スケジュールされたフェーズが
IN_PROGRESSであることが示されます。name: rollouts/1788942172101727 phases: - name: rollouts/1788942172101727/phases/schema startTime: "2026-09-09T08:22:52.101727Z" state: SUCCEEDED - name: rollouts/1788942172101727/phases/binary startTime: "2026-09-09T08:23:29.585375Z" state: SUCCEEDED - name: rollouts/1788942172101727/phases/finalize state: IN_PROGRESS sourceVersion: 2026.r2-beta.3 startTime: "2026-09-09T08:22:52.101727Z" state: IN_PROGRESS targetVersion: 2026.r3-betaフェーズが成功するまで待って、ステータスを確認します。
spanner deployment rollouts describe ROLLOUT_ID \ --deployment-endpoint=DEPLOYMENT_ENDPOINTfinalizeまでのすべてのフェーズが完了するまで、残りのフェーズごとにこの手順を繰り返します。最終フェーズ(
finalize)が完了すると、すべてのフェーズと全体的なロールアウト状態がSUCCEEDEDに移行します。endTime: "2026-09-09T08:45:43.949702Z" name: rollouts/1788942172101727 phases: - name: rollouts/1788942172101727/phases/schema startTime: "2026-09-09T08:22:52.101727Z" state: SUCCEEDED - name: rollouts/1788942172101727/phases/binary startTime: "2026-09-09T08:23:29.585375Z" state: SUCCEEDED - name: rollouts/1788942172101727/phases/finalize startTime: "2026-09-09T08:45:43.898111Z" state: SUCCEEDED sourceVersion: 2026.r2-beta.3 startTime: "2026-09-09T08:22:52.101727Z" state: SUCCEEDED targetVersion: 2026.r3-betaロールアウト リストで完了ステータスを確認します。
spanner deployment rollouts list \ --deployment-endpoint=DEPLOYMENT_ENDPOINT出力で、ロールアウトが完了したことを確認します。
NAME STATE TARGET_VERSION START_TIME END_TIME rollouts/1788942172101727 SUCCEEDED 2026.r3-beta 2026-09-09T08:22:52.101727Z 2026-09-09T08:45:43.949702Z
アップグレードをロールバックする
アップグレード中に問題が発生した場合、アップグレードをロールバックできるかどうかは、現在のロールアウト フェーズによって異なります。
- スキーマ フェーズ: ロールバックできません。準備中に適用される内部データベース スキーマの移行は前方のみであり、元に戻すことはできません。ただし、スキーマ移行はソース バージョンと下位互換性があるため、以前のサーバー バイナリは引き続き正常に動作します。
- バイナリ フェーズ: 最終処理が開始される前であれば、いつでも以前のバージョンにロールバックできます。詳細については、バイナリまたはコンテナ イメージをロールバックするをご覧ください。
- 省略可能なロールアウト フェーズ: 自動ロールバックをサポートする省略可能なフェーズ(機能の有効化など)では、Spanner Omni CLI を使用してロールバックを開始します。
- 最終フェーズ: ロールバックできません。ファイナライズが開始されると、ターゲット バージョンはデプロイ全体で完全に封印され、ロールバックはできなくなります。
バイナリまたはコンテナ イメージをロールバックする
ファイナライズが開始される前にバイナリ フェーズをロールバックするには、すべてのサーバーまたは Pod でローリング再起動を実行して、以前の(ソース)バージョンを復元します。
VM
VM デプロイでは、すべての VM で spanner_server バイナリをロールバックします。
- 以前の
spanner_serverバイナリ バージョンをホストにデプロイします。 - 障害ドメイン全体でサーバーを段階的に再起動し、一度に 1 つのゾーンを更新して、同時に再起動するサーバーの数を 5% 以下に抑え、Paxos クォーラムを維持します。
- 次の障害発生ドメインに進む前に、再起動されたすべてのサーバーが正常で、クラスタに再参加していることを確認します。
Helm
Helm デプロイで、コンテナ イメージタグを以前のバージョンに戻します。
helm upgrade spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
--version CHART_VERSION \
-n NAMESPACE \
--reuse-values \
--set image.tag=SOURCE_VERSION \
--timeout 30m
次のように置き換えます。
CHART_VERSION: Helm チャートのバージョン(例:1.0.0)。NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。SOURCE_VERSION: 以前のコンテナ イメージ タグ(2026.r2-beta.3など)。
スタンドアロン Kubernetes
Helm を使用しないカスタム Kubernetes デプロイでは、StatefulSet または Deployment 仕様のコンテナ イメージを SOURCE_VERSION に戻します。
障害ドメイン全体でローリング アップデートを実行し、一度に 1 つのゾーンを更新して、同時に再起動する Pod の数を 5% 以下に抑えてクォーラムを維持します。
オプションのロールアウト フェーズをロールバックする
ロールバックをサポートするオプションのロールアウト フェーズ(機能の有効化フェーズなど)では、rollouts rollback コマンドを実行してロールバックを開始します。
spanner deployment rollouts rollback ROLLOUT_ID \
--deployment-endpoint=DEPLOYMENT_ENDPOINT
次のように置き換えます。
ROLLOUT_ID: ロールアウトの数値 ID。DEPLOYMENT_ENDPOINT: デプロイ内のサーバーのエンドポイント。
次のステップ
- デプロイを維持する方法を確認する。
- Kubernetes Deployment をスケーリングする方法または VM Deployment をスケーリングする方法を確認する。
- モニタリングの概要について学習する。