1 ポイント 投稿者 GN⁺ 2024-08-11 | 1件のコメント | WhatsAppで共有

データベースなしで高可用性Webサービスを構築する

探索

  • 新しいスタートアップでは、通常は Rails、Django、Node のようなWebフレームワークと、MySQL、PostgreSQL、MongoDB のようなデータベースを選ぶ
  • しかし、Webサービスとデータベースインスタンスを1つに統合できるとしたらどうだろうか? すべてのデータを RAM に保存する方式でアプローチできる
  • RAM をデータベースとして使えば、SQLクエリでデータをシリアライズする必要がなくなる
  • インデックスはメモリ内ハッシュテーブルを使って実装できる
  • バックグラウンドジョブは大きなプロセス内のスレッドとして処理できる
  • プロセスがクラッシュした場合は、定期的に RAM のスナップショットを取得し、変更内容をディスクに記録することで復旧できる

拡張

  • 高可用性を求める顧客が現れたら、Raft コンセンサスアルゴリズムを使ってサーバーをレプリケーションする
  • リーダーサーバーがダウンすると、新しいリーダーが選出されてリクエストを処理する
  • この方式なら、サーバーを再起動せずにローリングデプロイが可能

抽出

  • 大口顧客が増えてきたら、シャーディングによってWebサービスを分割して処理できる
  • 各エンタープライズ顧客に専用クラスターを提供する
  • 主なボトルネックはコミットスレッドの性能になる可能性がある

私たちのスタック

  • Common Lisp を使用: マルチスレッド対応に優れ、コードのホットリロードに適している
  • bknr.datastore と bknr.cluster を使用: Raft 実装のために Baidu の Braft ライブラリを利用
  • 画像ファイル保存のために EFS を使用: S3 よりもエラー処理とテストがしやすい

要約

  • このアーキテクチャは新しいスタートアップに適しており、Common Lisp を使えば多くのツールがすでに揃っている
  • bknr.datastore、Braft、Raft の貢献に感謝する

GN⁺の要約

  • この記事は、データベースなしで高可用性Webサービスを構築する新しいアーキテクチャを紹介している
  • RAM をデータベースとして使い、Raft コンセンサスアルゴリズムによって高可用性を保証する
  • Common Lisp を使ってマルチスレッドとコードのホットリロードをサポートする
  • このアーキテクチャは新しいスタートアップに適しており、高速な開発とデバッグが可能
  • 類似の機能を持つプロジェクトとしては Redis と Memcached がある

1件のコメント

 
GN⁺ 2024-08-11
Hacker Newsの意見
  • SQLiteを使わずに独自のトランザクションログを作るのは奇妙

    • データが1台のサーバーに収まるなら、そのサーバーでデータベースを動かすのがよい
    • データがRAMに収まるなら、ramdiskを使って標準ツールで永続ストレージに複製するほうが簡単
  • MySQL、Postgres、Redis、MongoDBなどを使わずに独自のインメモリデータベースを作るのは複雑

    • トランザクションを直列化してディスクに書き込む必要がある
    • Webサーバー間でトランザクションログを同期し、インメモリデータベースを更新する必要がある
    • 競合解決アルゴリズムを書く必要がある
    • Webサーバーをテナントごとにシャーディングし、ロードバランシング層を書く必要がある
  • MySQLやPostgresの基本的な側面を学ぼうとしないのは時間の無駄

    • パブリッククラウドプロバイダー上で動かす場合、基本的なチューニングで並行性の問題を解決できる
    • 1,000万行を追加することは大きな問題ではない
    • もっと悪い状況になるまで待ってから対処するほうが賢明
  • HashiCorpのNomad、Consul、Vaultに似たアーキテクチャ

    • 開発者体験がよい
    • インメモリ状態を好きなように設定できる
    • 新しいスタートアップには向いていない
    • アップグレードが特に難しい
  • RAMが非常に安いという誤解がある

    • SSDとvCPUの性能は大きく向上したが、RAMの価格は大きく下がっていない
    • DRAM価格は周期的に変動し、最近になってようやく少し安くなった
  • ファイルシステムのディレクトリをテーブルに、JSONファイルを行として使うプロジェクトを見たことがある

    • Redis、Mongo、Postgresを検討したが、独自のデータベースを構築した
    • 革新的なトークンをデータベース構築に使うのは非効率
  • リレーショナルデータベースを使うほうが安定している

    • 組み込みの冗長性、トランザクションログ、バックアップ、復旧機能がある
    • ほとんどの場合、データベースを使うほうがよい
  • 複雑なものを避けるために独自のRaft合意層を実装した

    • Redisを使うほうが簡単かもしれない
  • 現代のデスクトップアプリやモバイルアプリは、SQLiteのようなデータベースをよく使っている

    • リレーショナルなデータ保存とクエリが有用
  • 独自のインメモリデータベースを構築することは、PostgresやSQLiteをインストールすることより簡単ではない

    • 並行性コードを書くよりSQLを書くほうが簡単