Redis【有与无】【Lettuce】L4.Redis Sentinel
本文章基于Redis 6.0.9版本,Lettuce 6.0.1.RELEASE版本
目录
2.2.独立上游节点/复制节点(Upstream/Replica)
2.3.具有预定义节点地址的静态上游节点/复制节点(Upstream/Replica)
1.Redis Sentinel
使用Lettuce时,可以通过多种方式与Redis Sentinel和Redis Sentinel管理的节点进行交互:
- 直接连接到Redis Sentinel,用于发出Redis Sentinel命令
- 使用Redis Sentinel连接到upstream
- 使用Redis Sentinel通过Upstream-Replica API连接到upstream节点和复制节点(replicas)。
在这两种情况下,都需要提供RedisURI
,因为Redis Sentinel集成支持多个Sentinel主节点以提供高可用性。
请注意:Sentinel (Lettuce 3.x)集成仅提供异步连接,不提供连接池。
1.1.直接连接Redis Sentinel节点
Lettuce公开了一个API以直接与Redis Sentinel节点进行交互。 这对于使用生菜执行管理任务很有用。 你可以监视新的upstream节点,查询upstream地址,复制节点等。 通过RedisClient.connectSentinel()
建立与Redis Sentinel节点的连接。 使用发布/订阅连接来订阅Sentinel事件。
1.2.使用Redis Sentinel发现Redis
一个或多个Redis Sentinels可以监视Redis实例。 这些Redis实例通常与Redis实例的复制节点一起操作。 一旦upstream出现故障,复制节点将被提升到upstream。 一旦无法再访问upstream实例,则Redis Sentinels将启动故障转移过程。 通常,客户端连接会终止。 断开连接可能导致以下任何选项:
- upstream返回:连接恢复到Redis实例
- 复制节点被提升到upstream:Lettuce使用masterId执行地址查找。 Redis Sentinel提供地址后,连接即立即恢复到新的Redis实例
在http://redis.io/topics/sentinel上了解更多信息
1.3.例子
示例1. Redis Sentinel节点连接
RedisURI redisUri = RedisURI.create("redis://sentinelhost1:26379");
RedisClient client = new RedisClient(redisUri);
RedisSentinelAsyncConnection<String, String> connection = client.connectSentinelAsync();
Map<String, String> map = connection.master("myupstream").get();
示例2. Redis upstream发现
RedisURI redisUri = RedisURI.Builder.sentinel("sentinelhost1", "mymaster").withSentinel("sentinelhost2").build();
RedisClient client = RedisClient.create(redisUri);
RedisConnection<String, String> connection = client.connect();
注意:每次使用Redis Sentinel连接到Redis实例时,都会使用与Redis Sentinel的新连接来查找Redis upstream。 这可能很耗时,尤其是在使用多个Redis Sentinel且其中一个或多个无法访问时。
2.Upstream Replica
Redis通过使用复制可以提高可用性并读取吞吐量。 从4.2开始,Lettuce为拓扑和ReadFrom-Settings提供了专用的上游节点/复制节点(Upstream/Replica)支持。
Redis Upstream/Replica可以独立运行,也可以与Redis Sentinel一起运行,后者提供自动故障转移和上游(upstream)升级。 从3.1版开始,Lettuce已支持上游连接的故障转移和上游升级。
通过提供客户端,编解码器以及一个或多个RedisURI,可以从MasterReplica
连接提供程序获得连接。
2.1.Redis Sentinel
使用Redis Sentinel的上游节点/复制节点(Upstream/Replica)将Redis Sentinel用作拓扑事件的注册表和通知源。 有关上游及其复制节点的详细信息可从Redis Sentinel获取。 Lettuce订阅Redis Sentinel事件,以通知所有提供的Sentinels。
2.2.独立上游节点/复制节点(Upstream/Replica)
运行独立的上游节点/复制节点(Upstream/Replica)设置需要一个种子地址来建立Redis连接。 提供一个RedisURI
将发现属于上游节点/复制节点(Upstream/Replica)设置的其他节点,并将发现的地址用于连接。 初始URI可以指向上游节点/复制节点(Upstream/Replica)。
2.3.具有预定义节点地址的静态上游节点/复制节点(Upstream/Replica)
在某些情况下,不应启用拓扑发现,或者发现的Redis地址不适合连接。 AWS ElastiCache属于此类。 Lettuce允许将一个或多个Redis地址指定为List并预定义节点拓扑。 在这种情况下,上游节点/复制节点(Upstream/Replica)URI将被视为静态拓扑,并且在这种情况下不会发现其他主节点。 Redis Standalone Upstream / Replica将发现提供的RedisURI的角色,并向适当的节点发出命令。
2.4.拓扑发现
Upstream-Replica拓扑是静态或半静态的。 具有附加复制节点的Redis Standalone实例不提供故障转移/ HA机制。 Redis Sentinel托管实例由Redis Sentinel控制,并允许故障转移(包括上游节点升级)。 MasteReplica
API支持两种机制。 拓扑由TopologyProvider
提供:
-
UpstreamReplicaTopologyProvider
: 使用INFO REPLICATION
输出进行动态拓扑查找。 复制节点作为replicaN = ...条目列出。 初始连接可以指向上游节点或复制节点,并且拓扑提供程序将发现节点。 如果发生上游节点/复制节点(Upstream/Replica)故障转移或拓扑更改,则需要在Lettuce外部重新建立连接。 -
StaticUpstreamReplicaTopologyProvider
: 拓扑由URI列表和ROLE输出定义。 MasterReplica仅使用提供的节点,而不会在设置中发现其他节点。 如果发生上游节点/复制节点(Upstream/Replica)故障转移或拓扑更改,则需要在Lettuce外部重新建立连接。 -
SentinelTopologyProvider
: 使用Redis Sentinel API进行动态拓扑查找。 特别是SENTINEL MASTER
和SENTINEL SLAVES
输出。 上游节点/复制节点故障转移由Lettuce处理。
2.5.拓扑更新
- 独立的游节点/复制节点(Upstream/Replica):执行一次性拓扑查找,此后仍保持静态
- Redis Sentinel:订阅所有Sentinel并侦听Pub/Sub消息以触发拓扑刷新
2.6.事务
从5.1版开始,将事务期间的事务和命令路由到上游节点,以确保在单个节点上执行原子事务。 事务可以包含读和写操作,因此驱动程序无法预先决定可以使用哪个节点来运行实际事务。
2.7.例子
例子1. Redis独立主节点/复制节点
RedisClient redisClient = RedisClient.create();
StatefulRedisMasterSlaveConnection<String, String> connection = MasteReplica.connect(redisClient, StringCodec.UTF8,
RedisURI.create("redis://localhost"));
connection.setReadFrom(ReadFrom.UPSTREAM_PREFERRED);
System.out.println("Connected to Redis");
connection.close();
redisClient.shutdown();
例子2. Redis Redis Sentinel
RedisClient redisClient = RedisClient.create();
StatefulRedisMasterReplicaConnection<String, String> connection = MasteReplica.connect(redisClient, StringCodec.UTF8,
RedisURI.create("redis-sentinel://localhost:26379,localhost:26380/0#myupstream"));
connection.setReadFrom(ReadFrom.UPSTREAM_PREFERRED);
System.out.println("Connected to Redis");
connection.close();
redisClient.shutdown();
示例3. AWS ElastiCache集群
RedisClient redisClient = RedisClient.create();
List<RedisURI> nodes = Arrays.asList(RedisURI.create("redis://host1"),
RedisURI.create("redis://host2"),
RedisURI.create("redis://host3"));
StatefulRedisMasterSlaveConnection<String, String> connection = MasteReplica
.connect(redisClient, new Utf8StringCodec(), nodes);
connection.setReadFrom(ReadFrom.UPSTREAM_PREFERRED);
System.out.println("Connected to Redis");
connection.close();
redisClient.shutdown();