redis集群正常,但是接入代码报错出现clusterdown the cluster is down 解决过程

最近再公司项目测试的遇到这个问题。记录解决过程
查看redis节点配置,显示redis节点配置正常。

 使用工具连接redis集群也没问题

一般用redis工具连接写入数据正常就代表redis集群没什么问题

代码接口看是否设置了集群模式,添加一个支持集群的池go写的话需要设置goredis集群模式才可以连接,使用redisclent是连接不到集群的。
可以先写一份测试连接集群代码,连接没有问题再迁移到项目中。
参考代码如下

确保您的 Redis 客户端库正确配置了集群连接。使用 go-redis 时,需要创建一个集群客户端实例,如下所示:


import (
    "github.com/go-redis/redis/v8"
    "context"
)

func newRedisClusterClient() *redis.ClusterClient {
    return redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{
            "192.168.1.34:6379",
            "192.168.1.34:6380",
            "192.168.1.34:6381",
            // 添加更多集群节点地址
        },
    })
}

func main() {
    ctx := context.Background()
    client := newRedisClusterClient()

    // 测试连接
    _, err := client.Ping(ctx).Result()
    if err != nil {
        log.Fatalf("Could not connect to Redis: %v", err)
    }
    log.Println("Connected to Redis cluster")
}


#使用 go-redsync 的示例代码
#如果您使用 go-redsync 进行分布式锁处理,请确保连接设置正确,并捕获可能的错误:
import (
    "github.com/go-redsync/redsync/v4"
    "github.com/go-redsync/redsync/v4/redis/goredis/v8"
    "github.com/go-redis/redis/v8"
    "context"
    "log"
)

func newRedsync() *redsync.Redsync {
    pool := goredis.NewPool(newRedisClusterClient())
    return redsync.New(pool)
}

func main() {
    ctx := context.Background()
    rs := newRedsync()

    m := rs.NewMutex("my-global-mutex")

    if err := m.LockContext(ctx); err != nil {
        log.Fatalf("Failed to acquire lock: %v", err)
    }

    log.Println("Lock acquired")
    if ok, err := m.UnlockContext(ctx); !ok || err != nil {
        log.Fatalf("Failed to release lock: %v", err)
    }

    log.Println("Lock released")
}


检查 actOnPoolsAsync 方法
从您的代码截图中可以看出,actOnPoolsAsync 方法用于在池中执行异步操作。确保所有池都正确初始化,并且没有网络或连接问题:

func (m *Mutex) actOnPoolsAsync(actFn func(redis.Pool) (bool, error)) (int, error) {
    var (
        taken   []string
        err     error
        ch      = make(chan result, len(m.pools))
        ctx     = context.Background()
    )

    for _, pool := range m.pools {
        go func(pool redis.Pool) {
            status, e := actFn(pool)
            ch <- result{statusOK: status, err: e, node: pool.Addr()}
        }(pool)
    }

    for range m.pools {
        r := <-ch
        if r.statusOK {
            taken = append(taken, r.node)
            err = multierror.Append(err, nil)
        } else {
            err = multierror.Append(err, r.err)
        }
    }

    return len(taken), err
}



#增加调试日志
#在代码中增加更多的日志记录,以便更好地了解错误发生的原因。例如:

if r.err != nil {
    log.Printf("Error on node %s: %v", r.node, r.err)
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值