如何访问哨兵实例

本指南展示了如何使用行业标准的客户端库连接 Redis 哨兵实例。示例包括 go-redisJedisLettuceRedisson 的配置细节。有关其他客户端选项,请参见 Redis 客户端兼容矩阵

目录

认证要求

Redis 哨兵实例实现以下认证选项:

  • 密码认证:当配置了密码时,所有客户端连接必须提供有效的凭证。
  • 无密码访问:如果在实例创建时禁用了 设置密码 选项,客户端可以无认证连接。
安全最佳实践

在生产环境中,强烈建议实现密码认证以保护您的数据。有关配置和维护安全凭证的详细说明,请参见 用户管理

连接端点参考

内部集群访问

对于部署在相同 Kubernetes 集群的应用程序,可以通过 访问方式 页签下的 集群内访问 部分获取内部访问端点。

参数说明
连接地址Kubernetes 服务名称与 Redis 哨兵的端口组合。

外部集群访问

如果在创建实例时启用了 外部访问 方法,客户端可以通过实例 访问方式 页签下的 外部访问 部分的地址连接到 Redis。

参数说明
哨兵节点访问地址Redis 哨兵中 Pods 的外部 IP 地址和端口,允许从 Kubernetes 网络外部进行连接。

交互式调试

在实例详细信息页面,单击右上角的 终端控制台,并使用 redis-cli 命令连接每个 Redis 节点。

redis-cli -h <内部路由 IP> -p 6379

下面是一个调试示例。演示 set/get 的调试会话:

192.168.0.10:6379> set a 1
OK
192.168.0.10:6379> get a
"1"
192.168.0.10:6379>

客户端集成示例

以下示例展示了如何使用各种客户端库连接 Redis 哨兵实例的最佳实践。

注意:哨兵模式中注册的主从集群名称固定为 mymaster

go-redis
Jedis
Lettuce
Redisson
package main

import (
    "context"
    "fmt"
    "time"

    // 建议定期升级到客户端的最新版本,以获得最新的 bug 修复。
    "github.com/redis/go-redis/v9"
)

func main() {
    client := redis.NewFailoverClient(&redis.FailoverOptions{
        SentinelAddrs: []string{"<address>"},
        MasterName:    "mymaster",
        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,
        // 最大重试次数
        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)
    }
}

更多详细配置请参考 社区文档