BalticServers data center
写真: BalticServers.com / CC BY-SA 3.0 / Wikimedia Commons

Cloudflareのサーバーレスデータベース「D1」は、過去1年で稼働中のデータベース数が15倍、日次アクティブ数が18倍に増えました。Cloudflareは、数百万のデータベースを作成し、そのうち数十万が常時稼働する規模を支えるため、制御プレーンの構成を見直しました。

D1の利用拡大と制御プレーンの課題

D1はSQLiteを基盤とするCloudflareのマネージド型データベースで、利用した分だけ料金が発生するサービスです。Cloudflareは、AIを使った開発や「バイブコーディング」のプラットフォームが広がることで、利用者、アプリ、プレビュー環境、テナントごとに小さなデータベースを持つ構成が増えると見ています。こうした使い方では、少数の大規模なデータベースを前提とした従来の設計とは異なり、多数の小規模データベースの作成や管理が課題になります。

削除されていない稼働中のD1データベースは、2026年10月8日時点で過去1年に15倍、過去2年に65倍となりました。1日に1回以上クエリを実行したデータベースをアクティブとする指標でも、同じ1年間に18倍へ増えています。この数字は、登録されたデータベースだけでなく、実際に利用されたデータベースも増えたことを示しています。

D1を使う事業者の一つとして、OpenAIのChatGPT Sitesがあります。同サービスのJon Abrams氏は、D1を使い、利用者が作るダッシュボードやゲーム、ツールにカスタム指標、リーダーボード、コメントなどを加えていると述べました。利用者ごとのデータを小さな単位に分ける構成は、こうしたサービスの開発形態とも結びついています。

データベースを分ける設計と共有方式

マルチテナント型のサービスでは、複数の顧客を一つのアプリケーションで扱います。データベースの設計には、1つのデータベースを1テナントで使う方式と、複数テナントで共有する方式があり、両者を組み合わせる選択肢もあります。どの方式を選ぶかは、テナント数や負荷、費用、運用方法などに関わります。

テナントごとにデータベースを分ける方式では、各データベースに一つのテナントのデータを置きます。この設計はデータの分離性を高められ、個別テナント向けのスキーマ変更もほかのテナントに影響させずに行いやすい一方、負荷のピークに備えて各データベースに十分なリソースを割り当てる必要があります。Microsoft Learnは、単独で配置する場合、この方式が全体のデータベース費用を最も高くすると説明しています。

複数テナントでデータベースを共有する方式は、一般にテナントあたりの費用を抑えやすい一方、データを同じ場所に格納し、計算資源も共有します。そのため、問い合わせが各テナントのデータだけを返すように設計する必要があり、一つのテナントの負荷がほかの利用者の性能に影響する「ノイジーネイバー」のリスクもあります。データベースを分ける方式と共有方式では、分離性、費用、管理の手間のバランスが異なります。

多数のデータベースを管理する仕組み

テナントごとにデータベースを用意すると、データの分離を保ちやすくなる一方、個別のデータベースを作成し、設定や状態を管理する作業が増えます。データベース単位のバックアップ、高可用性、暗号化、性能の監視などは、多数のデータベースを管理するための機能です。たとえば一つのテナントを以前の時点へ戻す場合、そのテナントのデータベースだけを復元できます。

Cloudflareは、D1の制御プレーンを拡張するために複数のアーキテクチャ変更を行い、想定する成長を上回る目標を置いた負荷テストを繰り返しました。そのテスト結果を、最適化する箇所を決める際の指針にしたと述べています。

SQLiteのWAL方式が示す書き込み上の制約

SQLiteの「WAL(先行書き込みログ)」方式では、変更内容をデータベース本体へすぐ反映せず、別のログファイルに追記します。読み取り側はログの確定位置を基準にデータを参照できるため、読み取りと書き込みを並行して進められます。一方、同じデータベースのWALファイルへ書き込めるのは一度に一つの書き込み処理です。

WALに記録された変更をデータベース本体へ移す処理は「チェックポイント」と呼ばれ、SQLiteは既定でWALが約1,000ページに達した際に自動実行します。読み取り処理が長く続くと、チェックポイントの進行が止まる場合があります。ログが大きくなるにつれて読み取り性能が低下することがあるため、定期的なチェックポイントが性能維持に関わります。

WAL方式では、同じデータベースを使うプロセス間で共有メモリーを使うため、通常は同一ホスト上で動作する必要があり、ネットワークファイルシステム上では機能しません。