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

背景

  • WafrisはオープンソースのWebアプリケーションファイアウォール企業で、Railsミドルウェアクライアントを提供している
  • 初期のv1クライアントはローカルRedisデータストアを必要としていたが、現在はSQLiteを使用するv2クライアントを公開している
  • この記事では、RedisからSQLiteへの移行を決断した過程、性能面の考慮事項、アーキテクチャ変更について扱う

要約

  • SQLite、Redis、従来型RDBMS(Postgres/MySQL)にはそれぞれ長所と短所がある
  • これらのデータストアは相互に完全な代替ではなく、置き換えようとすると問題が生じることがある
  • この記事では、Redisベースのv1クライアントをSQLiteベースのv2クライアントへ再構成する過程を説明する

この変更を余儀なくされた理由は?

  • Wafrisの目標は、開発者がサイトを簡単に保護できるようにすること
  • v1クライアントはRedisデータストアを使用していたが、多くのユーザーがRedisのデプロイに問題を抱えていた
  • Redis管理者になる負担を減らすため、SQLiteへ移行した

速度とは何か?

  • Redisは従来型RDBMSと比べて高速だが、それでも管理すべき要素が多い
  • クラウド環境ではネットワーク遅延が大きな問題となる
  • SQLiteはネットワークの往復時間を減らし、より高速な性能を提供できる

モノリシックな前提

  • 多くの分散アプリケーションはRedisの利用で問題を引き起こす
  • Redis利用の複雑さを減らすため、アーキテクチャを見直した

SQLiteの導入

  • SQLiteはネットワークIOのボトルネックを減らす
  • SQLiteが競う相手はファイルオープン(fopen())であり、クライアント/サーバー型データベースではない

SQLiteとRedisのベンチマーク

  • SQLiteは特定のユースケースでRedisより約3倍高速
  • ネットワーク遅延を考慮しない場合でもSQLiteのほうが速い

チャートで欠けている内容

  • たとえベンチマークでSQLiteの性能が劣って見えても、実環境ではネットワーク遅延のためにより高速になる可能性がある
  • SQLiteは水平スケーリングが容易で、ユーザーのインストールや設定の負担を減らす

同期アーキテクチャの構築

  • v1(Redis)では、ユーザーがルールを更新するとRedisデータストアに反映された
  • v2(SQLite)では、クライアントが定期的に更新済みルールを確認し、新しいSQLiteデータベースをダウンロードする

SQLite分散アーキテクチャ

  • SQLite DBを各コンピューティングインスタンスに同期し、データベースのボトルネック問題を解決する

結論

  • SQLiteベースのv2アーキテクチャは、多くのサイトが攻撃に耐えてオンライン状態を維持する助けになる
  • ユーザーの負担を減らし、より安全でセキュリティが強化されたインターネットを提供する

GN⁺のまとめ

  • この記事は、RedisからSQLiteへの移行プロセスとその理由を説明している
  • SQLiteはネットワーク遅延を減らして性能を向上させ、ユーザーのインストールや設定の負担を減らす
  • SQLiteの分散アーキテクチャはデータベースのボトルネック問題を解決する
  • この記事は、Webアプリケーションファイアウォールを簡単にデプロイし、高速に動作させる方法についての洞察を提供する

1件のコメント

 
GN⁺ 2024-09-26
Hacker Newsのコメント
  • 各アプリケーションサーバーがSQLiteデータベースファイルをコピーし、定期的に入れ替えるモデルに関心がある

    • Webアプリケーションファイアウォールのルールに使われる
    • 機能フラグの設定にも使える
    • 機能フラグは更新に数秒かかっても問題ない
  • Redisの読み書きレイテンシは、問い合わせたキー数に比例する

    • PostgresとRedisを使うモノリシックアプリはうまく動いていた
    • Redisはシングルスレッドなので、大量読み取り機能が他の処理を遅くする可能性がある
    • Redisはキー、または小さな固定キー集合の読み書きに向いている
    • SQLiteがローカルのRedisインスタンスと比べて性能が良いのは興味深かった
  • データセットは120万件の項目に見えるが、実際には大きくない

    • IPv4アドレスは4.8MBで、簡単な圧縮でもさらに小さくできる
    • Rubyがmmapをサポートしているなら、IPリストを直接使う方がよい
  • Neonの社内ハッカソンで、RedisのプロトコルをPostgresクエリに変換するNode.jsサーバーを書いた

    • 面白いハックプロジェクトだった
  • RailsWorld 2023ではRedisに対して否定的な空気があった

    • Redisサーバーが必要だという前提があった
    • Redisを使った経験が少ないので、現在のエコシステムがRedisに否定的なのか気になる
  • SQLiteは、サーバー側でレプリケーションなしでもうまく動くニッチなユースケースがあるように見える

    • 他の代替案として、メモリにロードした静的ファイルを使うこともできる
    • SQLiteは良い代替手段だ
  • Redkaという、RedisをSQLiteで実装したプロジェクトがある

  • 最高の引用: "SQLiteはクライアント/サーバー型データベースとは競合しない。SQLiteが競合するのはfopen()である。"

  • Redisは従来のRDBMSと比べて高速だが、運用管理が必要

    • すべてのデータベースにはある程度の管理が必要だ
    • JOINを気にしなければ、行の挿入や検索も非常に速い
  • ベンチマーキングとは、非常に精密な数字で自分をだます暗黒芸術だ