Closed
Description
Issue tracker is used for reporting bugs and discussing new features. Please use
stackoverflow for supporting issues.
go-redis reports error when it is used to access redis-cluster
Expected Behavior
go-redis/redis should works well with redis cluster
Current Behavior
go-redis/redis ClusterClient.Ping().Result() reports error "got 4 elements in cluster info address, expected 2 or 3" (my redis cluster has six nodes)
Possible Solution
Steps to Reproduce
- I build my redis cluster with docker and the redis's version is
"GOSU_VERSION=1.14",
"REDIS_VERSION=7.0.0",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.0.tar.gz",
and my go version is
# go version
go version go1.18.1 linux/amd64
- I am sure my redis cluster works well, for example, I make a test with redis-cli as follows
root@hecs-18053-0002:/home/root/code/redis-cluster/cmd# docker run -it --rm redis redis-cli -c -h 192.168.0.28 -p 6700 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.0.28:6700> cluster nodes
27bfce46e99d870f7ca4ae5c51df30737581e0cf 192.168.0.180:6901@16901 master - 0 1651637749193 7 connected 0-5460
d93f9f77dc49e7177f6cadf6f32cd27e1ed4ead0 192.168.0.28:6900@16900 slave 27139ca982574acfb125a9d0421d99c47789f7c4 0 1651637750196 3 connected
c3c553a61c78fcdfd07ba6c72402f1d0a23bc006 192.168.0.141:6902@16902 slave f366d818f6c5cdf4ab7843ca8a14f39d58e0fa9d 0 1651637748189 2 connected
27139ca982574acfb125a9d0421d99c47789f7c4 192.168.0.141:6702@16702 master - 0 1651637748000 3 connected 10923-16383
fab30d84431b0e7cebdf0ed257b99e3192ba2d8d 192.168.0.28:6700@16700 myself,slave 27bfce46e99d870f7ca4ae5c51df30737581e0cf 0 1651637749000 7 connected
f366d818f6c5cdf4ab7843ca8a14f39d58e0fa9d 192.168.0.180:6701@16701 master - 0 1651637751199 2 connected 5461-10922
192.168.0.28:6700> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:7
cluster_stats_messages_ping_sent:45321
cluster_stats_messages_pong_sent:45740
cluster_stats_messages_sent:91061
cluster_stats_messages_ping_received:45740
cluster_stats_messages_pong_received:45321
cluster_stats_messages_update_received:5
cluster_stats_messages_received:91066
total_cluster_links_buffer_limit_exceeded:0
192.168.0.28:6700>
192.168.0.28:6700> keys *
1) "add"
2) "abb"
3) "bbb"
4) "kkkkkk"
5) "age"
6) "aac"
192.168.0.28:6700>
When I set or get key with redis-cli, it works well.
3. Then I test with a simple go program, as follows
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
func main() {
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Password: "123456",
Addrs: []string{"192.168.0.28:6700", "192.168.0.180:6701", "192.168.0.141:6702", "192.168.0.28:6900", "192.168.0.180:6901", "192.168.0.141:6902"},
})
_, err := rdb.Ping(context.Background()).Result()
if err != nil {
panic(err)
}
err = testString(rdb)
if err != nil {
panic(err)
}
}
func testString(client *redis.ClusterClient) error {
key := "mykey"
err := client.Set(context.Background(), key, "myvalue", time.Minute).Err()
if err != nil {
fmt.Println("set err", err)
return err
}
fmt.Println("--------------------------------------")
for i := 0; i < 6; i++ {
keyCnt, err := client.Exists(context.Background(), key).Result()
if err != nil {
fmt.Println("client.Exists error: ", err)
}
fmt.Println("client.Exists val: ", keyCnt)
val, err := client.Get(context.Background(), key).Result()
if err != nil {
if err == redis.Nil { // key does not exist
fmt.Println("key not exist")
} else {
fmt.Println("Get err", err)
return err
}
} else {
fmt.Printf("key: %v, value:%v\n", key, val)
}
time.Sleep(15 * time.Second)
}
return nil
}
build and run this program, it report error, as follows
# ./main
panic: got 4 elements in cluster info address, expected 2 or 3
goroutine 1 [running]:
main.main()
/home/root/code/redis-cluster/cmd/main.go:19 +0x171
I think this is a bug, please check and fix it. Thank you very much!
Context (Environment)
Detailed Description
Possible Implementation
Metadata
Metadata
Assignees
Labels
No labels