当前位置: 首页 > 知识库问答 >
问题:

使用C#中的StackExchange/Sentinel进行Redis故障转移

艾自强
2023-03-14

我们在每个节点上都有3个redis服务器和sentinel(由Linux人员设置):devredis01:6383(主)devredis02:6383(从)devredis03:6383(从)devredis01:26379(sentinel)devredis02:26379(sentinel)devredis03:26379(sentinel)

我能够将StackExchange客户机连接到redis服务器,并使用redis Desktop Manager在所有redis实例中进行写/读和验证数据是否被复制。

我还可以使用不同的ConnectionMultiplexer连接到sentinel服务,查询配置,请求主redis节点,请求从节点等。

我们还可以杀死主redis节点,并验证其中一个从机是否被提升为主机,并且复制到另一个从机是否继续工作。我们可以观察到redis连接试图重新连接到主服务器,而且如果我重新创建ConnectionMultiplexer,我可以再次对新提升的主服务器进行写/读操作,并从主服务器进行读操作。

到目前为止还好!

我遗漏的一点是,如何在生产系统中将所有内容整合在一起?

提前感谢!

共有1个答案

金和雅
2023-03-14

上周,我花了一些时间与Linux人员一起测试场景,并在此实现的C#端工作,我使用了以下方法:

  • 从config中读取哨兵地址并创建连接多路复用器以连接到它们
  • 订阅+switch-master频道
  • 依次询问每个哨兵服务器他们认为主redis和从服务器是什么,比较它们以确保它们都同意
  • 使用从sentinel和connect中读取的redis服务器地址创建新的ConnectionMultiplexer,将事件处理程序添加到ConnectionFailed和ConnectionRestored。
  • 当我收到+switch-master消息时,我调用redis ConnectionMultiplexer上的Configure()
  • 作为带式和大括号方法,当连接类型为ConnectionType.Interactive时,我总是在收到connectionFailed或connectionRestored事件12秒后调用redis ConnectionMultiplexer上的Configure()

我发现,一般来说,我在丢失redis Master大约5秒钟后,正在工作和重新配置。在这段时间里,我不能写字,但我可以阅读(因为你可以从一个奴隶身上读出来)。5秒对我们来说是可以的,因为我们的数据更新非常快,几秒钟后就变得陈旧(并随后被覆盖)。

时不时地带回一个以前是主程序的实例似乎会引起一些混乱--在它恢复几秒钟后,我会收到一个来自写入的异常--“readonly”,这表明我不能向从程序写入。这种情况很少发生,但我发现在连接状态改变12秒后调用Configure()的“包罗万象”方法解决了这个问题。调用Configure()似乎非常便宜,因此无论是否有必要调用它两次似乎都可以。

现在我有了奴隶,我已经卸载了一些我的数据清理代码,它对奴隶进行键扫描,这让我很高兴。

总而言之,我很满意,它不是完美的,但对于一些应该很少发生的事情来说,它已经足够好了。

 类似资料:
  • 问题内容: 我们目前正在使用Redis 2.8.4和StackExchange.Redis(并喜欢它),但目前没有针对硬件故障等的任何保护措施。我正在尝试使解决方案起作用,从而使我们具有主/从属和哨兵监视功能,但无法完全到达目标位置,并且在搜索后无法找到任何实际的指针。 因此,目前我们已经做到了: 每个节点上都有3个Redis服务器和哨兵(由Linux专家设置):devredis01:6383(主

  • 我在端口7000、7001和7002上设置了三个服务器(一个主服务器和两个从服务器),在端口26379、26380和26381上设置了三个哨兵,它们都在同一台机器(ubuntu VM)上。 当我启动它们时,根据日志,一切看起来都很好,当我对哨兵运行信息命令时,看起来也很健康。但是当我放下主程序(通过Ctrl+C或redis-cli SLEEP命令使其停止工作)时,没有一个从程序实例被引入为新的主程

  • 我试图在docker群中创建一个Redis集群。我正在使用bitnami-redis-docker图像创建容器。在阅读bitnami文档时,他们总是建议使用1个主节点,而不是阅读Redis文档,后者规定至少应该有3个主节点,这就是为什么我不知道哪个是正确的。假定所有bitnami slave默认为只读,如果我在一个swarm leader节点中只设置一个master,并且如果失败,我相信senti

  • 我试图设置一个简单的,并将其配置为将主服务器故障转移到从服务器。 我设置了4个VM(使用),每个VM上都安装了redis。我有一个主机器和两个奴隶。最后一台机器是哨兵。 主服务器和从服务器都有默认配置,只是我将绑定地址更改为,而从服务器有行。 在哨兵中,我遵循了基本教程,并放入了以下设置: 我做错了什么?

  • Redis Sentinel手动故障转移命令超时 [8]01 7月01:36:57.317#哨兵runid为c337f6f0dfa1d41357338591cd0181c07cb026d0 [8]01 7月01:38:13.135#+监视器主redis-holt-overflow 10.19.8.2 6380法定人数1 [8]01 7月01:38:13.135#+设置主redis-holt-ove