20 ポイント 投稿者 GN⁺ 2025-03-05 | 2件のコメント | WhatsAppで共有
  • 多くの開発者は、サーバーでSQLiteを使うのは小規模アプリケーション向きだと考えている
  • その理由は次のとおり:
    • 低いインフラコスト: 別個のデータベースサーバーが不要(単一ファイルで運用)
    • 開発とテストのしやすさ: 同じDBファイルをクライアントとサーバーの両方で活用できる
    • 運用負担の最小化: 複雑な設定やデーモン管理が不要
    • 高い信頼性: SQLiteは世界で最も広く配布されているDBであり、強力な耐久性を持つ
  • LiteFS, Litestream, rqlite, Dqlite, Bedrock などのツールがSQLiteにレプリケーションと高可用性(HA)を追加し、小規模デプロイに適したものにしている

しかしこの記事では、小規模ではなくハイパースケールアプリケーションに適したSQLiteの可能性を探っている

従来の大規模データベース拡張の問題

  • 大規模アプリケーションでは通常、PostgreSQLやMySQLを単一DBとして維持するのが難しく、シャーディングされたデータベースを使用する
  • 例: Cassandra, ScyllaDB, DynamoDB, Vitess(シャーディングされたMySQL), Citus(シャーディングされたPostgres)
  • シャーディングDBには次のような利点がある:
    • データ分割を通じたバッチ読み取り(Batch Read)の最適化
    • 水平スケーリング(Scalability) が可能
    • 高速な書き込み性能を提供
広告

しかし現在のパーティショニングソリューションには次のような欠点がある

  • 固定的なスキーマ(Rigid Schemas): MySQLやPostgresのような柔軟なクエリをサポートしない
  • スキーマ変更が難しい: インデックス追加やリレーション変更時の運用負担が大きい
  • 複雑なクロスパーティション演算: ACIDトランザクションの維持が難しく、2フェーズコミット(2PC)のような複雑な手法が必要
  • データ不整合の問題: パーティション間で強力なデータ制約を適用しにくく、データ整合性が崩れる可能性が高い

SQLiteベースのハイパースケールデータベースの可能性

  • Cloudflare Durable ObjectsTurso は、SQLiteを基盤にハイパースケールアプリケーションを設計する方法を示している
  • これらのシステムは次のような強みを提供する:
    • 動的スケーリング(Dynamic Scaling): エンティティ(Entity)ごとにデータベースを作成し、インフラの複雑さを低減
    • 無制限の低コストデータベース: 従来のシャーディングのようにデータ分割を強制せず、必要なときに新しいSQLiteインスタンスを作成できる
    • グローバル分散(Global Distribution): データベースをユーザーに近い場所へ配置して性能を向上
    • 組み込みのレプリケーションと耐久性(Built-in Replication & Durability): 従来のSQLiteと異なり、多地域でデータを複製して高可用性を維持
  • SQLiteを活用したシャーディング代替方式 (Cloudflare Durable Objects & Tursoの活用)
    • 従来のシャーディング方式では、単一のデータベースパーティションに複数のチャットログを保存
    • SQLiteを使えば、各チャンネルごとに独立したSQLiteデータベースを作成でき、より柔軟なスキーマを活用できる
    • 例の構造
      • 従来のシャーディング: チャットログテーブル + パーティションキー
      • SQLiteベース: チャンネルごとの個別SQLite DB (チャットログ、参加者、リアクション情報を含む)
    広告
  • SQLiteを使うこの方式の利点は次のとおり:
    • ローカルACIDトランザクションを維持: クロスパーティション問題なしに、個別DB内でトランザクションを実行できる
    • 高性能I/O: SQLiteは単一ファイルDBであるため、読み書き性能が非常に高い
    • SQL拡張機能を活用可能:
      • FTS5(Full-Text Search): 検索性能を向上
      • JSON1: JSONデータの保存とクエリをサポート
      • R*Tree, SpatiaLite: 空間データを活用可能
    • SQLマイグレーションをサポート: Prisma, Drizzleのような既存のマイグレーションツールと互換性がある
    • 遅延(Lazy)スキーママイグレーションをサポート:
      • マイグレーションを即時実行する必要がなく、SQLiteインスタンスを開く際に軽量なマイグレーションを行う方式を使える

