ラノベのタイトルみたいになってしまいましたが気のせいです。いい要約が思いつかなかっただけです。
要するに、GolangのDockerコンテナからRedisクラスター用のスロットを作成しようとしたら"Invalid or out of range slot"というエラーが出てしまったわけです。
アホらしいオチなので最初の再現手順だけで原因がわかる人もいるでしょうが、思い込みが激しく解決に丸一日かかったので、未来の自分&他のドジっ子のために残しておきます。
再現手順
手元のマシンでこんなコマンドを実行してみてください。
コンテナ用のネットワークを作成
$ docker network create redis-network df3496acd9c313fae28f34b00dc4f0df1a3351fe31f60d148d2daaf78f92b8e2
Redisコンテナを起動
$ docker run --name redis-node --network redis-network -d redis:6-alpine redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 500fdfd7769fc74a5e511d7e005ab112330bbd771c4cb0659178703f8c17e536
Golangのコンテナを起動
$ docker run -it --name go-test --network redis-network golang:1.14-alpine # /go # /go # apk add redis # Goコンテナにredis-cliを入れる fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz (1/1) Installing redis (5.0.9-r0) Executing redis-5.0.9-r0.pre-install Executing redis-5.0.9-r0.post-install Executing busybox-1.31.1-r19.trigger OK: 8 MiB in 16 packages /go # /go # redis-cli -h redis-node cluster addslots {0..16383} # スロット作成! (error) ERR Invalid or out of range slot
最後のスロット作成でエラーが起きています。
するどい人はこの時点で原因がわかったはず。
うまくいく場合
ホストマシン(LinuxやMac)からは問題なくスロット作成できました。もちろんRedisコンテナを起動する時には-p "6379:6379"
オプションをつけてRedisコンテナを起動していればの話ですが。
なので、コンテナ間の通信が何かおかしいのかなー。でもそれだとエラーメッセージはconnection refusedみたいな通信関連のにならなきゃおかしいよなーと考えていました。
Redisのソースコードをあたってみる
ソースコードのエラーメッセージの箇所を確認。
うーん、0から16383までだから特に変な値も指定してないし。。。やっぱわからん。
( ゚д゚)ハッ!
そんなこんなで1日ほど悩んだある日(要するに翌日)
本家のリポジトリーでこんなissueを見つけました。
{num..num}
brace expansion is a
bashism
ほんまや!
なぜかredis-cliでスロットの範囲指定をするときの記法だと思ってた!
Goのコンテナに使ったAlpineではBashではなくshが起動しているので、ブレース記法を展開できなかったわけですな。
これで解決
というわけで、最終的にこれで解決。コンテナ間の通信云々は関係ありませんでした。
/go # redis-cli -h redis-node cluster addslots $(seq 0 16383) # スロット作成! OK
これならshでもBashでも使えます。
だからアホらしいオチと言ったでしょう。
0 件のコメント:
コメントを投稿