如何访问集群实例

本指南演示如何使用业界标准客户端库连接 Redis Cluster 实例。示例涵盖了 go-redisJedisLettuceRedisson 的配置细节。更多客户端选项,请参阅 Connect with Redis client API libraries

目录

认证要求

Redis Cluster 实例支持以下认证选项:

  • 密码认证:配置密码后,所有客户端连接必须提供有效凭据
  • 无密码访问:如果实例创建时未启用 Set Password 选项,客户端可无认证连接
安全最佳实践

生产环境强烈建议启用密码认证以保护数据安全。详细配置和维护安全凭据请参考 User Management

连接端点参考

集群内部访问

对于部署在同一 Kubernetes 集群内的应用,可通过 Access Method 标签页中 Access within the Cluster 部分获取内部访问端点。

参数说明
Connection AddressRedis Cluster 中每个分片对应的 Kubernetes 服务名和端口组合

集群外部访问

对于集群外部连接的应用,若实例创建时配置了外部访问端点,可在 Access Method 标签页中 Access from outside the Cluster 部分查看。

端点类型说明
Shard AddressRedis Cluster 中分片 Pod 的外部 IP 和端口,支持 Kubernetes 网络外部的连接

交互式调试

对于管理操作和故障排查,Redis CLI 提供了直接访问集群节点的方式:

  1. 在实例详情页打开 Terminal Console

  2. 使用集群感知客户端模式连接任意节点:

    redis-cli -c -h <internal-routing-ip> -p 6379

示例调试会话,展示基于槽的重定向:

192.168.0.10:6379> set a 1
-> Redirected to slot [15495] located at 192.168.0.10:6379
OK
192.168.0.10:6379> get a
"1"
192.168.0.10:6379>

-c 参数启用自动跟随 MOVEDASK 重定向,使用 Redis Cluster 时必不可少。

客户端集成示例

以下示例展示了使用不同客户端库连接 Redis Cluster 实例的最佳实践。

go-redis
Jedis
Lettuce
Redisson
package main

import (
    "context"
    "fmt"
    "time"
    // 建议定期升级客户端至最新版本以获得最新的 bug 修复。
    "github.com/redis/go-redis/v9"
)

func main() {
    client := redis.NewClusterClient(&redis.ClusterOptions{
        Addrs:    []string{"<address>"},
        Password: "<password>",
        OnConnect: func(ctx context.Context, conn *redis.Conn) error {
            ctx, cancel := context.WithTimeout(ctx, 500*time.Millisecond)
            defer cancel()
            return conn.Ping(ctx).Err()
        },
        // 用于追踪的客户端名称
        ClientName: "go-demo",
        // 启用 Context 进行超时控制
        ContextTimeoutEnabled: true,
        // MOVED 或 ASK 重定向的最大次数
        MaxRedirects: 3,
        // 最大重试次数
        MaxRetries: 3,
        // 最小重试间隔
        MinRetryBackoff: 20 * time.Millisecond,
        // 最大重试间隔
        MaxRetryBackoff: 200 * time.Millisecond,
        // 连接超时
        DialTimeout: 3 * time.Second,
        // 读取超时
        ReadTimeout: 5 * time.Second,
        // 写入超时
        WriteTimeout: 10 * time.Second,
        // 每个节点的连接池大小
        PoolSize: 100,
        // 连接池中等待可用连接的最大时间
        PoolTimeout: time.Second,
        // 每个节点的最小空闲连接数
        MinIdleConns: 5,
        // 每个节点的最大空闲连接数
        MaxIdleConns: 10,
        // 每个节点的最大活跃连接数
        MaxActiveConns: 100,
        // 连接最大空闲时间
        ConnMaxIdleTime: time.Minute * 5,
    })
    defer client.Close()

    if val, err := client.Get(context.TODO(), "test").Result(); err != nil {
        panic(err)
    } else {
        fmt.Println(val)
    }
}

更多详细配置请参考 Community Documentation