データベースなしで高可用性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件のコメント
Hacker Newsの意見
SQLiteを使わずに独自のトランザクションログを作るのは奇妙
MySQL、Postgres、Redis、MongoDBなどを使わずに独自のインメモリデータベースを作るのは複雑
MySQLやPostgresの基本的な側面を学ぼうとしないのは時間の無駄
HashiCorpのNomad、Consul、Vaultに似たアーキテクチャ
RAMが非常に安いという誤解がある
ファイルシステムのディレクトリをテーブルに、JSONファイルを行として使うプロジェクトを見たことがある
リレーショナルデータベースを使うほうが安定している
複雑なものを避けるために独自のRaft合意層を実装した
現代のデスクトップアプリやモバイルアプリは、SQLiteのようなデータベースをよく使っている
独自のインメモリデータベースを構築することは、PostgresやSQLiteをインストールすることより簡単ではない