QuizMarket(暗記メーカー)
学習アプリ「暗記メーカー」、7年運用のFirestoreから1億件超データをCloud SQLへ無停止移行
180万ダウンロードの学習アプリ「暗記メーカー」が、レイテンシ・費用・開発体験の3つの課題を解決するため、1億件超の問題データをFirestoreからCloud SQL for PostgreSQLへダブルライト方式で無停止移行し、クエリ応答を1秒から100ミリ秒未満に短縮した。
課題
7年運用のFirestoreでレイテンシ・費用・多対多リレーション実装の3課題が顕在化
アプローチ
ダブルライト方式でCloud SQL for PostgreSQLへ段階的に無停止移行
効果
クエリ応答が1秒から100ミリ秒未満に短縮、ストレージ料金は80%削減
背景
「暗記メーカー」は自分だけの問題集を作れる学習支援サービスで、iOS・Android・Webで展開されリリースから約10年、180万ダウンロードを突破していた。データベースにはFirestoreを使い続けていたが、1億件を超える問題データが蓄積される中で、デフォルトリージョンがアメリカだったため単純なクエリでも約1秒のレイテンシが発生していた。加えてFirestoreの無料枠(1日あたり5万Read/2万Write)を超過し、ストレージ料金が他のDBより割高になっていたことも負担になっていた。さらに、NoSQLであるFirestoreでは多対多リレーションの実装が難しく、マルチプラットフォーム展開ともデータモデル上の相性が悪いという開発面の課題もあった。著者はこれらを踏まえ、そもそもNoSQLを選んだこと自体が技術力不足による誤りだったと振り返っている。
移行のプロセス
移行はクライアントアプリがFirestoreへ直接アクセスする構成をまずやめ、すべてAPIサーバ経由でアクセスする形に作り替えるところから始まった。このAPI層の構築のため、約1ヶ月間新規機能開発を停止して移行作業に専念した。
その後、以下の手順で段階的な無停止移行を進めた。
- 新旧DB両方に同時書き込みするダブルライト方式を導入(冪等性確保にPrismaのskipDuplicatesオプションを活用)
- 既存データをクエリカーソルを使って段階的にCloud SQLへ移行(問題データの移行だけで3日程度を要した)
- 読み取り先をFirestoreからCloud SQLへ切り替え
- Firestoreへの書き込みを停止
移行先にはMySQLではなくCloud SQL for PostgreSQLを選び、日本リージョンに配置してCloud Runとプライベート接続で統合した。
移行前後の変化
| 指標 | Before | After | |
|---|---|---|---|
| クエリ応答時間 | 約1秒 | 100ミリ秒未満 | |
| ストレージ料金 | 無料枠超過で割高 | 80%削減 |
結果
移行によりクエリ応答時間は約1秒から100ミリ秒未満へと大幅に短縮された。ストレージ料金は80%削減され、従量課金による費用の読みにくさも解消されて予測可能な費用体系になった。開発面でも多対多リレーションの実装が容易になり、ロジックをサーバ側に集約できるようになった。移行完了から3ヶ月間の運用でも安定稼働を確認している。
学び
著者は、そもそもNoSQLであるFirestoreを選択したこと自体が技術力不足による判断ミスだったと振り返っている。また、データアクセスをAPIサーバ経由に集約するリポジトリ層の重要性や、サービス初期段階での費用予測の重要性を学びとして挙げている。
