Redis 的高可用方案有两种,哨兵和集群。
个人浅薄理解,哨兵模式就是创建一个备胎,备胎同步 master 数据,在 master 出现异常的时候进行切换。
而集群则是创建一个 slave,slave 同步 master 数据,可用于客户端读取,在 master 出现异常的时候进行选举切换为 master 。集群模式要求最少 3 个 master 节点,master 节点间分槽管理数据。
在正常情况下,哨兵就是个吃白饭的,没有任何作用,而集群的 slave 则参与读操作。
怎么看都是集群完胜啊,为啥还有人在坚持维护哨兵模式呢(比如 helm 的 redis-ha)?
1
KaynW 2020-08-07 10:59:30 +08:00
redis 小白占坑
|
2
Ariver 2020-08-07 11:03:26 +08:00
cluster 是怎么实现高可用的?
|
3
edk24 2020-08-07 11:04:56 +08:00
redis 小白占坑 坐等大佬讲解
|
4
0x49 2020-08-07 11:06:22 +08:00
坐等大佬讲解
|
5
wangyanrui 2020-08-07 11:06:43 +08:00 8
一脸懵逼??
哨兵是哨兵,集群是集群。 哨兵是找一个人,专门看管这群人 集群是一个人干不完活,多找几个人干活的 感觉楼主都没有明白这两个模式的字面意思啊 |
6
misaka19000 2020-08-07 11:07:31 +08:00
因为低版本不支持集群
|
7
misaka19000 2020-08-07 11:08:35 +08:00
哨兵模式的 slave 也可以读数据的
|
8
monsterxx03 2020-08-07 11:10:23 +08:00 via Android 1
Cluster 要求客户端实现 smart client,以前基于单机 redis 的应用不一定好迁移,比如 celery 的 redis broker 就不支持 cluster 。cluster 对 mset,mget ,pipeline 这些支持不好(key 必须处于同一 slot)。sentinel 只是维护下集群状态,自己不耗多少资源。cluster 里如果有超级大的 key,会让数据分布不均匀,可能还不如让这样的应用用一个单独的 redis 。数据不超过单机内存的话,用 sentinel 也没啥问题
|
9
sujin190 2020-08-07 11:13:53 +08:00
哨兵单独进程,并不保存数据吧,也几乎不占内存,可以和 slave 部署在一起,那么看起来其实也是可以提供读取的吧,但是吧基于一致性和持久化性能要求,真的有人会在 slave 上提供读服务么
|
10
useben 2020-08-07 11:15:08 +08:00 1
你对 redis cluster 的理解错了, 集群的核心是分片
|
11
Jrue0011 2020-08-07 11:15:19 +08:00
稍微搜了下,感觉这两个的关系应该是这样的?
主从加哨兵实现高可用,cluster 集群内部貌似也是用主从加哨兵做高可用,只不过 cluster 还同时做好了负载均衡 |
12
DaBingShui 2020-08-07 11:17:58 +08:00
哨兵模式是 redis2.x 的吧,现在 redis3.x 一般都用集群了
|
13
wangyzj 2020-08-07 11:37:57 +08:00
cluster 是横向扩展比较好
烧饼是高可用比较好 各取所需 |
14
TypeError 2020-08-07 11:40:55 +08:00 via Android
用途不一样,用哨兵基本没分片需求,主从监控一下就行
|
15
egglin 2020-08-07 11:45:37 +08:00
个人理解主从用哨兵,分片用集群
|
16
yiyi11 2020-08-07 12:03:25 +08:00 via Android
本质就是有没有数据分片需求,sentinel 只提供高可用,cluster 提供高可用+数据分片。其实 cluster 比较香是因为,redis 足够轻量,搭建部署足够简单,搭建 cluster 并不比 sentinel 麻烦很多,但却多了分片的好处(扩展性)。
|
17
zero47 OP @wangyanrui 我当然知道是两个东西,但几个人干活也能互相监督,谁倒了就谁顶上,不就不需要哨兵了吗?我的观点是集群是否可以取缔哨兵,而不是说他们是一个东西。
|
18
optional 2020-08-07 12:34:04 +08:00 via iPhone
分片是有代价的, 不是无痛的。
|
19
672795574 2020-08-07 12:34:23 +08:00
个人见解
哨兵最少只要三个节点即可 哨兵可以不和集群部署在一起 |
20
672795574 2020-08-07 12:41:10 +08:00
你说的方案应该是可以的,但是架构又没有银弹,只是 redis 官方提供了这个方案而已
|
21
gadsavesme 2020-08-07 12:44:27 +08:00
哨兵可以监控很多实例啊,有的公司 redis 需求有但是不高的情况,整那么多集群干嘛,简单的主从能防宕机就行了。几台哨兵能监控一大堆东西了,毕竟机器是要钱的。
|
22
Xusually 2020-08-07 12:44:45 +08:00
如果只单纯论高可用的话,是可以用集群替代哨兵的。
但是集群有集群的问题,分片并不是完全透明无痛的。 哨兵就是在原有结构基础上做的高可用切换而已,简单易用。 |
23
lewis89 2020-08-07 12:47:14 +08:00 1
一个是高可用,一个是高吞吐
|
24
monsterxx03 2020-08-07 12:52:28 +08:00 via Android
你附言里说的一主一从的 cluster 其实现在就能实现,所有 slot 分配到一个节点就行了,但这样没法实现 failover , 从 raft 的本质来讲,稳定的 failover 至少三节点起,目前 redis 实现里只有 master 会参与选举,如果以后 slave 能参与,一主两从实现高可用我觉得也是可行的
|
25
singerll 2020-08-07 13:25:35 +08:00 via Android
因为好多业务刚开发时完全用不到集群,随着业务的增加,最小的成本就是哨兵,业务再增加,就重构走集群。
|
26
ty89 2020-08-07 13:37:55 +08:00
哨兵是为了高可用设计的,集群是用来分布式扩容,完全两码事。
|
27
zliea 2020-08-07 13:51:27 +08:00
集群的问题我觉得是只有一个库。
哨兵的话,可以做到主写从读。 |
28
wangxiaoaer 2020-08-07 13:57:39 +08:00 via iPhone
不熟悉,但是感觉一个是低成本高可用,一个是高成本高负载?
|
29
robot1 2020-08-07 13:59:19 +08:00
当然是没有必要使用集群的时候啊,只需要一些高可用性,哨兵足够
|
30
zero47 OP @monsterxx03 你想表达的是只有 master 会参与投票吧? master 坏掉的 slave 是可以参选的。
|
31
rrfeng 2020-08-07 14:13:23 +08:00 6
sentinel 和 cluster 完全就是两码事。
sentinel 用在『 Redis 主从复制』架构下,帮助做故障恢复的,是个工具人。主从模式是用来提高可用性的。 cluster 是数据分片模式,是扩展容量 /吞吐量的,没有 sentinel 什么事。然后 cluster 模式的每个分片为了提高可用性,也可以使用主从模式,把 sentinel 工具人也用起来,就是终极模式了。 |
32
monsterxx03 2020-08-07 14:22:43 +08:00 via Android
@zero47 对,表述有问题,是这个意思
|
33
rrfeng 2020-08-07 14:27:27 +08:00
目前的问题是,集群至少需要 3 个 master 节点,很多情况只需要单节点,集群也只有一个数据库。
如果后续更新集群能做到 1 主 1 从,其实就能取缔了吧? --------------------- 你的『集群』是啥自己还没弄明白呢…… |
34
zero47 OP @rrfeng 大哥,咋总是说分不清集群和哨兵,我没有在说它们是一个东西啊,我是说用了集群,高可用其实就不需要哨兵了,因为 master 出事,slave 会参与选举顶上,怎么总说集群是用来分槽,哨兵用来高可用,我说的就不是这些事。
|
35
zero47 OP ES 的高可用方案就是集群,为啥到这里集群就只能起分片作用呢,除了分片它也可以用作高可用方案啊。
|
36
rrfeng 2020-08-07 17:18:54 +08:00
|
37
rrfeng 2020-08-07 17:19:23 +08:00
你是傻逼吗……刚才删掉了这句话,还是忍不住再发一次。
|
39
rrfeng 2020-08-07 17:27:23 +08:00
|
40
zero47 OP @rrfeng 我想表达的是用了 redis-cluster,比如 3 个 master,3 个 slave, 当一个 master 出事了,对应的 slave 是会参与选举然后顶上的,这不就实现了高可用了吗?
|
41
lhy0dyx 2020-08-07 17:32:16 +08:00
你说的哨兵应该是指主从模式,哨兵是用来监控的,一般和会主从模式结合,主节点挂了,把从节点升级成主节点,集群是为了扩容,通过哈希槽的方式来扩展整个 redis 的存储空间。大型使用一般是用集群,集群的节点用主从,同时配哨兵来检测主节点挂没挂,如果再考虑哨兵可能会挂,还可以配多哨兵,互相监控。
|
42
rrfeng 2020-08-07 17:36:22 +08:00
所谓的『高可用集群』就是把两个方案叠加起来,只是你看不到 sentinel 了而已。
要实现高可用至少要 3 节点,所以你说的 cluster 模式一主一从无法实现。 |
43
rrfeng 2020-08-07 17:37:29 +08:00
如果后续更新集群能做到 1 主 1 从,其实就能取缔了吧?
--------- 不可能。结贴。 |
44
useben 2020-08-07 17:39:58 +08:00
@lhy0dyx 集群的节点用主从,同时配哨兵来检测主节点挂没挂,如果再考虑哨兵可能会挂,还可以配多哨兵,互相监控。这里你理解错了
集群没有哨兵这套, 而是内部实现故障转移的机制, 是基于 raft 那套 |
45
TypeError 2020-08-07 17:42:54 +08:00 via Android
一主一从搞个毛线集群啊
|
47
yidou9527 2020-08-07 17:56:51 +08:00
我觉得楼主理解是没有错的 前面人没细看楼主说的话 或者自己可能没太搞懂 redis cluster
|
49
whahuzhihao 2020-08-07 18:09:04 +08:00 1
楼主问的应该是,既然集群也能实现高可用,为啥还要用哨兵
|
50
msg7086 2020-08-07 18:45:50 +08:00
借贴问问题。
手里有一个场景,两台服务器在两个机房,服务器上有相应的应用需要对本机 Redis 节点做大量读取和异步写入,所以需要数据在两边都完整地存一份,支持两边同时读取和同时异步写入。这种场景现在 Redis Cluster 能实现吗? 现在是用 KeyDB 的双主节点异步 Replication 来做的,稳定性存疑,但是一直找不到替代方案。 |
52
zero47 OP @whahuzhihao 一开始没想到这么大的歧义,感谢理解
|
53
zero47 OP @msg7086 不太了解具体需求,但感觉这不是最佳方案,redis cluster 是可以做到两边都完整存一份的,它可以实现机器 A 负责存储一部分数据,机器 B 存储一部分数据,然后各自设立对方 slave 来获得副本。但无法保证 A 只调用 A 的 redis,A 也可能调用 B 的 redis
|
55
RedisMasterNode 2020-08-07 19:34:51 +08:00
@wangyanrui 你理解得不对,是不是以为 Redis Cluster 是几台机器组起来的集群,然而其实并不是,典型的架构是例如起 3 主 3 从的 Redis Cluster,这里面会包括有了当主节点挂掉的时候,从节点接替继续工作的 Feature,而不是挂了其中之一就挂掉,所以这两者是有可比性并且哨兵确实就是落后的。
|
56
RedisMasterNode 2020-08-07 19:36:00 +08:00
@wangyanrui 哨兵仅仅是 Redis 高可用的方案之一,而 Cluster 是同时做了高性能和高可用的方案,并不是只是组集群发挥更高性能而已,所以~建议下次指点别人之前确认自己的理解是正确的,不然就,hhh 蛮尴尬^_^
|
57
guagusi 2020-08-07 21:14:06 +08:00
集群的优点就不说了。1>单从成本来说,哨兵只需要部署两个服务:1master 和 1slave ;集群至少得 6 个服务:3 个 master 和 3 个 slave ; 2>从运维成本来说,哨兵更容易维护; 3>写效率来说,集群得对 key 进行哈希计算决定写入哪个 master,如果不是当前节点则会返回给客户端让客户端重新发起写去请求(类似于 HTTP 的 302 重定向)
|
58
GGGG430 2020-08-07 21:32:41 +08:00
不会还有人用 redis 哨兵吧? 不会吧 不会吧 .... 哈哈, 无知!
|
59
angryfish 2020-08-07 23:46:49 +08:00 via iPhone
用了集群,貌似事务特性就没了?还有好些指令不能用了。而很多应用,其实并发没那么高,redis 也基本不会宕机,没必要浪费那么多台服务器
|
60
wangyanrui 2020-08-08 00:01:57 +08:00 via Android
@RedisMasterNode 只是形象的举例
|
61
rrfeng 2020-08-08 00:43:26 +08:00 via Android
cluster 你可以不开高可用,他是提供了这样的方案而已,而且至少要 3 节点。所以上面有人说 sentinel 和 cluster 的定位不同并没有任何错误。
实际上 cluster 就是分片+主从复制,只不过是 sentinel 用 raft 选主,cluster 因为自带 gossip 所以也可以维护每个分片的主从关系(相当于内置 sentinel 了) |
62
rrfeng 2020-08-08 00:49:44 +08:00 via Android
所以严格的论述的话,cluster 无法替代 sentinel,因为没有单机模式啊亲!
|
63
misaka19000 2020-08-08 00:56:59 +08:00
没有 sentinel,slave 怎么能知道 master 出事呢
建议楼主先读一些分布式相关的书 |
64
zero47 OP @misaka19000 我觉得是你搞混了,节点是否 unreachable 是不用 sentinel 的,sentinel 只是不断查看 master 是否联通的机制而已
|
65
sampeng 2020-08-08 08:22:26 +08:00 via iPhone
从成本来说,哨兵只要 2 台够玩,绝大多数如此。但是集群。你最少两台。如果高可用集群。最少 4 台。
|
67
richzhu 2020-08-08 08:31:36 +08:00 1
特别喜欢楼主提的这种问题,要是 V2 里都是这种技术探讨帖子就好了
|
68
vipppppp 2020-08-08 08:59:32 +08:00
其实楼主也只是没理解对概念,直接开喷真的不合适
我也喜欢楼主提这种问题,希望这里是一个技术探讨区,而不是每天都水深火热 |
69
sagaxu 2020-08-08 09:18:47 +08:00 via Android
集群能 keys 吗?
|
70
lllpla 2020-08-08 09:51:47 +08:00
1.集群内部分 slot, 会损失一部分功能和写效率。
2.运维成本 |
71
nekoyaki 2020-08-08 10:51:34 +08:00 4
……我感觉楼主自己对 redis 的理解是有一定问题的,但提的问题其实是个好问题,而回帖的大部分人没有回应准确楼主的疑问,少部分评论我看一眼就明白,但楼主可能是想不到的。
那咱们把集群和哨兵能解决的问题列出来,就比较清楚了。 哨兵: 哨兵仅仅提供故障切换能力,在这之上,对使用方来说,和单机的 redis 是完全一样的。 集群: 集群最主要的,解决的是一个“数据分片”的问题,它能把 redis 的数据分散到不同的 slot 里,而不是都集中在一台机器的内存里。这样也就给单进程单线程、纯内存的 redis 提供了水平扩容的能力。 但是这是有代价的, 一部分命令无法跨节点执行,比如 zunionstore 等一些命令,它涉及多个 key,因此在集群状态下,需要自行保证这些 key 都在一个 slot 上; 再比如 watch exec, 在单节点或哨兵场景下可以用,但集群模式下是不能使用的。 还有一些命令,在集群状态下虽能执行或有替代方案,但会丧失原子性。 比如 mget 等。 所以楼主的疑问是为什么集群模式没有取代哨兵模式,是因为哨兵模式作为单节点+高可用的方案而言,确实有集群模式实现不了的功能。 |
72
nekoyaki 2020-08-08 10:57:04 +08:00
……想换行不小心发出去了。
除了功能上的区别以外,集群模式显然比哨兵模式更重、需要更多的资源去运行;再就是部署运维复杂度也是更高的。 而哨兵和单节点,一般来说除了配置稍有区别以外,绝大部分业务代码是可以相容的,无需特地修改。 而现有的代码如果使用了集群模式不支持的那些命令,那么集群模式下是无法正常工作的。 所以目前哨兵模式仍然被广泛使用,没有被集群模式彻底替代。 |
73
Henry399 2020-08-08 11:06:10 +08:00
因为对于很多企业来说缓存数据没那么大,Cluster 用不到,主从加哨兵就够了.一般哨兵会配合主从结构,哨兵使集群高可用,主从高并发.主从适合读多写少情况,主负责写,从负责读.Cluster 本身具备哨兵和主备切换功能,很好,但是很多公司用不到啊,没那么多数据量搞这个玩意干嘛,老板会同意?
|
74
duteliang 2020-08-08 12:46:28 +08:00
我们公司就是用哨兵了。为什么不用 Cluster 。因为费钱。集群需要机器太多了。本身数据量就不大。分片功能不需要。 就只是想要一个高可用的 redis 。 用哨兵符合需求了。 只需要三台机器。而且三台机器还部署了 3 个 zookeeper 和 kafka 。都是数据量不大。 节约机器钱
|
75
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 台服务器就行)。 |
76
rrfeng 2020-08-09 12:00:42 +08:00
不过按照 lz 的思路搞下去的话,搞个 cluster 这么分配:2 个机器带内存,1 个机器辅助不用内存。
三个机器上分别部署一个 redis 实例,不带内存的,只选举。分片永远。 两个带内存的机器分别部署一个 redis 大内存实例真正存储数据,刚好一对主从。 这样就是 3 节点 5 实例的 cluster,高可用,不用 sentinel,数据只有主从。 --------- lz 体验一下这个配置~~ |
79
ql562482472 2021-01-11 13:06:04 +08:00
就是集群其实是多主,主从是一主 别的都是引申结果
|