概要
前回 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 ADDSLOTS
とCLUSTER 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 件のコメント:
コメントを投稿