mnagaaのメモ

技術的なことはこのブログで書きます

データストア #2 ~Redis~

【導入】Redis (Remote Dictionary Server)

  • 高速なインメモリデータストア
  • 用途・ユースケース
    • キャッシュ
    • メッセージブローカー
    • セッション管理
    • リアルタイム分析
    • ランキングシステム
  • 特徴
    • 文字列、リスト、セット、ソートセット、ハッシュ、ビットマップ、HyperLogLog、地理空間インデックス、ストリームなどのデータ構造をサポートしている
    • データの読み書きがミリ秒単位で行える
    • 永続化機能を持ち、データをディスクに保存することで再起動後もデータを保持できる
    • クラスタリングレプリケーションをサポートしていて、高可用性とフォールトトレランスを実現
      • フォールトトレランス: システムが部分的な故障やエラーが発生しても、サービスを中断することなく正常に動作し続ける能力

パフォーマンスについて

  • すべてのデータがメモリ内に保存されるため、読み書き操作が非常に高速で、ミリ秒単位のレスポンスが可能
    • メモリアクセスがディスクアクセスよりも早い
  • リアルタイムアプリケーションや高頻度の読み書き操作が必要なシステムで有用

永続化

  • インメモリデータベースでありながら、データの永続化機能も有する
  • スナップショット方式(RDB)や、アペンドオンリーログ(AOF)といったメカニズムを使用して、メモリ内のデータをディスクに保存
  • Redisサーバーが再起動してもデータの整合性が保たれる

クラスタリングレプリケーション

  • スケーラビリティ
  • クラスタリング機能でデータを複数のノードに分散して保存することで、負荷分散が可能→大規模なデータセットを扱うことができる
  • レプリケーション機能により、データの冗長性を確保して、フェイルオーバーを容易に実現できる
    • フェイルオーバー:システムやコンポーネントが故障した時に自動的に予備のシステムに切り替わるプロセス

多様なデータ構造のサポート

  • 多様なデータ構造をネイティブにサポートしていて、複雑なデータ処理を簡単に行うことができる
    • リストを使用して、メッセージキュー実装する
    • ソートセットを利用して、ランキングシステムを構築する
    • ハッシュを使用してユーザーセッション情報を管理する
  • 対応されているデータ構造(一部)

    Data Type データ構造 説明
    Strings 文字列 バイナリセーフな文字列データ
    Lists リスト 双方向リンクリスト。メッセージキューやタスクキューとして利用される
    Sets セット 重複を許さない無序集合。タグやカテゴリーの管理に有効
    Sorted Sets ソートセット スコア付きの集合。ランキングシステムやリーダーボードに最適
    Hashes ハッシュ フィールドと値のペア。ユーザーセッションの情報や設定データの管理に利用。
    Bitmaps ビットマップ ビット単位の操作。フラグやビットフィールドの管理に適している。
    HyperLogLogs ハイパーログログ 大規模データセットのユニーク要素数を近似的に数える。カウントデータの効率的な管理に役立ちます。
    Geospatial Indexes 地理空間インデックス 地理空間データの管理。位置情報に基づくクエリや検索が可能です。
    Streams ストリーム 時間順に追加されるデータのログ。リアルタイムデータ処理やイベントログの管理に使用されます。
  • 開発者のためのRedisチュートリアル(1): https://meetup-jp.toast.com/3125

  • ざっくり分かるRedis入門 ~データ構造と主な機能について~: https://qiita.com/t-kuni/items/c00d0994c2eb20681cb1

パフォーマンス

Redisのレスポンスが速い理由について、簡単にまとめます。

インメモリデータストア

データをメモリ内に保持するインメモリデータストアであるため、メモリはディスクと比較してアクセス速度が非常に高速で、ナノ秒単位での読み書きが可能

ディスクベースのデータベースシステムでは、ディスクI/Oがボトルネックになることが多く、遅延が発生することがある

RAMを使用するため、ディスクアクセスよりも高速

www.youtube.com

単一スレッドアーキテクチャ

シンプルな並行性モデル

単一スレッドアーキテクチャを採用しているため、複雑なマルチスレッド処理やロック機構が不要となり、データの一貫性を維持しながら高速な処理を実現

単一スレッドであるため、コンテキストスイッチやスレッド間の競合、デッドロックなどの複雑な問題が発生せず、リクエストの処理が効率的

イベントループ

Redisはlibeventやlibevなどのイベントライブラリを使用して、非同期I/O操作を効率的に処理する

