#如何访问 Sentinel 实例
本指南演示如何使用行业标准客户端库连接到 Redis Sentinel 实例。示例涵盖了 go-redis、Jedis、Lettuce 和 Redisson 的配置细节。更多客户端选项,请参见 Connect with Redis client API libraries。
#认证要求
Redis Sentinel 实例支持以下认证选项:
- 密码认证:配置密码后,所有客户端连接必须提供有效凭据
- 无密码访问:如果实例创建时禁用 Set Password 选项,客户端可无认证连接
安全最佳实践
生产环境强烈建议启用密码认证以保护数据安全。详细配置和维护安全凭据请参见 User Management。
#连接端点参考
#集群内访问
对于部署在同一 Kubernetes 集群内的应用,可通过 Access Method 标签页中 Access within the Cluster 部分获取内部访问端点。
| 参数 | 说明 |
|---|---|
| Connection Address | Redis Sentinel 的 Kubernetes 服务名称和端口组合。 |
#集群外访问
对于从 Kubernetes 外部连接的应用,若实例创建时配置了外部访问,则可在 Access Method 标签页中 Access from outside the Cluster 部分查看外部访问端点。
| 参数 | 说明 |
|---|---|
| Sentinel Node Access Address | Redis Sentinel 中 sentinel pod 的外部 IP 地址和端口,支持从 Kubernetes 网络外部连接。 |
#交互式调试
在实例详情页,点击右上角的 Terminal Console,使用 redis-cli 命令连接到各 Redis 节点。
redis-cli -h <internal-routing-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 Sentinel 实例的最佳实践。
注意:Sentinel 模式下注册的主从集群名称固定为
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)
}
}更多详细配置请参见 community documentation。
package io.alauda.demo.redis;
// 建议定期升级客户端至最新版本以获得最新的 bug 修复。
import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.HostAndPort;
import java.time.Duration;
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String []args) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 设置连接池最大大小,-1 表示不限制。当前连接数超过该值时,新连接将失败。
poolConfig.setMaxTotal(200);
// 设置最大空闲连接数;超过该数的空闲连接将被立即释放。
poolConfig.setMaxIdle(10);
// 设置最小空闲连接数;低于该数时将创建新的空闲连接。
poolConfig.setMinIdle(3);
// 当无可用连接且达到最大连接数时,业务最大等待时间。
poolConfig.setMaxWait(Duration.ofSeconds(1));
// 借用连接时通过 ping 验证连接有效性。
poolConfig.setTestOnBorrow(true);
// 测试空闲连接,查找并释放无效连接;仅当 timeBetweenEvictionRunsMillis 大于 1ms 时生效。
poolConfig.setTestWhileIdle(true);
// 设置连接最小空闲时间;超过该时间的连接将被释放,-1 表示不释放;仅当 timeBetweenEvictionRunsMillis 大于 0 时生效。默认值为 30 分钟。
poolConfig.setMinEvictableIdleDuration(Duration.ofMinutes(5));
// 每次空闲连接检测时验证的连接数;-n 表示 1/n 的连接数。
poolConfig.setNumTestsPerEvictionRun(-1);
// 空闲连接检测间隔;-1 表示禁用。
poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(1));
DefaultJedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
// 客户端名称,用于调试和追踪连接来源。
.clientName("demo-jedis")
// TCP 连接超时
.connectionTimeoutMillis(2000)
// 命令超时
.timeoutMillis(10000)
.password("<password>")
.build();
DefaultJedisClientConfig sentinelConfig = DefaultJedisClientConfig.builder()
.connectionTimeoutMillis(2000)
.timeoutMillis(10000)
.build();
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("<ip1>", <port1>));
nodes.add(new HostAndPort("<ip2>", <port2>));
JedisSentinelPool pool = new JedisSentinelPool("mymaster", nodes, poolConfig, clientConfig, sentinelConfig);
try {
try (Jedis jedis = pool.getResource()) {
String val = jedis.get("test");
System.out.printf("%s", val);
}
} catch (Exception e) {
e.printStackTrace();
}
pool.close();
}
}更多详细配置请参见 community documentation。
package io.alauda.demo.redis;
// 建议定期升级客户端至最新版本以获得最新的 bug 修复。
import io.lettuce.core.*;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.support.ConnectionPoolSupport;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import java.time.Duration;
import java.util.List;
public class Main {
public static void main(String[] args) {
RedisURI.Builder redisUriBuilder = RedisURI.builder();
redisUriBuilder.withSentinel(RedisURI.create("<ip1>", <port1>));
redisUriBuilder.withSentinel(RedisURI.create("<ip2>", <port2>));
redisUriBuilder.withPassword("<password>");
// 客户端名称,用于调试和追踪连接来源。
redisUriBuilder.withClientName("demo-lettuce");
redisUriBuilder.withSentinelMasterId("mymaster");
// 设置客户端连接超时
redisUriBuilder.withTimeout(Duration.ofSeconds(2));
RedisURI redisUri = redisUriBuilder.build();
// 配置 SocketOptions
SocketOptions socketOptions = SocketOptions.builder()
// 设置连接超时
.connectTimeout(Duration.ofSeconds(10))
.tcpNoDelay(true)
// 启用 TCP keepalive 以快速检测断开连接
// 对于非 pub/sub 类型请求,该值非严格必要;可通过及时释放空闲连接维持连通性。
.keepAlive(true)
.build();
ClientOptions clientOptions = ClientOptions.builder()
.socketOptions(socketOptions)
// 连接自动重连
.autoReconnect(true)
// 配置连接断开时客户端行为
// DEFAULT - 当 autoReconnect = true 时,剩余命令不会被拒绝;否则命令将被拒绝
.disconnectedBehavior(ClientOptions.DisconnectedBehavior.DEFAULT)
.build();
RedisClient redisClient = RedisClient.create(redisUri);
redisClient.setOptions(clientOptions);
// 连接池配置
GenericObjectPoolConfig<StatefulRedisConnection<String, String>> poolConfig = new GenericObjectPoolConfig<>();
// 连接池大小不宜过大,否则可能浪费服务器连接资源,甚至耗尽连接数导致实例自身健康检查失败。
// 估算业务并发量,建议并发量为业务规模的 1.2-1.5 倍。
poolConfig.setMaxTotal(200);
// 保留最小空闲连接数以加快业务响应。
poolConfig.setMinIdle(3);
// 最大空闲连接数;超过该数的空闲连接将被立即释放。
poolConfig.setMaxIdle(10);
// 设置连接最小空闲时间;超过该时间的连接将被释放;-1 表示不释放;仅当 timeBetweenEvictionRunsMillis 大于 0 时生效。默认值为 30 分钟。
poolConfig.setMinEvictableIdleDuration(Duration.ofMinutes(5));
// 每次空闲连接检测时验证的连接数;-n 表示 1/n 的连接数。
poolConfig.setNumTestsPerEvictionRun(3);
// 空闲连接检测间隔;-1 表示禁用。
poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(1));
// 当无可用连接且达到最大连接数时,业务最大等待时间。
poolConfig.setMaxWait(Duration.ofSeconds(1));
// 借用连接时通过 ping 验证连接有效性。
poolConfig.setTestOnBorrow(true);
// 测试空闲连接,查找并释放无效连接;仅当 timeBetweenEvictionRunsMillis 大于 1ms 时生效。
poolConfig.setTestWhileIdle(true);
GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(redisClient::connect, poolConfig);
try {
try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) {
String val = connection.sync().get("test");
System.out.printf("%s", val);
}
} catch (Exception e) {
e.printStackTrace();
}
pool.close();
}
}更多详细配置请参见 community documentation。
package io.alauda.demo.redis;
// 建议定期升级客户端至最新版本以获得最新的 bug 修复。
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<String> nodes = new ArrayList<>();
nodes.add("redis://<ip1>:<port1>");
nodes.add("redis://<ip2>:<port2>");
Config config = new Config();
config.setNettyThreads(64)
.useSentinelServers()
.addSentinelAddress(nodes.toArray(new String[0]))
.setPassword("<password>")
.setMasterName("mymaster")
// 启用 sentinel 节点发现。
.setSentinelsDiscovery(true)
// 每 30 秒测试连接可用性。
// 若启用 KeepAlive,该值可相应调大。
.setPingConnectionInterval(30000)
// 集群拓扑扫描间隔。
.setScanInterval(2000)
// 连接超时。
.setConnectTimeout(10000)
// 命令超时。
.setTimeout(10000)
// 空闲连接超时,设置为 60 秒,避免默认过短。
.setIdleConnectionTimeout(60000)
// 连接池大小,不宜过大,避免浪费服务器连接资源或耗尽连接数导致实例自身健康检查失败。
// 估算业务并发量,建议并发量为业务规模的 1.2-1.5 倍。
.setMasterConnectionPoolSize(200)
// 保留最小空闲连接数以加快业务响应。
.setMasterConnectionMinimumIdleSize(3)
// 失败命令重试次数。
.setRetryAttempts(3)
// 失败命令重试间隔。
.setRetryInterval(1500)
// 启用 TCP KeepAlive 机制以快速检测断开连接。
.setKeepAlive(true)
// 启用 TCP no delay。
.setTcpNoDelay(true)
// 客户端名称,用于调试和追踪连接来源。
.setClientName("demo-redisson");
RedissonClient redissonClient = Redisson.create(config);
System.out.printf("%s", redissonClient.getBucket("test").get().toString());
redissonClient.shutdown();
}
}更多详细配置请参见 community documentation。