Redis 的哨兵模式为什么还有人用?

2020-08-07 10:54:12 +08:00
 zero47

Redis 的高可用方案有两种,哨兵和集群。

个人浅薄理解,哨兵模式就是创建一个备胎,备胎同步 master 数据,在 master 出现异常的时候进行切换。

而集群则是创建一个 slave,slave 同步 master 数据,可用于客户端读取,在 master 出现异常的时候进行选举切换为 master 。集群模式要求最少 3 个 master 节点,master 节点间分槽管理数据。

在正常情况下,哨兵就是个吃白饭的,没有任何作用,而集群的 slave 则参与读操作。

怎么看都是集群完胜啊,为啥还有人在坚持维护哨兵模式呢(比如 helm 的 redis-ha)?

17798 次点击
所在节点    Redis
79 条回复
rrfeng
2020-08-08 00:43:26 +08:00
cluster 你可以不开高可用,他是提供了这样的方案而已,而且至少要 3 节点。所以上面有人说 sentinel 和 cluster 的定位不同并没有任何错误。

实际上 cluster 就是分片+主从复制,只不过是 sentinel 用 raft 选主,cluster 因为自带 gossip 所以也可以维护每个分片的主从关系(相当于内置 sentinel 了)
rrfeng
2020-08-08 00:49:44 +08:00
所以严格的论述的话,cluster 无法替代 sentinel,因为没有单机模式啊亲!
misaka19000
2020-08-08 00:56:59 +08:00
没有 sentinel,slave 怎么能知道 master 出事呢

建议楼主先读一些分布式相关的书
zero47
2020-08-08 01:11:22 +08:00
@misaka19000 我觉得是你搞混了,节点是否 unreachable 是不用 sentinel 的,sentinel 只是不断查看 master 是否联通的机制而已
sampeng
2020-08-08 08:22:26 +08:00
从成本来说,哨兵只要 2 台够玩,绝大多数如此。但是集群。你最少两台。如果高可用集群。最少 4 台。
sampeng
2020-08-08 08:26:07 +08:00
@rrfeng 我还见过把集群当哨兵用,对,就是我们公司一个服务。没说服研发…
richzhu
2020-08-08 08:31:36 +08:00
特别喜欢楼主提的这种问题,要是 V2 里都是这种技术探讨帖子就好了
vipppppp
2020-08-08 08:59:32 +08:00
其实楼主也只是没理解对概念,直接开喷真的不合适
我也喜欢楼主提这种问题,希望这里是一个技术探讨区,而不是每天都水深火热
sagaxu
2020-08-08 09:18:47 +08:00
集群能 keys 吗?
lllpla
2020-08-08 09:51:47 +08:00
1.集群内部分 slot, 会损失一部分功能和写效率。
2.运维成本
nekoyaki
2020-08-08 10:51:34 +08:00
……我感觉楼主自己对 redis 的理解是有一定问题的,但提的问题其实是个好问题,而回帖的大部分人没有回应准确楼主的疑问,少部分评论我看一眼就明白,但楼主可能是想不到的。
那咱们把集群和哨兵能解决的问题列出来,就比较清楚了。

哨兵: 哨兵仅仅提供故障切换能力,在这之上,对使用方来说,和单机的 redis 是完全一样的。

集群: 集群最主要的,解决的是一个“数据分片”的问题,它能把 redis 的数据分散到不同的 slot 里,而不是都集中在一台机器的内存里。这样也就给单进程单线程、纯内存的 redis 提供了水平扩容的能力。
但是这是有代价的, 一部分命令无法跨节点执行,比如 zunionstore 等一些命令,它涉及多个 key,因此在集群状态下,需要自行保证这些 key 都在一个 slot 上;
再比如 watch exec, 在单节点或哨兵场景下可以用,但集群模式下是不能使用的。

还有一些命令,在集群状态下虽能执行或有替代方案,但会丧失原子性。 比如 mget 等。

所以楼主的疑问是为什么集群模式没有取代哨兵模式,是因为哨兵模式作为单节点+高可用的方案而言,确实有集群模式实现不了的功能。
nekoyaki
2020-08-08 10:57:04 +08:00
……想换行不小心发出去了。

除了功能上的区别以外,集群模式显然比哨兵模式更重、需要更多的资源去运行;再就是部署运维复杂度也是更高的。
而哨兵和单节点,一般来说除了配置稍有区别以外,绝大部分业务代码是可以相容的,无需特地修改。

而现有的代码如果使用了集群模式不支持的那些命令,那么集群模式下是无法正常工作的。

所以目前哨兵模式仍然被广泛使用,没有被集群模式彻底替代。
Henry399
2020-08-08 11:06:10 +08:00
因为对于很多企业来说缓存数据没那么大,Cluster 用不到,主从加哨兵就够了.一般哨兵会配合主从结构,哨兵使集群高可用,主从高并发.主从适合读多写少情况,主负责写,从负责读.Cluster 本身具备哨兵和主备切换功能,很好,但是很多公司用不到啊,没那么多数据量搞这个玩意干嘛,老板会同意?
duteliang
2020-08-08 12:46:28 +08:00
我们公司就是用哨兵了。为什么不用 Cluster 。因为费钱。集群需要机器太多了。本身数据量就不大。分片功能不需要。 就只是想要一个高可用的 redis 。 用哨兵符合需求了。 只需要三台机器。而且三台机器还部署了 3 个 zookeeper 和 kafka 。都是数据量不大。 节约机器钱
yexiangyang
2020-08-08 14:46:05 +08:00
**************************************************
1.集群 cluster 中,主服务器的从服务器不能读取数据,操作从服务器会发送 move 转向错误到对应的主服务器。
2.集群 cluster 中从服务器存在意义:
( 1 )作为主服务器的数据备份;
( 2 )在 redis.config 配置允许的情况下,在主服务器故障时候会触发 [自动故障转移] ,升级为主服务器;
( 3 )在 redis.config 配置允许的情况下,主服务器裸奔后,可以自动从其他主服务器的从服务器中迁移一台过来成为裸奔主服务器的从服务器。
3.哨兵 sentine 不是吃白饭的,可以监控、通知、自动故障转移,可以监控多个主从体系。数据量不是瓶颈的话 sentinel 更有保障,更省钱(生产 2 台服务器就行)。
rrfeng
2020-08-09 12:00:42 +08:00
不过按照 lz 的思路搞下去的话,搞个 cluster 这么分配:2 个机器带内存,1 个机器辅助不用内存。
三个机器上分别部署一个 redis 实例,不带内存的,只选举。分片永远。
两个带内存的机器分别部署一个 redis 大内存实例真正存储数据,刚好一对主从。
这样就是 3 节点 5 实例的 cluster,高可用,不用 sentinel,数据只有主从。

---------
lz 体验一下这个配置~~
Coolha
2020-12-27 12:42:26 +08:00
@672795574 赞同
Coolha
2020-12-27 12:50:10 +08:00
@nekoyaki 说的真好👍
ql562482472
2021-01-11 13:06:04 +08:00
就是集群其实是多主,主从是一主 别的都是引申结果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/696387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX