欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis【有与无】【Lettuce】L4.Redis Sentinel

程序员文章站 2022-05-01 08:02:27
...

本文章基于Redis 6.0.9版本,Lettuce 6.0.1.RELEASE版本

目录

1.Redis Sentinel

1.1.直接连接Redis Sentinel节点

1.2.使用Redis Sentinel发现Redis

1.3.例子

示例1. Redis Sentinel节点连接

示例2. Redis upstream发现

2.Upstream Replica

2.1.Redis Sentinel

2.2.独立上游节点/复制节点(Upstream/Replica)

2.3.具有预定义节点地址的静态上游节点/复制节点(Upstream/Replica)

2.4.拓扑发现

2.5.拓扑更新

2.6.事务

2.7.例子

例子1. Redis独立主节点/复制节点

例子2. Redis Redis Sentinel

示例3. AWS ElastiCache集群


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 MASTERSENTINEL 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();