Skip to content

Redisクラスターのキー配置

  • ノード: クラスターを構成するインスタンス
  • シャード: プライマリノードとレプリカノードで構成する論理グループ
  • プライマリノード: シャード1つに必ず1つ必要
  • レプリカノード: シャード1つにつき0〜5つ存在するリードレプリカ
  • スロット: キーがどのシャードに格納されるのかを示す値
  • キースペース: (おそらく)シャードが管理するスロットの範囲

ElastiCache固有の話はElastiCache Redisを構成するコンポーネントにもある。

キーの名前から、どのシャードに保存されるかを決定するための番号。

Redisクラスター全体で常に 0〜16,38316,384 スロットを管理する。クラスターを構成するシャードは個別にスロットが割り当たっている。3つのシャードで分割する場合は 5461 個ずつ割り当てる。シャードの数によって割り切れない場合は、余った分が最後のシャードに合算されるようにみえるが確証はない。

16,384 の意味はwhy redis-cluster use 16384 slots?でメンテナから回答がある。ノード間で交換するハートビートパケットのサイズを抑えつつ、1,000シャードを超えることはないだろうという仮定で決まったらしい。

クライアントがキーにアクセスしたとき、キーの名前からスロットを計算して、そのスロットを管理しているシャードに対して操作を行う。キーの名前に {} を含む場合、その範囲内(かっこ自体は含まない)の文字だけでスロットを計算する。クライアントの接続したプライマリノードがスロットを管理していない場合、どのノードにあるのかをサーバが返す。

有効な場合はRedisクラスターに複数のシャードが存在する、無効ならシャード1つ

シャードを追加または削除したとき

Section titled “シャードを追加または削除したとき”

追加したときは、追加されたシャードを含めてスロットがうまくバランスするような再配置が行われる。スロットが割り切れないときの余りを考えないとすると、3シャードでそれぞれ 5,461 個のスロットを持っていたクラスターに2台のシャードを追加したとき、それぞれが 3,276 個ずつスロットを持つ状態となるよう持ちスロットを再配置する。Redis Enterpriseには自動でこれを行う機能があるらしい。

削除のときは、削除されるシャードが持つスロットを他のシャードへ一旦全部移す。そのうえで再配置をするとバランスされる。

Terminal window
redis-cli --cluster reshard 192.168.1.1:6379 \
--cluster-from xx \
--cluster-to yy \
--cluster-slots n \
--cluster-yes
redis-cli --cluster check 192.168.1.1:6379
redis-cli --cluster rebalance 192.168.1.2:6379
redis-cli --cluster del-node 192.168.1.1:6379 xx

リシャーディング(re-sharding)とかリバランシング(re-balancing)と呼ぶ。