Skip to content

"ClusterClient.Ping().Result() error: got 4 elements in cluster info address, expected 2 or 3" when used for accessing redis cluster #2085

Closed
@yuantingzhong

Description

@yuantingzhong

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

  1. 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
  1. 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions