【问题标题】:How does ServiceStack PooledRedisClientManager failover work?ServiceStack PooledRedisClientManager 故障转移如何工作?
【发布时间】:2013-06-30 12:21:38
【问题描述】:

根据 git commit 消息,ServiceStack 最近添加了故障转移支持。我最初认为这意味着我可以关闭我的一个 Redis 实例,而我的池化客户端管理器将优雅地处理故障转移并尝试连接我的备用 Redis 实例之一。不幸的是,我的代码出错了,说它无法连接到初始 Redis 实例。

我目前在 Windows 上运行 Redis 2.6.12 的实例,主端口位于 6379 端口,从端口位于 6380,并设置了哨兵以在主节点出现故障时自动将从节点提升为主节点。我目前正在像这样实例化我的客户经理:

PooledRedisClientManager pooledClientManager =
    new PooledRedisClientManager(new string[1] { "localhost:6379"},
        new string[1] {"localhost:6380"});

其中第一个数组是读写主机(用于主机),第二个数组是只读主机(用于从机)。

当我在端口 6379 终止主服务器时,哨兵将从服务器提升为主服务器。现在,当我尝试运行我的 C# 代码时,它并没有故障转移到端口 6380,而是简单地中断并返回错误“无法在 localhost:6379 连接到 redis 实例”。

有没有办法解决这个问题,或者故障转移根本无法按我想要的方式工作?

【问题讨论】:

  • 你找到方法了吗@Vliu
  • 不,从我所做的大部分研究来看,大多数人并不依赖代码来处理故障转移。他们在 redis 数据库上使用(linux)代理层,例如 HAProxy @jaxxbo

标签: redis servicestack


【解决方案1】:

PooledRedisClientManager.FailoverTo 允许您重置哪些是读/写主机,哪些是只读主机,并重新启动工厂。这允许快速过渡而无需重新创建客户端。

【讨论】:

  • 像try一样{//redis操作} catch{ PooledRedisClientManager.FailoverTo(slave port as read-write port) }?
  • 这是一种方法,是的。我设置了一个特殊的服务来处理来自 Redis Sentinel 的传入请求,这样如果它检测到一个失败的节点,它将协商并提升正确的从节点,然后通知我的 web 服务新的地址和端口。
  • 嗨@TheDruidsKeeper,您能否通过一些示例详细说明您的方法,例如,您的意思是什么服务,以及它如何检测到故障节点,非常感谢。
  • @wliao 由于哨兵的 MS 端口存在错误(此后已修复),我从未完全启动并运行它。但是,我有一个使用 ServiceStack 的 Web 服务,我已将它设置为使用 Redis 作为消息总线。我设置了一个路由来处理故障转移请求(该请求将由哨兵生成),以触发 Web 服务调用PooledRedisClientManager.FailoverTo。这是具体的代码行:((PooledRedisClientManager)this.ClientsManager).FailoverTo(new string[] { string.Format("{0}:{1}", request.IP, request.Port) });
  • 我还要提一下Redis Sentinel的目的是检测故障节点,并自动将slave提升为master。我正在对其进行设置,以便在升级后执行自定义脚本来通知我的 Web 服务堆栈,但由于之前提到的 bug,这在当时是不可能的 - 尽管这是 Windows 的一个错误端口,而不是 *nix-native 哨兵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多