このドキュメントでは、Spanner Omni デプロイを以前のバージョンから新しいバージョンにアップグレードする方法について説明します。
Spanner Omni は、非同期の段階的なロールアウト ステート マシンを使用して、サービスを中断することなく安全にアップグレードできるようにします。段階的にアップグレードすると、次のことが可能になります。
- データベース スキーマの更新を適用する。
- ローリング再起動中にバイナリの互換性を確認します。
- ファイナライズ前にエラーが検出された場合は、以前のバージョンにロールバックします。
サポートされているアップグレード パス
LTS バージョンは、次の LTS バージョンにのみ更新できます。新しい LTS バージョンに更新するときに、バージョンをスキップすることはできません。
リリース日の間に LTS リリースがない場合は、ある短期サポート(STS)バージョンから別の STS バージョンにアップグレードするときに、バージョンをスキップできます。
詳細については、バージョンのサポート ポリシーをご覧ください。
アップグレード ワークフロー
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 デプロイの場合: ターゲット リリース パッケージ
- Spanner Omni デプロイの管理者は、アップグレードのメンテナンスの時間枠をスケジュールする必要があります。組織は、アップグレード メンテナンスの時間枠中にデプロイを行わないようにする必要があります。
ステップ 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.r5)。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.r5)。
スタンドアロン 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.r5)。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):--set skipPrepareUpgrade=trueを明示的に渡して、Helm がアップグレード前のフックジョブをスキップするようにします。これは、フェーズ 1 がローカルですでに完了しているためです。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.1.0)。NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。TARGET_VERSION: ターゲット コンテナ イメージタグ(例:2026.r5)。
スタンドアロン Kubernetes
Helm を使用しないカスタム Kubernetes Deployment では、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 つのゾーンを更新し、Paxos クォーラムを維持するために同時に再起動するサーバーは 5% 以下にします。
- 再起動されたすべてのサーバーが正常で、クラスタに再参加していることを確認してから、次の障害発生ドメインに進みます。
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.1.0)。NAMESPACE: デプロイの Kubernetes Namespace(例:spanner-ns)。SOURCE_VERSION: 元に戻す以前のコンテナ イメージタグ(例:2026.r2-beta.3)。
スタンドアロン Kubernetes
Helm を使用しないカスタム Kubernetes Deployment では、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 をスケーリングする方法を学習する。
- Monitoring の概要について学習する。