3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

暗号化したRedis-clusterでマルチシャードにした時のデータ取得方法

Last updated at Posted at 2021-07-02

前提

Redis構成

  • cluster
    • 0001シャード(slot:0-8191)
      • 0001-001マスターノード
      • 0001-002スレーブノード
    • 0002シャード(slot:8192-16383)
      • 0002-001マスターノード
      • 0002-002スレーブノード

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 の動き

  1. 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"
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?