サーバーでSQLiteを使う際の限界

  • オープンソースでセルフホスト可能なソリューションが不足
  • クロスデータベースクエリをサポートしない → 分析には別途データレイクが必要
  • 限られたデータベースツーリング (SQLブラウザ、ETLパイプライン、監視、バックアップ)
    • StarbaseDB がCloudflare Durable Objects + SQLiteベースでこの問題を解決中
    広告
  • 統一された標準プロトコルの不足
    • PostgreSQL, MySQL, Cassandraは標準化されたプロトコルを使うが、SQLiteサーバーにはまだ標準化されたネットワークプロトコルが不足している
  • ハイパースケールでSQLiteを使った大規模事例が不足
    • Cassandra, DynamoDBのような事例研究は不足しているが、時間とともに変わる可能性がある

結論: SQLiteは単なるローカルDBではなく、ハイパースケールアプリケーションでも強力な選択肢

  • SQLiteは単純な小規模プロジェクト向けDBではなく、ハイパースケールアプリケーションでも従来のシャーディング方式を置き換えられる強力なツール
  • Cloudflare Durable Objects & Turso を活用すれば、データベースをエンティティ単位に分割し、SQLの強力な機能とACIDトランザクションを維持したままスケールできる
  • 従来のシャーディングデータベースより柔軟で管理しやすい代替手段として定着する可能性が高い

2件のコメント

 
pcj9024 2025-03-05

どれほど多くのリクエストをさばく超大規模環境であっても、進んでsqliteを使うような勇敢な人がいるだろうか……

 
GN⁺ 2025-03-05
Hacker Newsの意見
  • あるユーザーが、カスタムデータベースをSQLベースのものに置き換えることを検討している

    • Sqlite3は単一サーバーで動作するため、候補として考えられている
    • データベースは主に読み取り処理が多く、Sqlite3が有利である
    • カスタムデータベースは特定の処理では非常に高速だが、判断は複雑である
    • ベンチマークテストを通じてSqlite3とPostgresqlを比較した
    • Sqlite3はすべての処理でPostgresqlより約2倍高速だった
    • カスタムデータベースは単一レコードへのアクセスではSqlite3より100〜1,000倍高速だった
  • あるユーザーはローカルファーストのWebアプリを開発しており、SQLiteが適していると考えている

    • SQLiteデータベースの状態をクラウドサービスへ簡単に同期する方法を求めている
    • TursoとSQLite Cloudが有望な選択肢に見える
    • ユーザーがS3ストレージへプッシュできるシンプルな方法を検討している
  • SQLite-Per-Partitionの利点について議論している

    • グローバルテーブルが必要な状況では限界がある
    • SQLiteを使ったさまざまなプロジェクト経験を共有している
  • マルチユーザー環境では、SQLiteはMVCCの不足によって困難に直面する

    • MVCCを追加したsqlite互換の実装や拡張について知りたがっている
  • Ruby on Railsの8.0リリースでSQLiteサポートが拡張された

    • キャッシュおよびジョブキューのコンポーネントを置き換え、一般的なWebアプリに適したものにした
  • VitessやCitusに詳しくないユーザーは、記事の内容を理解しづらいと感じている

    • Sharded SqliteとSharded Postgresの違いについて疑問を持っている
  • あるユーザーはVPSホスティングを望まず、SQLiteを使ったWebページを作成した

    • データベースをユーザーのデバイスにダウンロードして利用する
  • Ubiquitiコントローラーの設定に苦労したユーザーがSQLiteの利用を提案している

    • MongoDBの代わりにSQLiteを使えば、より良い体験を提供できると考えている
  • Appleは2022年時点で約300,000のCassandra/ScyllaDBインスタンスを運用している

    • DB-per-tenantアプローチがより良い方向に進んでいると評価している
  • TDLib(Telegramデータベースライブラリ)はSQLiteを使用している

    • 各TDLibインスタンスは24,000以上のアクティブなボットを同時に処理している