前提
Redis構成
- cluster
- 0001シャード(slot:0-8191)
- 0001-001マスターノード
- 0001-002スレーブノード
- 0002シャード(slot:8192-16383)
- 0002-001マスターノード
- 0002-002スレーブノード
- 0001シャード(slot:0-8191)
redis-cli設定
参考サイト
ElastiCache for Redis転送時の暗号化 (TLS)
redis-cli.conf
fips = no
setuid = root
setgid = root
pid = /var/run/stunnel.pid
debug = 7
options = NO_SSLv2
options = NO_SSLv3
[redis-cli]
client = yes
accept = 127.0.0.1:6379
connect = [クラスターのエンドポイント]
事象
取得出来るデータと出来ないデータがある
get [キー名]
上記コマンドを実行するとキーに紐づくバリューが取得できるのだが、バリューが取得出来る時もあるが、出来ない時もある。
取得出来ない時の動き:Redirected to slot コメントが表示されるが、一生リダイレクトされない。
localhost:6379> get hoge
-> Redirected to slot [9282] located at hoge-0002-001.hoge.zfxhaf.apne1.cache.amazonaws.com:6379
原因
シャード0001にはアクセス出来ているが、シャード0002にはアクセスできていない
Redirected to slot の動き
- 6379番ポートのノードでget hogeが実行される
- Redis-clusterは hogeをアルゴリズムにかける
- 結果として9282がでる
- 9282番スロットは6379番ポートのノードでは対応していないので、Redis-clusterがクライアントの向き先を6379番ポートのノードから6380番ポートのノードに変える
- 値をセットする
- セットできたらクライアントにOKと返す
「Redirected to slot の動き 」参考サイト
[実演]Redis Clusterの仕組みを完全に理解する
対応
redis-cli.confファイルを修正する
変更前
fips = no
setuid = root
setgid = root
pid = /var/run/stunnel.pid
debug = 7
options = NO_SSLv2
options = NO_SSLv3
[redis-cli]
client = yes
accept = 127.0.0.1:6379
connect = clustercfg.hoge.zfxhaf.apne1.cache.amazonaws.com:6379
変更後
fips = no
setuid = root
setgid = root
pid = /var/run/stunnel.pid
debug = 7
options = NO_SSLv2
options = NO_SSLv3
[redis-cli shard0001]
client = yes
accept = 127.0.0.1:6379
connect = hoge-0002-001.hoge.zfxhaf.apne1.cache.amazonaws.com:6379
[redis-cli shard0002]
client = yes
accept = 127.0.0.1:6380
connect = hoge-0002-001.hoge.zfxhaf.apne1.cache.amazonaws.com:6379
- 変更点
- 接続先にクラスターエンドポイントを指定していたが、マスターノードのエンドポイントを指定する。
- ノード毎にポートを分ける(6379、6380)
セキュリティグループでポート6380を許容する
stunnel再起動
sudo pkill stunnel
sudo stunnel /etc/stunnel/redis-cli.conf
redisにアクセスし、バリューを取得しようとしたがスロット範囲がシャード0002の場合、リダイレクトは出来なかった。
redis-cli -h localhost -p 6379 -a hogehoge -c
localhost:6379> get hoge
-> Redirected to slot [10439] located at hoge-0002-001.hoge.zfxhaf.apne1.cache.amazonaws.com:6379
問題点:クラスターを単一のシャードではなく、複数のシャードはどのように設定すればいいのか?
同じ問題を抱えている人がstackoverflowいたが答えが投稿されていなかった。
回避策
根本解決ではないが、別シャードのデータを取得する方法はある。
シャード0002の値を取得したい場合は、シャード0001からexitし、シャード0002にアクセスする(接続するポートを変更する)
redis-cli -h localhost -p 6380 -a hogehoge -c
localhost:6380> get hoge
"piyo"