Asp.net core 尝试将Redis Sentinel与Net Core 2.1结合使用

Asp.net core 尝试将Redis Sentinel与Net Core 2.1结合使用,asp.net-core,.net-core,redis,stackexchange.redis,Asp.net Core,.net Core,Redis,Stackexchange.redis,好的,我正在使用netcore2.1和libMicrosoft.Extensions.Caching.Redis 2.1.2版,当我只使用一个Redis节点时,一切正常 使用单个节点: services.AddDistributedRedisCache(ops => { ops.Configuration = "localhost:6379"; ops.InstanceName =

好的,我正在使用
netcore2.1
和lib
Microsoft.Extensions.Caching.Redis 2.1.2版
,当我只使用一个Redis节点时,一切正常

使用单个节点:

services.AddDistributedRedisCache(ops =>
            {
                ops.Configuration = "localhost:6379";
                ops.InstanceName = "master";
            });
但现在,我正尝试将Redis与Sentinel结合使用,因此我将配置更改为(遵循本指南):

因此,我有一个docker-compose.yml来使用sentinel启动redis节点:

version: '2'
services:
  redis-master:
    image: bitnami/redis:5.0
    environment:
      ALLOW_EMPTY_PASSWORD: 'yes'
      REDIS_REPLICATION_MODE: 'master'
    ports:
      - '6379:6379'
  redis-slave1:
    image: bitnami/redis:5.0
    environment:
      ALLOW_EMPTY_PASSWORD: 'yes'
      REDIS_REPLICATION_MODE: 'slave'
      REDIS_MASTER_HOST: redis-master
    depends_on:
      - redis-master
    ports:
      - '6380:6380'
  redis-slave2:
    image: bitnami/redis:5.0
    environment:
      ALLOW_EMPTY_PASSWORD: 'yes'
      REDIS_REPLICATION_MODE: 'slave'
      REDIS_MASTER_HOST: redis-master
    depends_on:
      - redis-master
    ports:
      - '6381:6381'
  redis-sentinel:
    image: bitnami/redis-sentinel:5.0
    environment:
      REDIS_MASTER_HOST: redis-master
      REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS: 10000
    ports:
      - '26379:26379'
当我启动应用程序时,一切正常,因此我关闭主节点以测试sentinel,并在Asp Net Core中出现以下错误:

RedisConnectionException: SocketClosed on localhost:6379/Subscription, origin: ProcessReadBytes, input-buffer: 0, outstanding: 0, last-read: 14s ago, last-write: 14s ago, unanswered-write: 1998113s ago, keep-alive: 60s, pending: 0, state: ConnectedEstablished, in: 0, ar: 0, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago
Unknown location

RedisConnectionException: No connection is available to service this operation: EVAL; SocketClosed on localhost:6379/Subscription, origin: ProcessReadBytes, input-buffer: 0, outstanding: 0, last-read: 14s ago, last-write: 14s ago, unanswered-write: 1998113s ago, keep-alive: 60s, pending: 0, state: ConnectedEstablished, in: 0, ar: 0, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago
StackExchange.Redis.ConnectionMultiplexer.ThrowFailed<T>(TaskCompletionSource<T> source, Exception unthrownException) in ConnectionMultiplexer.cs, line 2000
RedisConnectionException:SocketClosed on localhost:6379/Subscription,来源:ProcessReadBytes,输入缓冲区:0,未完成:0,上次读取:14s前,上次写入:14s前,未响应写入:1998113s前,保持活动:60s,挂起:0,状态:ConnectedEstablished,in:0,ar:0,上次心跳:0s前,上次mbeat:0s前,全局:0s前
未知位置
RedisConnectionException:没有连接可用于服务此操作:EVAL;本地主机上的SocketClosed:6379/订阅,来源:ProcessReadBytes,输入缓冲区:0,未完成:0,上次读取:14秒前,上次写入:14秒前,未响应写入:1998113秒前,保持活动:60秒,挂起:0,状态:ConnectedEstablished,in:0,ar:0,上次心跳:0秒前,上次MBAT:0秒前,全局:0秒前
ConnectionMultiplexer.cs中的StackExchange.Redis.ConnectionMultiplexer.ThrowFailed(TaskCompletionSource,Exception unthrownException),第2000行
好吧,如果我再次启动主节点,一切正常,但这不是预期的行为。我希望在关闭主节点后,sentinel将从节点升级为主节点,并且我可以继续使用redis而不会出错


我遗漏了什么吗?

很抱歉回复得太晚,但我们只是在自己动手。连接到Sentinel时,需要在连接字符串中指定端口:

services.AddDistributedRedisCache(ops =>
{
    ops.Configuration = "localhost:26379,serviceName:mymaster";
    ops.InstanceName = "master";
});
一旦ConnectionMultiplexer连接到Sentinel节点,它就会获得主节点并使用它。此外,我还发现,要使这项工作正常进行,有几个设置是必要的:

redisOptions.TieBreaker = "";
redisOptions.AbortOnConnectFail = false;
redisOptions.AllowAdmin = true;
我们还在.NETCore3.1上使用StackExchange.Redis v2.2.4

redisOptions.TieBreaker = "";
redisOptions.AbortOnConnectFail = false;
redisOptions.AllowAdmin = true;