【问题标题】:using StackExchange.Redis with ElastiCache将 StackExchange.Redis 与 ElastiCache 结合使用
【发布时间】:2015-11-10 11:56:22
【问题描述】:

我打算使用ConnectionMultiplexer.Connect("server1:6379,server2:6379") 语法,包含 ElastiCache 复制组中每个节点的地址:端口号组合(以 AWS 术语)。

库是否会处理死节点/无响应节点,自动将命令传递给活动节点?
库是否会自动发现失败的节点现在再次可用/添加到复制组的新节点?

【问题讨论】:

  • 你指的是StackExchange.Redis库吗?
  • 是的 - this

标签: redis stackexchange.redis amazon-elasticache


【解决方案1】:

我对 Elasticache 不熟悉,但 StackExchange.Redis ConnectionMultiplexer 会在连接断开时自动在后台重试,它会发现已恢复的节点。

当然,在访问数据库失败时,您会遇到异常,但如果您正确处理错误,则无需重新创建ConnectionMultiplexer

我使用以下代码在集群模式和独立模式下进行了测试:

var mul = ConnectionMultiplexer.Connect("192.168.15.15:7000,192.168.15.15:7001,...,connectRetry=10,syncTimeout=5000,abortConnect=false,keepAlive=10,allowAdmin=true");
RETRY:
    Thread.Sleep(1000);
    var k = Guid.NewGuid().ToString();
    var v = Guid.NewGuid().ToString();
    try
    {
        var db = mul.GetDatabase();
        db.StringSet(k, v);
        if (db.StringGet(k).ToString() != v)
        {
            throw new OperationCanceledException("ABORT");
        }
    }
    catch(RedisServerException ex)
    {
        Console.WriteLine("Redis Server Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(RedisConnectionException ex)
    {
        Console.WriteLine("Redis Connection Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(TimeoutException ex)
    {
        Console.WriteLine("Timeout Exception {0}", ex.Message);
        goto RETRY;
    }
    Console.WriteLine("OK");
    goto RETRY;

在关闭/崩溃不同的服务器时,我收到了三种类型的异常:RedisServerExceptionRedisConnectionExceptionTimeoutException。一旦服务器/集群重新启动并运行,就会停止接收异常。

【讨论】:

  • 如果请求尝试的节点已关闭,它会尝试将请求发送到其他已知节点,还是抛出异常?
  • 我认为这取决于服务器宕机的时间。如果集群正在恢复,您可能会收到 MOVED RedisServerException,或者 CLUSTERDOWN 是集群无法恢复。在这两种情况下,您都需要重新创建多路复用器。
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 2014-08-12
  • 2015-02-23
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2012-07-16
  • 2019-08-15
相关资源
最近更新 更多