🗂

Redis構成パターンの検討とまとめ

2024/05/25に公開

Redisの構成パターン

Standalone構成

可用性はないがオーバーヘッドがない分最も高速。Kubernetesなどで動かせば、ある程度の可用性を確保できるため、ユーザークリティカルなサービスではなく、多少の時間停止していても許されるサービスなら選択肢としてありなのではないかと思いました。

メリット

  • 最もシンプルな構成のためシンプルかつ軽量
  • セットアップや管理が容易
  • リソース消費が少ない
  • オーバーヘッドがない分低レイテンシ

デメリット

  • 可用性がない
  • スケーラビリティが低い
  • 単一障害点が存在する
  • データの冗長化がないため、データ消失のリスクが高い

Replication構成

マスターのダウン時に手動でフェイルオーバーすることができるため、ある程度可用性は向上。ただし、自動フェイルオーバーがないため、ユーザークリティカルなサービスには少しリスクが伴う。読み取りリクエストの分散が可能なので、読み取り負荷が高いシナリオに適していると思いました。

メリット

  • マスターがダウンしてもスレーブがバックアップとして機能するため可用性は確保
  • 読み取りリクエストをスレーブに分散することで、負荷を分散可能
  • データが複数のインスタンスにレプリケートされるため、データ消失のリスクが低減

デメリット

  • Primaryの障害時の自動フェイルオーバー機能をもたない

Cluster構成

シャーディングとレプリケーションを組み合わせることで、高可用性を実現。大規模データや高トラフィック環境に適しており、水平スケーリングが可能で、ノード間でデータを分散できる。しかし、設定と管理が複雑で、ノード間の通信が増えるため、ネットワークのオーバーヘッドが発生する。大規模であり、高トラフィックな環境で選択肢としてありだと思いました。

メリット

  • 水平スケーリングが可能で、データの分散処理が可能
  • 複数のマスター・スレーブ構成で可用性が向
  • 自動フェイルオーバーとデータの再分散が可能
  • 大量のデータと高トラフィックに対応

デメリット

  • 設定と管理が複雑
  • ノード間の通信が増えるため、ネットワークのオーバーヘッドが発生
  • データの分散により一貫性の問題が発生する可能性がある
  • 小規模デプロイにはオーバーヘッドが高い

Sentinel構成

自動フェイルオーバー機能があるため、マスターの障害に迅速に対応できる。追加のSentinelリソースと設定の複雑さがデメリットだが、ユーザークリティカルなサービスにも適用可能。特に高可用性が必要なシナリオで有効だが、追加のオーバーヘッドとHAProxy自体の可用性確保が課題だが選択肢としてありだと思いました。

メリット

  • Sentinel構成の自動フェイルオーバーに加え、HAProxyでクライアントの接続管理が容易
    • フェイルオーバーすると、新しいマスターのIPアドレスをクライアントが認識しなければならない
    • HAProxyを使用することで、クライアントは常にHAProxyのアドレスに接続するだけでよく、Redisサーバーの変更を意識する必要がなくなる
    • 具体的にHAProxyはRedisサーバーの状態を定期的にチェックし、応答がないサーバーやエラーレスポンスを返すサーバーを自動的に除外する
  • 高可用性と負荷分散を同時に実現
  • クライアント側の設定変更が不要

デメリット

  • sentinel自体の設定や管理が複雑
  • sentinelを動作させるための追加リソースが必要
  • HAProxyをいれるとその分オーバーヘッドが発生するため、パフォーマンス低下
    • 結構速度下がるらしい(Redis自体が高速なため)
  • HAProxy自体の可用性確保が必要

Raft構成

Raftプロトコルを使用することで、一貫性のあるデータレプリケーションと自動リーダー選出が可能。高いデータ整合性を保ちながら、比較的シンプルな設定で高可用性を実現できるが、書き込み性能が低下し、大規模データのスケーリングが難しい。Redisは高スループットと低レイテンシを売りとしているため、パフォーマンスとデータ整合性のトレードオフかなと思いました。

メリット

  • 一貫性のあるデータレプリケーション
  • 自動リーダー選出とリーダー交代が可能
  • データの整合性を高く保てる
  • 自動フェイルオーバーとクライアント接続の柔軟性を両立
  • 高いデータ整合性と可用性

デメリット

  • 書き込み性能がレプリケーションのために低下することがある
  • ネットワークのオーバーヘッドが増える
  • 大規模なデータセットではスケーリングが難しい
  • RaftとHAProxyの両方の可用性確保が必要
  • 設定と管理が複雑

構成比較まとめ

パターン 説明 メリット デメリット 検討ポイント
Standalone 単一の Redis インスタンス 最もシンプルで軽量 可用性がない、スケーラビリティが低い、データ消失のリスクが高い ユーザークリティカルなサービスには不向き
Replication マスターとスレーブの複数インスタンス マスター障害時の可用性向上、読み込み負荷分散 自動フェイルオーバー機能がない 複雑な設定、マスター障害時のフェイルオーバー処理が必要
Cluster シャーディングとレプリケーションの組み合わせ 水平スケーリング、高可用性、大量データ・高トラフィックへの対応 設定と管理が複雑、ネットワークオーバーヘッド、データ整合性の問題 大規模データ基盤に適している
Sentinel Sentinel による監視と自動フェイルオーバー 自動フェイルオーバー、クライアント接続管理の容易さ HAProxy によるオーバーヘッド、HAProxy の可用性確保 高可用性と運用性のバランス
Raft Raft プロトコルによる一貫性のあるレプリケーション 高いデータ整合性と可用性、クライアント接続の柔軟性 書き込み性能の低下、大規模データのスケーリング難しさ、オーバーヘッド データ整合性を重視するユースケースに適している

Discussion