2015年8月12日水曜日

Redis Cluster のデフォルト割り当てられている SLOTS を変更してみた

概要

前回 Redis Cluster を 構築してみました
今回は SLOTS に関して触っていこうと思います
デフォルトで配置される各ノードの SLOTS 情報を個別に変更してみたいと思います
例えばある key は必ずこのノードに保存したいという場合に使います

環境

  • Mac OS X 10.10.4
  • Redis 3.0.2

環境構築

環境構築に関しては前回の記事を参考にしてください

ある key の SLOTS 番号を特定する

CLUSTER KEYSLOTコマンドを使います
例として今回は「hoge_key」という string タイプのキーを特定のノードに保存する方法で紹介したいと思います
まず key から計算される SLOTS 番号を特定します

$ redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER KEYSLOT hoge_key
(integer) 5741

hoge_key に該当する SLOT 番号は 5741 番だということがわかりました
この番号は同じキーに対しては必ず普遍的な番号になるので、何度実行しても同じ番号が返ってくると思います

特定した SLOT 番号がどのノードに割り当てられているか調べる

特定した 5741 の番号だとどのノードに保存されるのか調べてみます
現在の SLOT 割り当て状況を確認するにはCLUSTER SLOTSコマンドを利用します

127.0.0.1:7000> CLUSTER SLOTS
1) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 7001
2) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 7002
3) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 7000

デフォルトだとおそらく上記の結果が返ってくる思います
これの見方ですが、まず一番左のインデックス 1), 2), 3) は各ノード分存在します
次のインデックスの 1), 2) の部分に表示されている数字がそのノードに割り振られている SLOTS 番号になります

今回の 5741 がどこに割り当てられているかと言うと 7001 番になります

1) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 7001

127.0.0.1:7001 は 5461 から 10922 番までの SLOTS が割り当てられているためこの状態で「hoge_key」を SET すると 7001 のノードに保存されることになります
実際に SET コマンドで試してみると以下のようにリダイレクトされていることが確認できると思います

127.0.0.1:7000> SET hoge_key fuga
-> Redirected to slot [5741] located at 127.0.0.1:7001
OK
127.0.0.1:7001> keys *
1) "hoge_key"

ではこの 5741 番が 7000 のノードに保存されるように変更してみたいと思います

SLOTS の情報を変更する

SLOTS の情報を変更するのに使用するコマンドはCLUSTER ADDSLOTSCLUSTER DELSLOTSになります

まずCLUSTER DELSLOTSを実施します
該当の SLOTS 番号が割り当てられているノード上で実行します

127.0.0.1:7001> CLUSTER DELSLOTS 5741
OK

5471 が該当のノードから削除されました
ちなみにこの状態で 7001 のノードのログを確認すると「Cluster state changed: fail」と表示されていると思います
Redis Cluster は必ず指定の範囲の SLOTS が抜けなく全ノードに適用されている必要があります
なので、DELSLOTS をした直後に上記のログが出力されたことになります

SLOTS が削除できたら次にその SLOTS 番号を割り当てたいノード上でADDSLOTSを実行します
とその前にDELSLOTSのコマンドを他のノードでも実行してください
理由はよくわからんのですが、SLOTS 番号が割り当てられていないノードでも該当の SLOTS 番号が有効になっており、それも削除する必要があります
他のノードでも DELSLOTS を実行したらいよいよ ADDSLOTS します
今回は 7000 番のノードに割り当てたいため 7000 番のノード上で実行します

127.0.0.1:7000> CLUSTER ADDSLOTS 5741
OK

実行が完了すると「Cluster state changed: ok」というログが各ノードに表示されると思います
これで SLOTS 番号の変更が完了です

動作確認

では再度「hoge_key」を SET してみましょう

127.0.0.1:7000> SET hoge_key fuga
OK
127.0.0.1:7000> keys *
1) "hoge_key"

今度はリダイレクトされずにちゃんと 7000 番に SET されたことがわかると思います

最後に

Redis Cluster で SLOTS 番号を変更する方法を紹介しました
これを実施中に気づいたのですが、初めに入れた「hoge_key」は 7001 番にリダイレクトされたのですが SLOTS 番号を変更したあとも 7001 番ノードの keys コマンドの結果には現れるようです
ただ、GET コマンドで値を取得しようとすると 7000 番にリダイレクトされてしまいます
つまり 7001 番に存在している hoge_key の値は取得できないけど、存在している謎の値になってしまいました

おそらく今回紹介したDELSLOTS, ADDSLOTSは初期構築やサービス停止しても問題ない状況で使用するコマンドだと思います(SLOTS 番号が 1 つでもない状態になると status is fail になることも確認したので)
構築時に使用した Ruby のredis-trib.rbとか使うといい感じやってくれそうな気がします(詳しくは調べていません)
その辺りは公式の Redis Cluster tutorial を見てもらうとヒントがあるかもしれません
「ダウンタイム 0 で SLOTS 番号を変更する方法」自分も気になったので時間があったら調査してみたいと思います

参考サイト

0 件のコメント:

コメントを投稿