スケールと可用性を両立したいのに、クロススロットやフェイルオーバーでつまずいていませんか。Redis Clusterは16384スロットによる分散でスループットを伸ばし、レプリカによる自動切替で停止時間を抑えますが、キー設計や永続化の前提を外すと性能が出ません。実運用で直面しやすい悩みを、設計から検証、運用まで一気通貫で解決します。
本ガイドでは、3マスター3レプリカの最小構成、Docker Composeでの検証、CLUSTER INFO/NODESでの状態確認、add-nodeやreshardによる拡張手順を具体例で示します。RDBとAOFの使い分け、cluster-node-timeoutやTLS設定、ハッシュタグでのマルチキー安定化も網羅します。
AWS ElastiCacheのクラスターモードの可否や料金の考え方、KubernetesのStatefulSet設計、各言語クライアント(Jedis/Ioredis/Springなど)の接続最適化まで、現場で役立つチェックリストを提示します。まずはキー分散を確認し、スロット再配置時のレイテンシ悪化を最小化する設計から始めましょう。
目次
redis clusterではじめてのRedisクラスタ設計と利用シーンの全体像をつかむ
Redisとは何かをわかりやすく要約し、キャッシュとセッション管理の使い分けを示す
Redisはインメモリ型のデータストアで、キーと値を高速に読み書きできるのが特長です。単一ノードでは遅延の小ささが強みですが、スループットや可用性を高めるにはredis clusterでの分散が有効です。キャッシュではミリ秒未満の応答とスケールが重視され、TTLやシャーディングを前提にします。セッション管理では一貫性やフェイルオーバーが重要で、レプリカ読み取りやスロット再配置時の影響を最小化する設計が求められます。
-
キャッシュ: 読み取り比率が高い、TTLで整合性を緩和
-
セッション: ロスト許容度が低い、フェイルオーバー重視
-
redis cluster: スロット分散で高スループット
インメモリ特性と永続化の前提を押さえ、I/O設計の注意点を明確化
RedisはRAM主体のため、I/O設計では永続化方式とスナップショット負荷を見極めます。RDBは一定間隔でのスナップショット保存により書き込み負荷が低く、復旧が高速です。一方AOFは各書き込みをログ化し耐久性を高めますが、fsync設定によってレイテンシと消費ストレージが増えます。redis clusterでは各ノードの永続化設定が独立するため、バックグラウンド保存が同時多発しないよう調整し、スロット移動やリシャーディング時のI/Oスパイクを避ける必要があります。
-
RDB: 定期保存で軽量、復旧が簡潔
-
AOF: 高耐久、リライト運用が必須
-
併用: 可用性とパフォーマンスの両立
採用判断の基準を用途別に提示し、スループットと可用性の要件を定義
用途別にスループット・遅延・可用性を数値で合意し、redis clusterの最小構成やノード数を決めます。セッションは3マスターに3レプリカの6ノードを基本とし、フェイルオーバー時のRTOとRPOを明確化します。キャッシュはヒット率とミス時の再計算コストに応じてスロット配分を調整します。キュー用途ではBRPOPやストリームの消費モデルに合わせ、バックプレッシャーと永続化の方針を定義し、リーダイレクトやredis-cliでのクラスタ操作手順を標準化します。
-
セッション: 低RPO、安定フェイルオーバー
-
キャッシュ: 高ヒット率、TTL設計
-
キュー/ストリーム: 消費者グループ運用
用途別要件比較
用途 | 主要KPI | 推奨構成 | 永続化 | 補足 |
---|---|---|---|---|
キャッシュ | p95遅延/ヒット率 | redis cluster 3+3 | RDB中心 | TTLとキー粒度最適化 |
セッション | RTO/RPO | redis cluster 3+3 | RDB+AOF併用 | 一貫性とフェイルオーバー優先 |
キュー/ストリーム | 吞吐/再処理容易性 | redis cluster 3+3以上 | AOF優先 | 消費者グループ設計が重要 |
主なコンセプトと用語を正しく理解し、設計ミスを防ぐ
redis シャードとは何かをスロットと一緒に理解する
redis clusterではデータ空間を16384のスロットに分割し、各スロットをノードへ割り当ててシャーディングします。キーはCRC16でハッシュ化され、結果を16384で剰余してスロットを決定します。これによりキーの分散が均一化され、ノード追加や削除時はスロット単位で再配置できます。スロットは論理的な単位であり、シャードはスロット集合を担当するノード群を指します。redis cluster nodesの情報を基に、クライアントは適切なノードへルーティングし、効率的なアクセスを実現します。
- 16384スロットとハッシュの仕組み、データ配置の基本を整理する
ノード増減時はスロットの再割り当てでデータ移動量を最小化します。スロットはキー分布の粒度であり、均等な割り当てが負荷分散の鍵です。redis-cliのcluster系コマンドで現在の割り当てを確認し、偏りがあればリシャーディングで是正します。ハッシュの性質上、ランダムキーは近似的に均等分散されますが、キー名設計で偏りを誘発しないことも重要です。クラスタの健全性はスロット全配布の達成で判断します。
ハッシュタグを用いたキー配置制御でマルチキー操作を安定化
ハッシュタグはキー名の{tag}部分のみでスロット計算を行う仕組みです。同じ{tag}を持つキーは必ず同一スロットに配置され、MGETやLua、トランザクションなどのマルチキー操作を同一ノードで完結できます。セッション管理やランキングのように関連キーを束ねたい場合に有効です。タグは過度に広くしないこと、将来のスケールでタグ集合が局所化しないことを考慮します。タグ未指定のキーは通常のCRC16計算に従います。
- {tag}の使い方とクロススロット回避の設計指針を示す
{user:123}profileや{user:123}cartのように同一主体でタグを合わせると、マルチキー操作が安定します。タグは1つの波括弧ペアのみが有効で、複数指定や空タグは避けます。タグの選び方はアクセス同時性とデータ量のバランスが重要です。巨大集合を単一タグに集中させるとホットシャード化するため、読み取り分散や集約設計を併用します。タグ変更はスロットが変わるため、移行計画を伴うべきです。
スロット再配置の影響範囲を把握し、運用時のリスクを低減
スロット再配置は元ノードから目的ノードへ対象スロットのキーを移送します。転送中はMOVEDやASKリダイレクトが発生し、対応クライアントは透過的に追従しますが、レイテンシが一時増加します。再配置はバッチ長や帯域制御で影響を抑え、ピークトラフィック外で実行します。大容量キーは移送コストが大きいため、事前に分割やTTL活用を検討します。監視では失敗率と待機中コマンドを追い、必要に応じて一時的な書き込み抑制を計画します。
- リシャーディング時の一貫性とレイテンシへの配慮点を示す
再配置中は同一キーへの並行書き込みで一時的な整合性低下が起き得ます。クライアントのパイプライン深度や再試行回数を抑え、タイムアウトを現実的に設定します。長時間の移送を避けるため、スロット単位を小分けに進め、進捗を可視化します。重要キーは事前にレプリカ確認を行い、フェイルオーバー発生時の二重移送に備えます。業務影響の大きい操作はメンテナンスウィンドウ内で実施します。
Redis Cluster nodesの役割とヘルス判定の仕組み
redis cluster nodesの構成はマスターとレプリカで成り立ち、マスターがスロットを担当し、レプリカが同期と可用性を担保します。ノード間はゴシップで状態を交換し、未応答が一定閾値を超えると疑い(suspect)となり、投票でダウン(FAIL)が確定します。クォーラムを満たすとフェイルオーバーが発動し、レプリカが昇格します。ヘルスはCLUSTER INFOやCLUSTER NODESで確認し、スロットカバレッジが完全であることが正常の前提です。
- マスターとレプリカ、投票とフェイルオーバーの流れを整理する
マスター障害時、同一シャードのレプリカが立候補し、過半数のマスターから投票を得て昇格します。再接続後は旧マスターがレプリカとして合流するか、再構成が必要です。レプリカの優先度やレプリケーション遅延は昇格選定に影響します。ネットワーク分断時はスプリットブレイン防止のため書き込み拒否が働きます。監視ではレプリカのlag、リンク状態、スロット配布の整合性を継続確認します。
- Clusterのクエリの制限を回避するためのアクセス設計
クロススロットとなるマルチキー操作はエラーになるため、ハッシュタグで同一スロットへ揃えます。Luaスクリプトやトランザクションは単一ノードで完結させる必要があり、複数スロットにまたがる処理はアプリ側で分割・集約します。SCAN系はノード単位での走査を基本とし、全体走査は各ノードの結果をアプリでマージします。pub/subやブロッキング操作の分散も考慮し、必要なら専用ノードやキュー基盤を併用します。
- redis cluster modeにおける可用性と運用の観点を示す
フェイルオーバーは自動ですが、過剰な同時昇格を避けるために再試行間隔やタイムアウトを明確化します。レプリカ配置は異なるアベイラビリティゾーンに分散し、ネットワーク遅延と耐障害性を両立させます。計画メンテナンス時はノードを徐々に取り外し、スロット移動完了を確認してから停止します。バックアップはAOF/RDBを併用し、クラスタ外ストレージへ保全します。依存クライアントはMOVED/ASK対応を必須とします。
- redis clusterの運用確認に役立つコマンドを整理する
以下は日常運用の確認軸です。出力の差異や遅延を時系列で比較し、異常兆候を早期検知します。自動化ツールからの実行時はタイムアウトと再試行制御を付与し、誤検知を抑制します。
ノード/クラスタ監視と操作の要点
目的 | コマンド/指標 | 要点 |
---|---|---|
配置確認 | CLUSTER SLOTS/CLUSTER NODES | スロットカバレッジ、マスター-レプリカ対応 |
健全性 | CLUSTER INFO | cluster_state, slots_ok, failover_state |
役割確認 | ROLE | master/replicaとreplication偏差 |
再配置 | CLUSTER ADDSLOTS/MIGRATE | 事前の帯域調整と一時的なASK許容 |
接続 | redis-cli -c | MOVED/ASK追従とタイムアウト設定 |
負荷 | latency、slowlog | 一時的な尖りの原因特定と是正 |
最小構成とローカル検証:Docker Composeで短時間ではじめる
redis cluster 最小構成と起動に必要なディレクトリと設定のポイント
3マスター3レプリカの最小構成は、可用性とスロット分散を両立する推奨形です。各ノードは専用ディレクトリを持ち、confとデータ永続化用のvolumeを分離します。ポートは各ノードでTCPポート(例:6379)とクラスタバスポート(上記+10000)を開放し、固定IPまたは名前解決を整備します。永続化はAOFまたはRDBを要件に応じて選択し、クラッシュ復旧を意識します。クライアントはredis-cliやioredis、redis-py-clusterがクラスターモードに対応しており、キーは16384スロットへ自動シャーディングされます。
-
マスターとレプリカは異なるホストに配置すると障害耐性が上がります。
-
同一ホストでの検証時はメモリとポート競合に注意します。
-
AOFは整合重視、RDBは軽量運用重視で選択します。
作成した各ディレクトリに設定ファイルを用意しサーバーを起動する
各ノードのredis.confにcluster-enabled yes、cluster-config-file nodes.conf、cluster-node-timeout、appendonlyの有無、protected-mode no、bind、portを記載します。クラスタバスポートはport+10000が既定で、コンテナ公開時は両方をマッピングします。データとconfをホストにマウントし、起動はdocker compose upで並行起動します。起動直後はnodes.confが自動生成されるため、コンテナ再作成時も同一ボリュームを再利用してノードIDを保持します。ログはstdoutとファイルの双方で確認し、警告やアドバタイズアドレスの不一致を早期に解消します。
-
cluster-announce-ip/portを用いてNAT越えの到達性を確保します。
-
vm.overcommit_memoryなどカーネル設定を事前に調整します。
-
永続化を有効化し、fsyncポリシーをビジネス要件に合わせます。
クラスターを構築して触ってみるまでの流れと動作確認
全ノード起動後、redis-cli –cluster createでマスター3台を指定し、–cluster-replicas 1でレプリカを自動割当します。構築後はCLUSTER INFOでcluster_stateがok、cluster_slots_assignedが16384、cluster_known_nodesが6であることを確認します。CLUSTER NODESで各node-id、マスター/replica、slot範囲、connected状態を点検します。キー書き込みはredis-cli -cで実施し、MOVED/ASKが発生しないことを確認します。hashタグ{…}を用いると関連キーを同一スロットへ固定でき、トランザクションやLuaの動作安定に寄与します。
-
読み取り分散はreadonlyクライアント設定で可能です。
-
フェイルオーバー検証はmaster停止→replica昇格を観察します。
-
再起動後もノードIDが変わらないことをボリュームで保証します。
redis cluster docker composeで高速に立ち上げる手順
Docker Composeではbitnami/redis-clusterやgrokzen/redis-clusterの公式/コミュニティイメージが便利です。専用bridgeネットワークを作成し、各サービスに静的ホスト名を付けます。publishはportとcluster-bus双方を明示し、cluster-announce-ipにコンテナの名前解決可能なアドレスを設定します。composeのhealthcheckでredis-cli ping応答を待ち、初期化スクリプトで–cluster createを自動実行します。単一ホスト検証ではulimit、sysctl、ストレージIOを考慮し、AOF有効時のfsync間隔で性能と耐久のバランスを取ります。
-
同一マシンで6ノードを動かす場合はメモリ上限を設定します。
-
名前解決はextra_hostsやユーザー定義ネットワークで安定化します。
-
起動順序はdepends_onとhealthcheckの組合せで制御します。
データ書き込みとキーの分散を可視化し、検証結果を記録する
初期計測はredis-benchmarkでGET/SETのQPSとレイテンシを取得し、パイプライン深度を変えつつ観測します。複数キーを投入し、CLUSTER KEYSLOTでスロットを確認、INFO keyspaceとCLUSTER NODESのslot範囲で分散状況を可視化します。アプリ側はioredisやredis-py-clusterでパイプラインを有効にし、MOVED/ASK統計とリトライ回数をログへ記録します。フェイルオーバー時は再試行時間、書き込み成功率、スロット再配分の完了時間を時系列で残し、コンテナログと合わせて事象を相関分析します。
-
レプリカ読み取りは整合性要件を満たすか注意します。
-
大きな値はネットワーク帯域とCPUコストを増やします。
-
ベンチマーク条件は再現性確保のため設定を保存します。
本番向けのCluster の設定と動作確認、可用性を高める設計
ポート、認証、永続化を含む本番パラメータの要点を明示
本番のredis clusterでは通信の安定性と安全性を両立します。ポートはportに加えcluster-portを固定し、ファイアウォールで双方向を許可します。AUTHはrequirepassとmasterauthを設定し、TLSは証明書とcipherを明示して相互認証を行います。cluster-node-timeoutはネットワーク特性に合わせてチューニングし、短すぎる誤検知と長すぎる復旧遅延を避けます。repl-backlogはピークレプリケーション遅延とネットワーク往復を考慮して十分に確保します。永続化はAOFのappendonlyとfsyncポリシーを選択し、RDBのスナップショットと併用して復旧時間と書き込み遅延のバランスを取ります。docker composeやkubernetesでの運用時も、ノード再配置に耐えるために永続ボリュームと固定ポートの設計を優先します。
- cluster-node-timeout、repl-backlog、TLSとAUTHの勘所を示す
設定項目 | 推奨の考え方 | 注意点 |
---|---|---|
port/cluster-port | 固定値で明示 | L4/L7のヘルスチェックと整合 |
AUTH/TLS | 必須 | 証明書ローテーション手順を準備 |
cluster-node-timeout | ネットワーク遅延×3〜5倍 | DC間は別値 |
repl-backlog | フル同期回避の十分量 | 再起動時の保持 |
永続化(AOF/RDB) | 両用で妥協点を設計 | fsyncで遅延増加 |
Clusterの動作確認とフェイルオーバー手順を標準化
動作確認はredis-cliで各ノードのCLUSTER INFOとCLUSTER NODESを取得し、slotsの割当とreplicaの関連を照合します。フェイルオーバーは自動と手動を標準化します。自動切替はmaster障害時にreplicaが昇格し、クライアントはMOVED/ASKに従って接続先を更新します。手動昇格はCLUSTER FAILOVERを使用し、書き込み一貫性を確保した上で実施します。復旧後の再参加は修復したノードでクラスタに再接続し、configの世代とノードIDを確認してから再同期を進めます。可観測性はエラーログ、遅延、レプリケーションラグを計測し、しきい値によるアラートで早期検知します。
- 自動切替と手動昇格の流れ、再参加の確認手順を明確にする
確認項目 | コマンド/観点 | 合格基準 |
---|---|---|
状態 | CLUSTER INFO | cluster_state:ok |
構成 | CLUSTER NODES | masterとreplicaのペア一致 |
スロット | redis-cli cluster slots | 全16384割当 |
昇格 | CLUSTER FAILOVER | クライアント整合 |
再参加 | レプリケ進捗とID | 不一致なし |
Redis Cluster add-nodeとリシャーディングの実務
スケールアウトはredis cluster add-nodeで新規ノードを参加させ、リシャーディングでスロットを移行します。計画段階で現行ノードのキー分布とホットスロットを把握し、移行対象のslot範囲と順序を定義します。ピークトラフィックを避け、トランザクションやLuaに依存するキー群は同一スロットへ揃えるためにハッシュタグを利用します。再均等化はrebalanceでノード間のmastersの負荷差を解消し、移行中はクライアントのASKリダイレクトに対応できるcluster-awareドライバ(ioredis、redis-py-cluster、Jedis)を使用します。kubernetesではPod再作成時の安定性のためにHeadless Serviceと安定ホスト名でクラスタ認識を維持します。
- スロット移行と再均等化の計画、影響を最小化する手順を示す
工程 | 目的 | 実務ポイント |
---|---|---|
前準備 | 分布と負荷把握 | キー空間、QPS、レイテンシ |
参加 | add-node | roleとポート疎通確認 |
移行 | reshard | 小分割で段階移動 |
再均等化 | rebalance | 残差の解消 |
検証 | 健全性確認 | INFOとエラーログ監視 |
redis-cli コマンドでの安全な運用操作ガイド
運用操作はredis-cliで手順化し、事前に読み取り専用期間やバックアップを確保します。add-nodeはマスター追加かreplica追加かを明示し、del-nodeは空スロット化とレプリカ再配置後に実施します。reshardは移行元と移行先、スロット数、最小単位のバッチを設定し、進行状況を監視します。rebalanceは全マスターの平均スロットに寄せつつ、重いノードを優先して軽減します。接続はredis-cli cluster接続でTLSとAUTHを指定し、タイムアウトを十分に確保します。操作後はCLUSTER INFOでokを確認し、アプリ側のエラー率とレイテンシを併せて評価します。
- add-node、del-node、reshard、rebalanceの留意点を整理する
操作 | 主な留意点 | 失敗回避 |
---|---|---|
add-node | 役割と通信確認 | 証明書とACL |
del-node | 空スロット化必須 | replica再配置 |
reshard | 小さく素早く | ASKハンドリング |
rebalance | 過負荷優先軽減 | 段階適用 |
クラウド選定のポイント:AWSのクラスターモードと料金と制約
elasticache redis クラスターモードの有効と無効を用途別に選ぶ
クラスターモード有効はシャーディングでスロットを複数シャードへ分散し、書き込みスループットと水平スケールを得ます。セッション管理や時系列キャッシュなど、容量とスループットが成長し続ける用途に適します。無効は単一シャード内でレプリカを増やし、読み取り分散とフェイルオーバーを重視します。既存のredis-cliや一部ミドルウェアとの互換性を保ちやすい反面、スケール方式は垂直拡張が中心です。redis clusterと比較する際は、アプリのキー分布やトランザクション要件も併せて評価します。
-
有効はシャード単位でスケール、無効はノードの垂直拡張が中心です
-
互換性は無効が広めですが、成長余地は有効が大きいです
-
セッションやメタデータは有効、低変更の参照系は無効が適します
観点 | クラスターモード有効 | クラスターモード無効 |
---|---|---|
スケール方式 | シャード追加で水平拡張 | インスタンスサイズ拡大が中心 |
容量上限 | シャード数×ノード容量 | 単一シャード容量に依存 |
互換性 | クラスタ対応クライアント必須 | 既存クライアントとの互換性高い |
運用 | スロット管理とリシャーディング | シンプルだが上限に到達しやすい |
主用途 | 高スループット/大容量 | 低〜中規模、互換重視 |
elasticache クラスターモード 料金と課金の考え方
料金はノードタイプごとの時間単価を基礎に、シャード数、レプリカ数、バックアップ保持、データ転送量で決まります。クラスターモード有効では各シャードにマスターとレプリカが存在し、合計ノード数が直線的に増えるため、規模拡大時のコスト見通しが重要です。無効では単一シャード内のレプリカ追加が主な増分となり、読み取り分散コストの把握が中心です。AZ間データ転送やバックアップの保存先による転送料も加味し、トラフィックとスナップショット運用を最適化します。
-
コストは「ノード時間単価×台数」+「転送」+「バックアップ」で概算できます
-
レプリカは可用性と読み取りの両面で費用対効果を評価します
-
シャード増は直線的にコスト増となるため上限を事前に設計します
要素 | 影響 | 留意点 |
---|---|---|
ノードタイプ | 時間単価と性能を規定 | メモリ搭載量とネットワーク帯域を確認 |
シャード数 | 水平スケールと直線的コスト増 | キー分布と将来の増設計画を連動 |
レプリカ数 | 読み取り性能/可用性と比例費用 | AZ配置とフェイルオーバー方針 |
データ転送 | AZ/地域間で増加 | 跨AZ通信とバックアップ転送 |
バックアップ | 保存回数/保持期間で増加 | 取得ウィンドウと復元SLAに影響 |
elasticache クラスターモード 変更時の注意点と互換性
クラスターモード無効から有効へは直接のオンライン変換はできず、新規クラスタへの移行が基本です。計画時はデータ移行方式を選定し、書き込み停止の要否や切替方式を明確化します。クラスターモード有効でのスケールアウトはオンラインのリシャーディングが可能ですが、スロット再配置中はレイテンシ変動が発生しやすいため、低負荷時間帯を選びます。クライアント互換性として、redis cluster対応のドライバ(ioredis、JedisのRedisCluster、redis-py-clusterなど)へ切替が必須となる点を事前検証します。
-
無効→有効は新旧並行稼働と段階的切替が安全です
-
リシャーディング中は一時的なMOVED/ASK応答と遅延に留意します
-
監視指標はレイテンシ、エラー率、フェイルオーバー検知を重視します
変更種別 | 可否 | 主なリスク | 緩和策 |
---|---|---|---|
無効→有効 | 直接不可 | データ再投入/切替ミス | 並行運用と段階移行 |
スケールアウト(有効) | 可能 | 一時的な遅延増 | 低トラフィック時間帯実施 |
レプリカ増減 | 可能 | 再同期負荷 | 段階的追加と監視強化 |
ノードタイプ変更 | 可能 | 再起動/短時間停止 | メンテナンスウィンドウ確保 |
elasticache クラスターモード 無効を選ぶケースと限界
クラスターモード無効は、トランザクション互換や既存ライブラリ維持、単一シャード内で完結するキー空間の用途に適します。例えばレガシーなRubyのRedis gemや一部のRedis Railsプラグイン、単純なキャッシュ層では移行コストが小さく、redis-cli cluster 接続要件も不要です。ただし限界は垂直拡張の上限と単一シャードの容量制約で、成長局面や高い書き込みQPSでは頭打ちになります。長期運用を見据えるなら、将来的なクラスターモード有効への再設計余地を確保します。
-
既存資産の維持や移行コスト最小化に適しています
-
容量とスループットの上限に早期到達する可能性があります
-
将来の拡張計画に合わせ、移行パスと検証環境を準備します
採用理由 | 具体例 | 留意点 |
---|---|---|
互換性重視 | 既存クライアント/ミドルウェア | 機能は安定だが拡張に限界 |
運用簡素化 | 単一シャード運用 | フェイルオーバーはレプリカで対応 |
成長抑制 | 小規模/短期プロジェクト | 将来の再構築コストを見積もる |
言語別クライアントの実装ガイドと接続確認の手順
redis cluster pythonやPredis clusterやJedisの接続設定
redis clusterに接続する際は、redis cluster python、Predis cluster、Jedisの各クライアントで共通してタイムアウト、スロットキャッシュ、リトライの設計が重要です。接続タイムアウトとソケットタイムアウトはネットワーク遅延とフェイルオーバー時間を考慮して個別に設定します。スロットキャッシュは起動時に全スロットを取得し、MOVED/ASKを受けたら即時更新することでリダイレクトを最小化します。リトライポリシーは指数バックオフと最大回数を組み合わせ、CLUSTERDOWNやリシャーディング時の一時的な失敗に備えます。redis-cli cluster 接続で疎通とスロット割当を確認し、キー分散とハッシュタグを事前検証します。
-
推奨事項
- タイムアウトは接続/読み書きで分離
- MOVED/ASKでスロットキャッシュ更新
- フェイルオーバー時は指数バックオフで再試行
-
接続確認の観点
- CLUSTER NODESでroleとslotsを確認
- 複数ノードに対する自動リダイレクトの挙動を確認
- 読み取り/書き込み先ノードの整合を検証
クライアント | 主設定項目 | スロットキャッシュ | リトライ方針 | 特記事項 |
---|---|---|---|---|
redis cluster python | timeout、read_from_replicas | 自動更新対応 | バックオフ+最大回数 | パイプライン時の再送制御 |
Predis cluster | clustered options、persistent | 起動同期+MOVED反映 | 例外種別ごと制御 | PHP-FPMの長寿命接続に配慮 |
Jedis | connectionTimeout、soTimeout | キャッシュ+トップology更新 | MOVED/ASK別処理 | Sentinel連携時の差異に注意 |
Spring boot Redis ClusterとRedisCluster Jedisの構成例
Spring boot Redis ClusterではJedisPoolやLettuceのプール設定で接続数上限、最小アイドル、借用時検証を有効化します。TLSはサーバー証明書検証とSNI、ホスト名検証を有効化し、ポートはクラスタのtls専用ポートに合わせます。読み取り分離はreadFromをreplica系に設定できますが、書き込み直後の読み取り整合を要する場合はmaster優先とし、必要ならWAITでレプリケーション確認を行います。RedisCluster JedisではclusterTopology刷新時にプールを安全に更新し、フェイルオーバー中の接続枯渇を防ぎます。監視はCLUSTER INFOとノード遅延、タイムアウト率を合わせて可視化し、スロット移動中の一時的なASK応答をハンドリングします。
-
プール設計
- 最大接続と同時実行をロードに合わせ調整
- JMXやメトリクスで枯渇検知
-
TLS運用
- 期限管理と再配布の手順確立
-
整合性
- 直後整合はmaster読み
- レプリカ読みは遅延を許容範囲に収める
項目 | Spring Boot(Lettuce/Jedis) | RedisCluster Jedis |
---|---|---|
プール | maxTotal、minIdle、testOnBorrow | 同様+トップology変更時の再初期化 |
TLS | truststore/keystore検証 | 証明書ピンニング対応 |
読み取り方針 | master/replica選択 | per-command指定可 |
Node redis clusterとIoredisの実務設定
Node redis clusterとIoredisでは、自動リダイレクト、ハッシュタグ、パイプライン最適化が鍵です。IoredisはMOVED/ASKに自動対応し、スロットマップを都度更新します。ハッシュタグは{user:123}のようにキーに同一タグを付け、関連データを同一スロットへ集約してクロススロットエラーを回避します。パイプラインはスロットごとに分割されるため、タグで同一スロットに寄せると性能が安定します。クライアント側でmaxRedirections、enableReadyCheck、autoResubscribeを適切に設定し、フェイルオーバー時の再送と順序性を担保します。接続確認はCLUSTER SLOTSとPING、書き込み後のGETでリダイレクトの有無とレイテンシを測定します。
-
実務ポイント
- maxRedirections上限でスパイク時の暴走防止
- ハッシュタグでMGET/MSETのクロススロット回避
- パイプラインは小さめバッチでタイムアウトを低減
設定 | Ioredis | Node redis cluster |
---|---|---|
リダイレクト | MOVED/ASK自動追従 | 実装に応じて上限制御 |
ハッシュタグ | {tag}準拠で強制同一スロット | 同様 |
パイプライン | スロット別分割+再送制御 | バッチサイズ調整 |
Redis gemやRedis client gemでのRailsのセッション管理
Railsのセッション管理でRedis gemやRedis client gemを使う場合、redis シャードとはスロットに応じたデータ分散であり、セッションは同一シャード配置が望ましいためハッシュタグで固定します。Keyは{sess:user_id}:sid形式のようにタグと用途を明確化し、名前衝突を防ぎます。有効期限はセッション存続期間とセキュリティ方針に合わせ、絶対期限とスライディング方式のどちらを使うかを決めます。書き込みは原子的に行い、必要に応じてSET EX NXやトークン回転を使います。フェイルオーバー時の一致性を確保するため、読み取りはmaster優先とし、読み取り分離を行う場合は遅延許容と再試行を設計します。redis-cli コマンドでキー配置とTTLを確認し、スロット移動時のセッション欠損を監視します。
-
セッション設計
- ハッシュタグで同一スロット固定
- 意味のあるプレフィックスで整理
- 適切なTTL設定と更新ポリシー
-
可用性
- master読みで直後整合
- リダイレクトと再試行の上限設定
項目 | 推奨設定 | 理由 |
---|---|---|
キー設計 | {sess:uid}:sid | 同一スロット固定と衝突回避 |
有効期限 | ログイン方針に合わせTTLを設定 | セキュリティと容量最適化 |
読み取り方針 | master優先 | 直後整合と一貫性維持 |
運用、監視、スケール:ノード追加や障害対応を仕組み化する
redis cluster nodesを用いた状態確認としきい値設計
redis cluster nodesの出力は、各nodeのrole、connected、slots、link_state、failやhandshakeの有無を一望でき、一次監視の基準になります。加えてCLUSTER INFOでcluster_state、slots_assigned、slots_pfail、slots_failを収集し、しきい値を定義します。ヘルスはcluster_state:ok維持、レイテンシはclient側とnode間の往復時間、同期遅延はreplicaのoffset差で評価します。監視はredis-cli、INFO replication、latency doctorを併用し、警告と自動通知を連動させます。2025年の運用では、可観測性基盤との統合を前提にメトリクス粒度を揃えます。
-
最低限の可視化: cluster_state、link_state、connectedの変化
-
レイテンシ基準: p99の監視と急増検知
-
同期遅延: masterとreplicaのoffset差の上限設定
-
障害フラグ: pfail/failの即時エスカレーション
-
設定ドリフト: cluster-enabled、cluster-config-fileの整合性検知
監視対象 | 取得方法 | 推奨判断軸 | 運用アクション |
---|---|---|---|
cluster_state | CLUSTER INFO | ok維持 | ノード疎通とスロット配分を確認 |
connected/link_state | redis cluster nodes | 接続安定 | ネットワークとポート開放を再確認 |
レイテンシp99 | latency doctor/外形監視 | SLO準拠 | ルーティングとクライアント再試行調整 |
同期遅延 | INFO replication | 閾値超過防止 | レプリカ再配置/帯域調整 |
スロット健全性 | CLUSTER SLOTS | 均等性 | リシャーディング検討 |
フェイルオーバー検証と定期的なスロット再均等化
フェイルオーバーはfailoverが意図通り機能することの事前検証が重要です。計画メンテ時はreplicaの昇格手順、クライアントの再接続、トランザクション再試行の挙動まで標準化します。CLUSTER FAILOVERの制御や、故障想定でのmaster隔離試験を定例化し、復旧時間とデータ整合性を計測します。スロット再均等化は、負荷偏在やノード追加後に実施し、移動量を抑える計画を作ります。ウィンドウは書き込みが低い時間帯に設定し、段階的に移行します。
-
定期演習: 障害単位ごとのRTO測定
-
クライアント検証: リダイレクト処理と再試行間隔
-
ノード健全性: 自動昇格の投票条件の確認
-
スロット計画: 移動対象のキー空間を事前推定
-
影響最小化: バックプレッシャー制御と監視強化
検証項目 | 期待状態 | 観測指標 | 合否基準 |
---|---|---|---|
自動昇格 | 適切なreplicaがmaster化 | failover所要時間 | 目標RTO以内 |
クライアント復帰 | リダイレクト成功 | エラー率/再試行回数 | 一時的上昇のみ |
データ整合 | オフセット差収束 | レプリカ整合指標 | 許容範囲内 |
再均等化 | 負荷平準化 | CPU/帯域/遅延 | 平均化達成 |
リシャーディングと容量計画、バックアップと復旧の標準化
リシャーディングはスロット移動で実施し、トラフィックやキーサイズ、TTL比率を踏まえて段階的に進めます。容量計画はキー数、平均/最大バイト、レプリカ係数、AOFやRDBのオーバーヘッド、ネットワーク帯域を含めて見積もり、ノード追加の判断を明確化します。バックアップはRDBスナップショットの取得とAOF併用のポリシーを定義し、復旧演習で手順と所要時間を検証します。暗号化や検証チェックサムを有効化し、格納先の耐久性要件と復旧地点の選択を事前合意します。
-
段階移行: スロット単位で移動し検証を挟む
-
容量見積: 成長率とピーク時メモリを考慮
-
RDB/AOF: 復旧時間とデータ損失許容のバランス
-
復旧手順: 新規クラスタへのリストアと検証
-
変更管理: 設定と構成情報の版管理
項目 | 主な考慮点 | ツール/コマンド | 成功条件 |
---|---|---|---|
リシャーディング | キー分布/帯域/時間帯 | CLUSTER KEYSLOT/MEET/MIGRATE | 遅延の最小化 |
容量計画 | レプリカ数/オーバーヘッド | INFO memory/キー統計 | 余裕率の確保 |
バックアップ | RDB+AOF方針 | CONFIG/SAVE/appendonly | 復旧検証合格 |
復旧演習 | RTO/RPO検証 | 再構築と整合チェック | 手順の再現性 |
Clusterのクエリの制限に沿ったキー設計とクエリ設計の最適化
redis clusterはスロットに基づくルーティングのため、マルチキー操作は同一スロットに収める必要があります。ハッシュタグ{…}を利用して関連キーのslotsを一致させ、MGETやトランザクション系の制約を回避します。スクリプトやLuaは単一ノードに限定される点を踏まえ、データモデルをシャードフレンドリーに設計します。クエリはredirected時の再試行とタイムアウトを適切に設定し、NodeやPythonなど各クライアントのcluster対応機能を活用します。キー寿命やセッション管理はTTLポリシーを明確化します。
-
ハッシュタグ: {user:123}のように関連データを同一slotsへ
-
集約回避: クロススロット操作を設計段階で排除
-
スクリプト注意: 単一ノード完結に限定
-
タイムアウト: 再試行回数と間隔を調整
-
TTL設計: セッションとキャッシュで差別化
設計領域 | 実装ポイント | 期待効果 | 検証観点 |
---|---|---|---|
キー命名 | ハッシュタグでスロット固定 | クロススロット回避 | エラー率低下 |
クエリ | 単一スロット前提のパターン | レイテンシ安定 | p99改善 |
セッション | TTL/再生成戦略 | メモリ効率 | ヒット率向上 |
失敗時処理 | リダイレクト再試行 | 可用性維持 | 再試行上限制御 |
Kubernetesでの高可用構成とステートフル運用の勘所
redis cluster kubernetesでのStatefulSetと永続ボリューム設計
- アンチアフィニティと再スケジューリング時の安定性を確保する
redis clusterをkubernetesで安定運用するにはStatefulSetと永続ボリュームの組み合わせが要です。各Podに安定したネットワークIDを付与し、PVCでノード障害後もデータを保持します。ゾーン分散のためのトポロジー対応ストレージクラスとPodアンチアフィニティでマスターとレプリカを別ノードへ配置します。リソース要求/制限を正確に定義し、ディスクスループットとネットワーク帯域を確保します。再スケジューリング時は同一PVCを再アタッチし、クラスタリカバリ中のI/Oスパイクを抑制します。
-
推奨ポイント
- トポロジースプレッドでシャードを分散
- Readinessでスロット割当完了後に公開
- PodDisruptionBudgetで同時停止を抑制
設計項目 | 推奨値/方針 | 目的 |
---|---|---|
StatefulSet | ordinal固定/ヘッドレス使用 | 一意性と順序維持 |
StorageClass | ゾーン冗長/高IOPS | 再同期短縮 |
アンチアフィニティ | hostname/zone単位 | 同時障害回避 |
PDB | 最低1台稼働保証 | 可用性確保 |
リソース | CPU/メモリ/帯域確保 | スロット移行安定化 |
サービスエンドポイントとヘッドレスDNSでの接続戦略
- Pod再作成時の到達性維持とエンドポイント安定化を図る
ヘッドレスサービスはredis clusterのノード間通信とスロットリダイレクトに適します。PodのDNS名は安定しており、再作成後もクライアントが正しいノードへ到達しやすくなります。ノード用とクライアント用にサービスを分離し、クライアントにはCluster対応ドライバを使用してMOVED/ASKを処理します。ReadinessはCLUSTER INFOでok確認後に通過させ、未同期ノードをエンドポイントから外します。Livenessは不可逆なスレッドハング検知に限定し、不必要な再起動を避けます。
-
接続の実務指針
- ヘッドレスでpod名解決を利用
- Client/Node用サービス分離
- Readinessはスロット整合性基準
コンポーネント | 用途 | 留意点 |
---|---|---|
Headless Service | ノードディスカバリ | Aレコードでpod一覧 |
Cluster対応クライアント | リダイレクト処理 | キャッシュ更新あり |
Readiness Probe | 公開制御 | cluster_state:ok必須 |
Liveness Probe | 異常回復 | 閾値過敏は禁物 |
オートスケールとローリングアップデート時の注意点
- スロット移行、通信断、再同期の抑制策を示す
オートスケールではレプリカ数の増減は比較的安全ですが、マスターシャードの追加はスロット再配置が発生します。計画的にCLUSTER ADD-NODEとreshardingを段階実行し、帯域制限とバックグラウンド移行で影響を抑えます。ローリングアップデートはマスター→レプリカの順で避け、まずレプリカ更新後にフェイルオーバーを誘発してから旧マスターを更新する戦略が有効です。PDBで同時停止を制限し、HPAはCPU/ネットワーク待ちよりも接続数やレイテンシ指標に基づく方が安定します。
-
実施順序の例
- レプリカ増設→同期完了→読み取り解放
- マスター追加→スロット段階移行
- レプリカ先行更新→フェイルオーバー→旧主更新
操作 | リスク | 抑制策 |
---|---|---|
スケールアウト | 移行渋滞 | 帯域制限/時間帯指定 |
スケールイン | データ偏在 | 再バランス検証 |
ローリング更新 | 短時間断 | 順序制御/PDB |
再同期 | IOスパイク | IOPS保証/圧縮 |
セッション管理やキュー用途での具体パターン
- 一貫性と遅延のバランスを保つ実装指針を示す
セッション管理ではハッシュタグでキーを固定し、リダイレクトを減らして一貫性を保ちます。TTLはログイン状況に応じて短めに設定し、フェイルオーバー時の一時的な再認証を許容する設計が現実的です。キュー用途ではLISTやSTREAMを使い、コンシューマグループでスケールさせます。再配布時の順序影響を避けるため、重要メッセージは冪等処理と再試行間隔を実装します。クライアントはredis-cli cluster接続検証を行い、ioredisやredis-py-clusterなどクラスタ対応を選択します。
-
実装要点
- ハッシュタグでシャード固定
- TTLと再認証の両立
- 冪等処理と可観測性の強化
ユースケース | 推奨機能 | 重要設定 |
---|---|---|
セッション | ハッシュタグ/TTL | 一貫性重視/短TTL |
キュー | STREAM/CG | 再試行/デッドレター |
検証 | redis-cli/INFO | cluster_state/slots |
よくある落とし穴と回避策:デメリットを正しく理解し設計に反映
redis クラスターモード デメリットと設計で避ける方法
redis clusterではクロススロット制約により、MULTIやLuaで複数キーを扱う操作がスロットをまたぐと失敗します。キーにハッシュタグ{user:123}のような共通タグを使い同一スロットへ固定し、パイプラインやトランザクションを成立させます。Luaはキー引数を最小化し、スロット固定のキー範囲内で完結させます。分散ロックや集計はストリームやバッチに分解し、リシャーディング時の整合を保ちます。書き込み集中はシャード数とスロット再配分で均衡化します。セッション管理はsticky設計とスロット固定で一貫性を確保します。
-
ハッシュタグでスロット固定
-
トランザクションは同一スロット設計
-
Luaはキー数とアクセス範囲を限定
-
集計はアプリ層でマージ
-
リシャーディング前後で一時的な整合制御
redis-cli cluster 接続時の典型的エラーと原因の切り分け
redis-cliでcluster接続時のMOVEDはスロット移動を示し、クライアントが指定ノードへ再接続すれば解決します。ASKは一時的なリシャーディング中で、ASKINGを送って該当ノードに実行します。タイムアウトはポート開放不足やネットワーク遅延が原因で、cluster-portと広告アドレス設定(cluster-announce-*)を確認します。TLS不一致は非TLSのポートへTLSで接続する誤りで発生し、–tlsや証明書の設定整合を取ります。読み込み先エラーはREADONLY応答で、書き込みをmasterへ送るようクライアント設定を見直します。
症状/応答 | 主因 | 即時対処 | 恒久対処 |
---|---|---|---|
MOVED | スロット割当変更 | 指定先に再接続 | クライアントにスロット更新を許可 |
ASK | リシャーディング中 | ASKING→実行 | 完了後にスロット更新 |
Timeout | ポート/経路問題 | ネットワーク確認 | announce設定とセキュリティ調整 |
TLS error | 設定不一致 | 接続方式合わせる | 証明書配布とポリシー統一 |
READONLY | replica接続 | masterへ書込 | クライアントの書込先固定 |
-
redis-cliは–cluster-replicasや–tlsを状況に合わせて使用
-
接続先はCluster nodes情報で常に検証
elasticache クラスターモード 変更や移行時の計画ポイント
ElastiCacheでクラスターモードを変更する際は、スロットとシャード再配置に伴う書き込み性能変動を見込み、段階的スケールアウト→データ再配分→読み取りテスト→書き込み切替の順で進めます。互換性はクライアントのcluster対応(ioredis、Jedis、redis-py-clusterなど)を確認し、redis-cliコマンドでCluster nodesとスロット配置を検証します。停止時間はコネクション切替の瞬断に限定し、コネクションプールのリトライとタイムアウトを短く調整します。料金はシャード数とreplica数で変動するため、目標スループットに基づくサイズ選定を行います。
項目 | 事前確認 | 手順要点 | リスク低減 |
---|---|---|---|
クライアント互換 | cluster対応可否 | ドライバ更新 | 接続リトライ設定 |
スロット配分 | 現行/新配置差分 | 段階的移行 | オンラインリシャード |
停止時間 | 切替瞬断 | ローリングで切替 | ヘルス監視で自動復旧 |
料金影響 | シャード/replica | 必要最小構成 | モニタで右サイズ化 |
-
読み取り分散はreplica読み取りを有効化
-
シャード増加時はキーのハッシュタグ設計を維持
既存シングル構成からの移行で発生しやすいデータ不整合
単一ノードからredis clusterへ移行する際は、スロット分散でキー局所性が崩れ、トランザクション整合が損なわれがちです。まずキー命名を見直し、関連データを{tag}で同一スロットへ固定します。段階的移行は、レプリケーションで新クラスタへデータ投入→整合確認→読み取りトラフィックを段階移行→最後に書き込みを切り替えます。TTL差分やexpireドリフトは同期前に凍結ウィンドウを設けて吸収します。セッションやカウンタは二重書き込み期間を設け、差分をジョブで突合します。
-
キー設計: {user:id}などで一貫性確保
-
二重書き込みと読み取りミラーで検証
-
TTLとAOF/RDBの整合チェック
-
リシャーディング時の再試行と冪等化
-
切替はオフピークに実施し監視を強化