V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zero47
V2EX  ›  Redis

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

  •  2
     
  •   zero47 · 2020-08-07 10:54:12 +08:00 · 17648 次点击
    这是一个创建于 1550 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    第 1 条附言  ·  2020-08-07 12:29:51 +08:00
    补充一下,我知道它们不是一个东西,我的主张是哨兵这个功能是否可以在日后被取缔。
    目前的问题是,集群至少需要 3 个 master 节点,很多情况只需要单节点,集群也只有一个数据库。
    如果后续更新集群能做到 1 主 1 从,其实就能取缔了吧?
    第 2 条附言  ·  2020-08-07 17:00:43 +08:00
    再强调一下把,大神总是说分不清集群和哨兵,我没有在说它们是一个东西啊,我是说用了集群,高可用其实就不需要哨兵了,因为 master 出事,slave 会参与选举顶上,我知道集群是用来分槽,哨兵用来替换的,我说的就不是这些事。我说的是为什么主流框架还是喜爱使用哨兵,而不是集群。
    第 3 条附言  ·  2020-08-08 01:16:41 +08:00
    可能是问题的表述有问题,出现了不少歧义,大家没必要互怼也没必要抬杠,我想要的答案回复中的都有了,感谢大家,学到了不少东西。
    79 条回复    2021-01-11 13:06:04 +08:00
    KaynW
        1
    KaynW  
       2020-08-07 10:59:30 +08:00
    redis 小白占坑
    Ariver
        2
    Ariver  
       2020-08-07 11:03:26 +08:00
    cluster 是怎么实现高可用的?
    edk24
        3
    edk24  
       2020-08-07 11:04:56 +08:00
    redis 小白占坑 坐等大佬讲解
    0x49
        4
    0x49  
       2020-08-07 11:06:22 +08:00
    坐等大佬讲解
    wangyanrui
        5
    wangyanrui  
       2020-08-07 11:06:43 +08:00   ❤️ 8
    一脸懵逼??
    哨兵是哨兵,集群是集群。
    哨兵是找一个人,专门看管这群人
    集群是一个人干不完活,多找几个人干活的

    感觉楼主都没有明白这两个模式的字面意思啊
    misaka19000
        6
    misaka19000  
       2020-08-07 11:07:31 +08:00
    因为低版本不支持集群
    misaka19000
        7
    misaka19000  
       2020-08-07 11:08:35 +08:00
    哨兵模式的 slave 也可以读数据的
    monsterxx03
        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 也没啥问题
    sujin190
        9
    sujin190  
       2020-08-07 11:13:53 +08:00
    哨兵单独进程,并不保存数据吧,也几乎不占内存,可以和 slave 部署在一起,那么看起来其实也是可以提供读取的吧,但是吧基于一致性和持久化性能要求,真的有人会在 slave 上提供读服务么
    useben
        10
    useben  
       2020-08-07 11:15:08 +08:00   ❤️ 1
    你对 redis cluster 的理解错了, 集群的核心是分片
    Jrue0011
        11
    Jrue0011  
       2020-08-07 11:15:19 +08:00
    稍微搜了下,感觉这两个的关系应该是这样的?
    主从加哨兵实现高可用,cluster 集群内部貌似也是用主从加哨兵做高可用,只不过 cluster 还同时做好了负载均衡
    DaBingShui
        12
    DaBingShui  
       2020-08-07 11:17:58 +08:00
    哨兵模式是 redis2.x 的吧,现在 redis3.x 一般都用集群了
    wangyzj
        13
    wangyzj  
       2020-08-07 11:37:57 +08:00
    cluster 是横向扩展比较好
    烧饼是高可用比较好
    各取所需
    TypeError
        14
    TypeError  
       2020-08-07 11:40:55 +08:00 via Android
    用途不一样,用哨兵基本没分片需求,主从监控一下就行
    egglin
        15
    egglin  
       2020-08-07 11:45:37 +08:00
    个人理解主从用哨兵,分片用集群
    yiyi11
        16
    yiyi11  
       2020-08-07 12:03:25 +08:00 via Android
    本质就是有没有数据分片需求,sentinel 只提供高可用,cluster 提供高可用+数据分片。其实 cluster 比较香是因为,redis 足够轻量,搭建部署足够简单,搭建 cluster 并不比 sentinel 麻烦很多,但却多了分片的好处(扩展性)。
    zero47
        17
    zero47  
    OP
       2020-08-07 12:03:30 +08:00
    @wangyanrui 我当然知道是两个东西,但几个人干活也能互相监督,谁倒了就谁顶上,不就不需要哨兵了吗?我的观点是集群是否可以取缔哨兵,而不是说他们是一个东西。
    optional
        18
    optional  
       2020-08-07 12:34:04 +08:00 via iPhone
    分片是有代价的, 不是无痛的。
    672795574
        19
    672795574  
       2020-08-07 12:34:23 +08:00
    个人见解
    哨兵最少只要三个节点即可
    哨兵可以不和集群部署在一起
    672795574
        20
    672795574  
       2020-08-07 12:41:10 +08:00
    你说的方案应该是可以的,但是架构又没有银弹,只是 redis 官方提供了这个方案而已
    gadsavesme
        21
    gadsavesme  
       2020-08-07 12:44:27 +08:00
    哨兵可以监控很多实例啊,有的公司 redis 需求有但是不高的情况,整那么多集群干嘛,简单的主从能防宕机就行了。几台哨兵能监控一大堆东西了,毕竟机器是要钱的。
    Xusually
        22
    Xusually  
       2020-08-07 12:44:45 +08:00
    如果只单纯论高可用的话,是可以用集群替代哨兵的。
    但是集群有集群的问题,分片并不是完全透明无痛的。
    哨兵就是在原有结构基础上做的高可用切换而已,简单易用。
    lewis89
        23
    lewis89  
       2020-08-07 12:47:14 +08:00   ❤️ 1
    一个是高可用,一个是高吞吐
    monsterxx03
        24
    monsterxx03  
       2020-08-07 12:52:28 +08:00 via Android
    你附言里说的一主一从的 cluster 其实现在就能实现,所有 slot 分配到一个节点就行了,但这样没法实现 failover , 从 raft 的本质来讲,稳定的 failover 至少三节点起,目前 redis 实现里只有 master 会参与选举,如果以后 slave 能参与,一主两从实现高可用我觉得也是可行的
    singerll
        25
    singerll  
       2020-08-07 13:25:35 +08:00 via Android
    因为好多业务刚开发时完全用不到集群,随着业务的增加,最小的成本就是哨兵,业务再增加,就重构走集群。
    ty89
        26
    ty89  
       2020-08-07 13:37:55 +08:00
    哨兵是为了高可用设计的,集群是用来分布式扩容,完全两码事。
    zliea
        27
    zliea  
       2020-08-07 13:51:27 +08:00
    集群的问题我觉得是只有一个库。
    哨兵的话,可以做到主写从读。
    wangxiaoaer
        28
    wangxiaoaer  
       2020-08-07 13:57:39 +08:00 via iPhone
    不熟悉,但是感觉一个是低成本高可用,一个是高成本高负载?
    robot1
        29
    robot1  
       2020-08-07 13:59:19 +08:00
    当然是没有必要使用集群的时候啊,只需要一些高可用性,哨兵足够
    zero47
        30
    zero47  
    OP
       2020-08-07 14:03:56 +08:00
    @monsterxx03 你想表达的是只有 master 会参与投票吧? master 坏掉的 slave 是可以参选的。
    rrfeng
        31
    rrfeng  
       2020-08-07 14:13:23 +08:00   ❤️ 6
    sentinel 和 cluster 完全就是两码事。

    sentinel 用在『 Redis 主从复制』架构下,帮助做故障恢复的,是个工具人。主从模式是用来提高可用性的。

    cluster 是数据分片模式,是扩展容量 /吞吐量的,没有 sentinel 什么事。然后 cluster 模式的每个分片为了提高可用性,也可以使用主从模式,把 sentinel 工具人也用起来,就是终极模式了。
    monsterxx03
        32
    monsterxx03  
       2020-08-07 14:22:43 +08:00 via Android
    @zero47 对,表述有问题,是这个意思
    rrfeng
        33
    rrfeng  
       2020-08-07 14:27:27 +08:00
    目前的问题是,集群至少需要 3 个 master 节点,很多情况只需要单节点,集群也只有一个数据库。
    如果后续更新集群能做到 1 主 1 从,其实就能取缔了吧?
    ---------------------
    你的『集群』是啥自己还没弄明白呢……
    zero47
        34
    zero47  
    OP
       2020-08-07 16:58:22 +08:00
    @rrfeng 大哥,咋总是说分不清集群和哨兵,我没有在说它们是一个东西啊,我是说用了集群,高可用其实就不需要哨兵了,因为 master 出事,slave 会参与选举顶上,怎么总说集群是用来分槽,哨兵用来高可用,我说的就不是这些事。
    zero47
        35
    zero47  
    OP
       2020-08-07 17:03:53 +08:00
    ES 的高可用方案就是集群,为啥到这里集群就只能起分片作用呢,除了分片它也可以用作高可用方案啊。
    rrfeng
        36
    rrfeng  
       2020-08-07 17:18:54 +08:00
    @zero47

    集群和哨兵不是一回事 -> 为什么不用集群代替哨兵????
    ===
    馒头喂人屎喂猪 -> 你为什么不吃屎代替馒头????
    rrfeng
        37
    rrfeng  
       2020-08-07 17:19:23 +08:00
    你是傻逼吗……刚才删掉了这句话,还是忍不住再发一次。
    zero47
        38
    zero47  
    OP
       2020-08-07 17:23:31 +08:00
    @rrfeng 好吧,我知道你听不懂人话了,谢谢你的答复
    rrfeng
        39
    rrfeng  
       2020-08-07 17:27:23 +08:00
    @zero47
    看你态度不错再解释一下:

    哨兵:解决高可用问题
    集群:解决容量问题

    你告诉我,一个解决容量问题的方案,怎么代替高可用方案?

    如果还不明白那这个楼里应该没人会理你了。
    zero47
        40
    zero47  
    OP
       2020-08-07 17:30:21 +08:00
    @rrfeng 我想表达的是用了 redis-cluster,比如 3 个 master,3 个 slave, 当一个 master 出事了,对应的 slave 是会参与选举然后顶上的,这不就实现了高可用了吗?
    lhy0dyx
        41
    lhy0dyx  
       2020-08-07 17:32:16 +08:00
    你说的哨兵应该是指主从模式,哨兵是用来监控的,一般和会主从模式结合,主节点挂了,把从节点升级成主节点,集群是为了扩容,通过哈希槽的方式来扩展整个 redis 的存储空间。大型使用一般是用集群,集群的节点用主从,同时配哨兵来检测主节点挂没挂,如果再考虑哨兵可能会挂,还可以配多哨兵,互相监控。
    rrfeng
        42
    rrfeng  
       2020-08-07 17:36:22 +08:00
    所谓的『高可用集群』就是把两个方案叠加起来,只是你看不到 sentinel 了而已。

    要实现高可用至少要 3 节点,所以你说的 cluster 模式一主一从无法实现。
    rrfeng
        43
    rrfeng  
       2020-08-07 17:37:29 +08:00
    如果后续更新集群能做到 1 主 1 从,其实就能取缔了吧?
    ---------
    不可能。结贴。
    useben
        44
    useben  
       2020-08-07 17:39:58 +08:00
    @lhy0dyx 集群的节点用主从,同时配哨兵来检测主节点挂没挂,如果再考虑哨兵可能会挂,还可以配多哨兵,互相监控。这里你理解错了

    集群没有哨兵这套, 而是内部实现故障转移的机制, 是基于 raft 那套
    TypeError
        45
    TypeError  
       2020-08-07 17:42:54 +08:00 via Android
    一主一从搞个毛线集群啊
    lhy0dyx
        46
    lhy0dyx  
       2020-08-07 17:52:28 +08:00
    @useben 感谢指点
    yidou9527
        47
    yidou9527  
       2020-08-07 17:56:51 +08:00
    我觉得楼主理解是没有错的 前面人没细看楼主说的话 或者自己可能没太搞懂 redis cluster
    zgzhang
        48
    zgzhang  
       2020-08-07 18:01:04 +08:00   ❤️ 1
    @zero47 目前工作中绝大部分使用的都是集群部署,部分使用哨兵是需要 mget
    whahuzhihao
        49
    whahuzhihao  
       2020-08-07 18:09:04 +08:00   ❤️ 1
    楼主问的应该是,既然集群也能实现高可用,为啥还要用哨兵
    msg7086
        50
    msg7086  
       2020-08-07 18:45:50 +08:00
    借贴问问题。

    手里有一个场景,两台服务器在两个机房,服务器上有相应的应用需要对本机 Redis 节点做大量读取和异步写入,所以需要数据在两边都完整地存一份,支持两边同时读取和同时异步写入。这种场景现在 Redis Cluster 能实现吗?

    现在是用 KeyDB 的双主节点异步 Replication 来做的,稳定性存疑,但是一直找不到替代方案。
    zero47
        51
    zero47  
    OP
       2020-08-07 18:52:53 +08:00
    @zgzhang 感谢回答
    zero47
        52
    zero47  
    OP
       2020-08-07 18:53:28 +08:00
    @whahuzhihao 一开始没想到这么大的歧义,感谢理解
    zero47
        53
    zero47  
    OP
       2020-08-07 19:16:04 +08:00
    @msg7086 不太了解具体需求,但感觉这不是最佳方案,redis cluster 是可以做到两边都完整存一份的,它可以实现机器 A 负责存储一部分数据,机器 B 存储一部分数据,然后各自设立对方 slave 来获得副本。但无法保证 A 只调用 A 的 redis,A 也可能调用 B 的 redis
    msg7086
        54
    msg7086  
       2020-08-07 19:34:46 +08:00 via Android
    @zero47 唔,不能跨机房调用,性能问题。一台机器上每秒上万请求,跨机房访问必炸…
    RedisMasterNode
        55
    RedisMasterNode  
       2020-08-07 19:34:51 +08:00
    @wangyanrui 你理解得不对,是不是以为 Redis Cluster 是几台机器组起来的集群,然而其实并不是,典型的架构是例如起 3 主 3 从的 Redis Cluster,这里面会包括有了当主节点挂掉的时候,从节点接替继续工作的 Feature,而不是挂了其中之一就挂掉,所以这两者是有可比性并且哨兵确实就是落后的。
    RedisMasterNode
        56
    RedisMasterNode  
       2020-08-07 19:36:00 +08:00
    @wangyanrui 哨兵仅仅是 Redis 高可用的方案之一,而 Cluster 是同时做了高性能和高可用的方案,并不是只是组集群发挥更高性能而已,所以~建议下次指点别人之前确认自己的理解是正确的,不然就,hhh 蛮尴尬^_^
    guagusi
        57
    guagusi  
       2020-08-07 21:14:06 +08:00
    集群的优点就不说了。1>单从成本来说,哨兵只需要部署两个服务:1master 和 1slave ;集群至少得 6 个服务:3 个 master 和 3 个 slave ; 2>从运维成本来说,哨兵更容易维护; 3>写效率来说,集群得对 key 进行哈希计算决定写入哪个 master,如果不是当前节点则会返回给客户端让客户端重新发起写去请求(类似于 HTTP 的 302 重定向)
    GGGG430
        58
    GGGG430  
       2020-08-07 21:32:41 +08:00
    不会还有人用 redis 哨兵吧? 不会吧 不会吧 .... 哈哈, 无知!
    angryfish
        59
    angryfish  
       2020-08-07 23:46:49 +08:00 via iPhone
    用了集群,貌似事务特性就没了?还有好些指令不能用了。而很多应用,其实并发没那么高,redis 也基本不会宕机,没必要浪费那么多台服务器
    wangyanrui
        60
    wangyanrui  
       2020-08-08 00:01:57 +08:00 via Android
    @RedisMasterNode 只是形象的举例
    rrfeng
        61
    rrfeng  
       2020-08-08 00:43:26 +08:00 via Android
    cluster 你可以不开高可用,他是提供了这样的方案而已,而且至少要 3 节点。所以上面有人说 sentinel 和 cluster 的定位不同并没有任何错误。

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

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

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

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

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

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

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

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

    所以目前哨兵模式仍然被广泛使用,没有被集群模式彻底替代。
    Henry399
        73
    Henry399  
       2020-08-08 11:06:10 +08:00
    因为对于很多企业来说缓存数据没那么大,Cluster 用不到,主从加哨兵就够了.一般哨兵会配合主从结构,哨兵使集群高可用,主从高并发.主从适合读多写少情况,主负责写,从负责读.Cluster 本身具备哨兵和主备切换功能,很好,但是很多公司用不到啊,没那么多数据量搞这个玩意干嘛,老板会同意?
    duteliang
        74
    duteliang  
       2020-08-08 12:46:28 +08:00
    我们公司就是用哨兵了。为什么不用 Cluster 。因为费钱。集群需要机器太多了。本身数据量就不大。分片功能不需要。 就只是想要一个高可用的 redis 。 用哨兵符合需求了。 只需要三台机器。而且三台机器还部署了 3 个 zookeeper 和 kafka 。都是数据量不大。 节约机器钱
    yexiangyang
        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 台服务器就行)。
    rrfeng
        76
    rrfeng  
       2020-08-09 12:00:42 +08:00
    不过按照 lz 的思路搞下去的话,搞个 cluster 这么分配:2 个机器带内存,1 个机器辅助不用内存。
    三个机器上分别部署一个 redis 实例,不带内存的,只选举。分片永远。
    两个带内存的机器分别部署一个 redis 大内存实例真正存储数据,刚好一对主从。
    这样就是 3 节点 5 实例的 cluster,高可用,不用 sentinel,数据只有主从。

    ---------
    lz 体验一下这个配置~~
    Coolha
        77
    Coolha  
       2020-12-27 12:42:26 +08:00
    @672795574 赞同
    Coolha
        78
    Coolha  
       2020-12-27 12:50:10 +08:00
    @nekoyaki 说的真好👍
    ql562482472
        79
    ql562482472  
       2021-01-11 13:06:04 +08:00
    就是集群其实是多主,主从是一主 别的都是引申结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 22:07 · PVG 06:07 · LAX 14:07 · JFK 17:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.