イベントループを使用することで非同期I/O操作を行いながらCPUの使用効率を最大化し、リクエストに対するレスポンス時間を短縮

イベント駆動型のアーキテクチャは、高いスループットと低いレイテンシを実現するために重要

永続化について

  • スナップショット(RDB: Redis Database File)
    • 特定の時点でのデータ全体のスナップショットをディスクに保存
    • メモリ内のデータをバイナリ形式でディスクに書き出し、一定の間隔で自動的に保存されるように設定できる
  • AOF (Append-Only File)
    • すべての書き込み操作をログ形式で順次ディスクに追加する方法

Redis Clusterの基本概念

  • Redis クラスタ
  • ノード
    • Redis クラスタは複数のノードで構成される
    • 各ノードは独立したRedisインスタンス
    • それぞれが独自のデータセットを持っている
    • マスターノードまたはリードレプリカとして機能する
      • マスターノード:データの読み書きを直接処理するノードで、クラスタ内のデータをシャーディングして保持する
      • レプリカノード:マスターノードのデータを複製するノードで、マスターノードがダウンした時には、自動でマスターに昇格する
  • シャーディング
    • データをクラスタ内の複数のノードに分割して保存するプロセス
    • データの分散を効率的に行うためにシャーディングを利用する
    • スケーラビリティが向上
    • ハッシュスロット
      • redisクラスタ16384個のハッシュスロットを持つ
      • 各データキーはハッシュ関数を通じてこれらのスロットのいずれかにマッピングされる
      • ノードはこれらの割り当てられたスロットを担当してデータを保持する
    • シャード内の1つのノードがマスターノードで、他のノードはレプリカノードとして機能する。レプリカノードはマスターノードのデータを複製して、フェイルオーバー時にはマスターに昇格する
  • スロット
    • スロットはRedisクラスタにおけるデータ分散の単位
    • 各ノードは特定の範囲のスロットを担当する
    • 例えば、3つのノードでクラスタを作成した場合のスロットの分割は、以下のように分割が行われる →6台でレプリカも追加した場合もやったのでチェック

  • クラスタ通信

    ノード間の通信は以下のプロトコルを使用して行われる

    • ゴシッププロトコル
      • 分散システムにおいて、ノード間で状態情報を交換するためのプロトコル
      • ノードの追加・削除やスロットの移動など、クラスタの情報を共有する
      • 情報の伝搬
        • 各ノードは定期的にランダムに選ばれた他のノードと通信をして、自身の知っている情報を交換する
        • この情報交換を繰り返すことで、クラスタ全体に情報が広まる。
      • 信頼性
        • ゴシッププロトコルは、部分的なネットワーク障害やノード障害に対しても耐性がある
        • 他のノードは他の複数のノードと情報を交換するため、情報が失われる可能性が低くなる
      • スケーラビリティ
        • ゴシッププロトコルは、大規模なクラスタ環境においても効果的に動作する
        • ノード数が増えても、プロトコルのオーバーヘッドは比較的小さく抑えられる
    • クラスタバス: https://mogile.web.fc2.com/redis/docs/reference/cluster-spec/index.html
      • クラスタ内のノード間通信専用のチャネル
      • ゴシッププロトコルやフェイルオーバー情報の伝達に使用
      • 専用チャネル
        • クラスタバスは、ノード間通信専用のチャネルであるため、データ操作のトラフィックとは分離されていて、クラスタ管理に必要な通信がデータ操作の負荷に影響されない
      • 低レイテンシ通信
        • クラスタバスは、低レイテンシの通信を提供し、ノード間の迅速な情報交換を可能にする
        • フェイルオーバーやスロット再配分など、クラスタの重要な操作が迅速に行われる
      • ノードの参加と離脱
        • 新しいノードがクラスタに参加する際・既存ノードがクラスタから離脱する際に、クラスタバスを通じてその情報が全ノードに伝達される
      • フェイルオーバーのトリガー
        • マスターノードの障害が検出されるとクラスタバスを通じてフェイルオーバーがトリガーされる
        • 障害が発生したマスターのレプリカが自動的に昇格して、クラスタの一貫性が維持される
      • スロットの再分配
        • ノードの追加・削除に伴うスロットの再分配もクラスタバスを通じて調整される
        • スロットの再分配プロセスがクラスタ全体に伝播し、一貫性が確保
  • フェイルオーバー
  • スレーブ
    • Slave = Replica
    • マスターノードのデータを複製する役割を持つノード

レプリカノードを追加した時