这里已经知道主从同步,会在网络分区(主从网络断开)时,会造成数据非一致性,不能高可用。而集群能有效解决这个问题,达到一个分布式系统的条件,保证数据一致性,高可用,以及当出现网络分区,不会影响前两个特性。

哨兵模式(Sentinel)

高可用的方案,一般是从节点上升至主节点,要不就是多个主节点方案,这样保证主节点宕机还能有服务可用,而哨兵模式(sentinel)则是采用从节点上升主节点的策略。

工作原理

image.png

  1. 客户端创建连接时,首先连接Redis Sentinel 集群,Redis Sentinel会告知client 主节点地址,如果主节点发生意外,客户端会重新向Redis Sentinel 获取主节点ip地址。
  2. Redis 负责监控节点健康状态,当主节点宕机,会选举其中最优从节点替代主节点位置,同时其他从节点和新的主节点重新建立数据同步关系

    还是会有数据丢失?

    答案是肯定的,从其工作原理上,我们可以知道,其数据同步的基础还是基于主从同步,那么意味着主节点宕机,或多或少存在指令数据丢失的问题。Sentinel不能保证数据完全不丢失。
    既然不能保证数据丢失,那么能不能减少数据丢失?
    有,那就是通过停止服务!!!
    两个参数选项
    min-slaves-to-write num :至少num个节点正常复制,否则停止主节点的对外服务。
    min-slaves-max-lag time: time 秒未收到从节点反馈则代表节点不正常了
    治标不治本的解决办法,看应用场景。

    基本使用

    不做参考

    Cluster

疑问

  1. key进行crc32算法进行hash得到一个整数,此整数对16384取模获取槽位。