無停止DB移行の人的ミスと工数を削減
Googleが実践 DB無停止移行で数カ月の手作業を完全自動化した手法
基幹DB刷新に伴う手作業の二重書き込み実装は、数カ月の工数と人的ミスを招く。Googleはいかにして無停止移行を自動化し、データ整合性を担保したのか。開発を停滞させない実践知を解き明かす。
「基幹データベースの刷新を進めたいが、本番サービスを止めるわけにはいかない」「二重書き込みのコード改修に工数を奪われ、本来の開発が完全に止まっている」。レガシー刷新を担う情シスが直面するこの板挟みに、Googleのファイナンスエンジニアリングチームが実践した自動化の手法が注目を集めている。
ステージング環境での検証段階ではあるが、同社はいかにして30以上のデータアクセスオブジェクト(DAO)をミスなく書き換え、レガシーDBからSpannerへの無停止移行を成し遂げたのか。本記事では、チャット型AIの限界を超え夜間バッチで安全にコードを改修する仕組みと、社内システム刷新に応用できる3原則を解説する。大規模なDB移行を控える情シスは参考にしてほしい。
手作業なら数カ月、30超のDAO改修という壁
米Googleのファイナンスエンジニアリングチームは、レガシーデータ層を同社が開発した分散データベース「Spanner」へ移行するにあたり、Antigravity CLIのヘッドレスモードを活用した自動リファクタリングパイプラインを構築した。同チームのアプリケーションエンジニアであるサチン・マタパティ氏が、Google Cloud公式ブログでその詳細を明らかにした。
財務の正確性が求められる高スループットの本番環境では、単純な切り替えスクリプトによるデータベース移行は困難を極める。過去データの移行と検証が完了するまで、既存のデータストアとSpannerの双方が同一の書き込みを同時に受け付ける「二重書き込み(デュアルライト)」が必要となる。
同チームが設計した移行プロセスは以下の3段階からなる。
- 過去データのバックフィル:参照整合性を保ちながら既存レコードをSpannerへ複製
- 二重書き込みと二重読み込みの実装:移行期間中、全DAOを修正して既存ストアとSpannerへ並行して変更を書き込む
- 自動API検証とパリティ確認:RPCトラフィックを傍受し、両ストアへの書き込みがバイト単位で完全に一致しているかをエンドツーエンドで検証
しかし、この移行を30以上のDAOで適用するには大きな課題があった。各DAOに、複雑なドメインモデルをSpannerのスキーマ列へマッピングする専用クラス「MutationConverter」の作成、二重書き込みの分岐処理やロールバックエラー通知ロジックの実装、テスト用の疑似時刻(FakeTimeSource)を用いた単体テストの整備が必要となるためだ。これらを手作業で行った場合、数カ月ものエンジニア工数が費やされる計算だった。
スキーマ変換のインタフェースを分離
自動化パイプラインで高品質なコードを安定して生成するため、同チームはまずDAOのリファクタリングパターンを標準化した。
DAOのビジネスロジック内にSpannerのテーブル名やカラムの割り当てを直接記述するのではなく、Spannerのスキーマ変換を独立したコンバーター単位に分離した。DAOとSpanner SDKの間に厳密なインタフェース(MutationConverter)を定義することで、AIコーディングエージェントが推論し、確実に出力できる仕様を整えた。
チャット型を廃し、夜間バッチとテスト連動で自動修復
同チームが採用したのは、統合開発環境(IDE)上のチャット型AIではなく、コマンドラインからバックグラウンドで実行できるAntigravity CLIのヘッドレスモード(-p)だった。
対話型インタフェースは実験的なコーディングには適しているものの、コードベース全体にわたる体系的かつ反復的な複数ファイルの変更には向かない。そこで、スクリプト「migration_ui.py」を用いてヘッドレスモードを制御するオーケストレーションを構築した。このアプローチには以下の3つの特徴がある。
- プロンプトのバージョン管理:タイムスタンプのシリアライズやNULL許容値の変換、FakeTimeSourceを用いたテスト注入など、Spanner特有のエッジケースに対応するルールをプロンプトテンプレートとしてコード管理した
- バッチ実行と自動自己修正:スクリプトが対象のDAOを取得してAntigravityに入力し、コンバーター、二重書き込みDAO、単体テストを自動生成する。生成後にビルドテスト(blaze test)を即座に実行し、リンターエラーやテスト失敗が発生した場合は、そのエラーログをAntigravityにフィードバックして自律修正させた
- 夜間の無人実行:退勤時にエンジニアが10個のDAOをキューに登録すれば、翌朝にはテスト検証済みのクリーンなチェンジリストが完成し、人間のレビューを待つだけの状態になった
他社のデータベース移行にも通じる3つの知見
この自動化パイプラインにより、手作業での実装とテストに要していた工数は大幅に削減された。また、全DAOが同一の検証済みパターンに従って生成されるため、ステージング環境のデータ整合性も厳格に維持されたという。エンジニアは定型的なボイラープレートの作成から解放され、データモデリングや性能の最適化に注力できるようになった。
マタパティ氏は、データベース移行を計画するエンジニアに向けて以下の3つの知見を挙げている。
- スキーマ変換を事前に分離する:新しいデータベースSDKの要件をビジネスロジックから切り離した厳密なインタフェースを定義する。AIエージェントは境界が明確な設計パターンで真価を発揮する
- 対話型チャットからヘッドレス自動化へ移行する:3~4ファイルを超える反復的なリファクタリングでは、スクリプトによるヘッドレスワークフローに投資する。プロンプトとテスト検証を自動ビルド工程として扱うことで品質の均一化が図れる
- ビルドシステムを安全柵として機能させる:AIの生成ループをビルドテスト環境(bazel testやgo test)に直接接続する。人間がコードレビューを行う前に、モデル自身にコンパイルエラーやアサーションエラーを解決させる
Copyright © ITmedia, Inc. All Rights Reserved.
TechTarget ニュースプラス
国内のIT業界ニュースを迅速に報道します。企業動向から導入事例、市場トレンドまで幅広く取り上げ、実務に直結する情報をタイムリーに提供する連載です。
関連記事
新着ホワイトペーパー PR
-
製品資料
[株式会社うるる] 「入札市場」攻略ガイド:効率的に落札するためのポイントを徹底解説 -
製品資料
[株式会社うるる] 入札情報に特化した「販路拡大」「効率化」のためのサポートツールとは? -
市場調査・トレンド
[株式会社うるる] 公共入札に成功する企業と失敗する企業の「5つの違い」 -
製品資料
[日本ビジネスシステムズ株式会社] 専門家が教える、Microsoft 365の「テナント統合/分離」を成功に導く秘訣 -
製品資料
[rakumo株式会社] Microsoft 365での情報埋没を防ぐ、社内ナレッジを資産化する情報ポータル活用
こんなメディアも見られています
TechTargetジャパンに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
ベンダーコンテンツ PR
From Informa TechTarget
SpecialPR
アクセスランキング
-
1
半数がブルーカラー転向を視野に? ベテランエンジニアを追い込む“54歳の壁”
-
2
「Microsoft 365」が乗っ取られる MFAを破る“本物の画面”の恐怖
-
3
PHP脆弱性「PHP2Shell」で2260万件に影響 情シスの緊急チェックリスト
-
4
「Windows」の不要なファイルを安全に消して容量を空ける方法
-
5
なぜ「Gemini 4 Argon」は出遅れたのか? Googleが狙う“逆転のシナリオ”
-
6
生成AIが普及しても「技術書」を手放せないエンジニアの本音
-
7
テレワークやBYODでリスクが拡大、デバイスの多様化を弱点としない管理方法とは
-
8
データセンター事業者が「脱VMware」をした“例のライセンス問題”じゃない理由
-
9
「有線LAN環境」に関するアンケート
-
10
「業務改善とツール活用」に関するアンケート
ホワイトペーパーランキング PR
-
1
AI駆動攻撃にどう対抗する? 超速の攻撃からエンドポイントを保護する方法
-
2
2026年のサイバーセキュリティには何が必要か? 最新データに学ぶ傾向と対策
-
3
経験豊富な即戦力人材に直接アプローチできる、「攻めの採用」への転換術
-
4
「IT史に名を残すシステム障害」8選
-
5
最速72分でデータが流出? 最新の脅威トレンドや侵入手法から分かった防衛策
-
6
不審メールの経路や見せ方に変化? 2026年夏の3事例から見えた動向と対処方法
-
7
Microsoft 365のメールセキュリティ、3つの“死角”と追加で検討すべき対策とは
-
8
AI駆動開発のスピードと安全性を両立 「品質・セキュリティ管理」の実践ガイド
-
9
HDDを使わない「SSDオンリー」が無謀なのはなぜ?
-
10
「標的型攻撃メール」事例・サンプル集
TechTargetジャパン SNS
インフォメーション
注目情報をチェック
TechTargetジャパンをフォロー