如何访问集群实例

本指南演示如何使用符合行业标准的客户端库与 Redis Cluster 实例建立连接。示例涵盖 go-redis、Jedis、Lettuce 和 Redisson 的配置详细信息。如需了解其他客户端选项,请参阅使用 Redis 客户端 API 库连接。

身份验证要求

Redis Cluster 实例支持以下身份验证选项:

  • 密码身份验证:配置密码后,所有客户端连接都必须提供有效凭据
  • 无密码访问:如果在创建实例期间禁用设置密码选项,客户端无需进行身份验证即可连接
安全最佳实践

对于生产环境,强烈建议实施密码身份验证,以保护您的数据。有关配置和维护安全凭据的详细说明,请参阅用户管理。

连接端点参考

集群内部访问

对于部署在同一 Kubernetes 集群中的应用,可以通过集群内访问部分下的访问方式选项卡使用内部访问端点。

参数描述
连接地址Redis Cluster 中每个分片对应的 Kubernetes 服务名称和端口组合

集群外部访问

对于从 Kubernetes 环境外部进行连接的应用,在创建实例期间配置后即可使用外部访问端点。这些端点可以在从集群外部访问部分下的访问方式选项卡中找到。

端点类型描述
分片地址Redis Cluster 中分片 Pod 的外部 IP 地址和端口,用于从 Kubernetes 网络外部建立连接

交互式调试

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

  1. 从实例详情页面访问终端控制台

  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 标志可自动跟随 MOVED 和 ASK 重定向,这对于使用 Redis Cluster 至关重要。

客户端集成示例

以下示例演示了使用各种客户端库连接到 Redis Cluster 实例的最佳实践。

go-redis
Jedis
Lettuce
Redisson
package main

import (
    "context"
    "fmt"
    "time"
    // It is recommended to periodically upgrade to the latest version of the client for the latest bug fixes.
    "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()
        },
        // Client name for tracking purposes
        ClientName: "go-demo",
        // Use Context for timeout control
        ContextTimeoutEnabled: true,
        // Maximum number of redirects in case of MOVED or ASK
        MaxRedirects: 3,
        // Maximum number of retries
        MaxRetries: 3,
        // Minimum retry backoff
        MinRetryBackoff: 20 * time.Millisecond,
        // Maximum retry backoff
        MaxRetryBackoff: 200 * time.Millisecond,
        // Connection timeout
        DialTimeout: 3 * time.Second,
        // Read timeout
        ReadTimeout: 5 * time.Second,
        // Write timeout
        WriteTimeout: 10 * time.Second,
        // Connection pool size for each node
        PoolSize: 100,
        // Maximum wait time for available connections in the pool
        PoolTimeout: time.Second,
        // Minimum number of idle connections for each node
        MinIdleConns: 5,
        // Maximum number of idle connections for each node
        MaxIdleConns: 10,
        // Maximum number of active connections for each node
        MaxActiveConns: 100,
        // Maximum idle time for connections
        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 文档