【问题标题】:How does StackExchange.Redis use multiple endpoints and connections?StackExchange.Redis 如何使用多个端点和连接?
【发布时间】:2015-05-28 15:34:09
【问题描述】:

正如 StackExchange.Redis Basics documentation 中所述,您可以连接到多个 Redis 服务器,并且 StackExchange.Redis 将自动确定主/从设置。引用相关部分:

更复杂的场景可能涉及主/从设置;对于这种用法,只需指定构成该逻辑 redis 层的所有所需节点(它将自动识别主节点):

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");

我执行了一个测试,在该测试中我触发了故障转移,这样主服务器会宕机一段时间,导致旧的从服务器成为新的主服务器,而旧的主服务器成为新的从服务器。我注意到,尽管发生了这种变化,StackExchange.Redis 仍继续向旧主服务器发送命令,导致写入操作失败。

关于上述问题:

  1. StackExchange.Redis 如何决定使用哪个端点?
  2. 应该如何使用多个端点(如上例)?

我还注意到,对于每个连接,StackExchange.Redis 都会打开 两个 物理连接,其中一个是某种订阅。这到底是干什么用的?是否被 Sentinel 实例使用?

【问题讨论】:

    标签: redis stackexchange.redis


    【解决方案1】:

    应该发生的事情是它使用许多东西(特别是定义的复制配置)来确定哪个是主服务器,并将流量引导到适当的服务器(尊重“服务器”参数,默认为“prefer master”,但总是向master发送写操作)。

    如果收到“无法写入只读从属设备”(我不记得确切的文本)错误,它将尝试重新建立配置,应该自动切换以尊重这。不幸的是,redis 不会广播配置更改,因此库无法提前检测到这一点。

    请注意,如果您使用库方法更改 master,它可以利用 pub/sub 立即自动检测更改。

    关于第二个连接:那将用于 pub/sub;它会提前启动它,因为默认情况下它会尝试侦听特定于库的配置广播。

    【讨论】:

    • 感谢您的回复。我不确定我是否遵循...您所说的更改主/库特定配置广播的库方法是什么意思?另外,当我导致主/从故障转移时,我实际上等待了几秒钟,并尝试再次发送一个 SET,好几次,它总是不断地把它发送给旧的主。
    • @Gigi 我将不得不调查SET 问题;另一方面:IServer.MakeMaster(...)
    • @MarcGravell 您提到的“服务器”参数是什么?我在 ConfigurationOptions 类型中找不到它。
    • @JeanLourenço 我的意思是单个操作的命令标志
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多