集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,
通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。
一致性哈希有四个重要特征:
均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。
单调性:当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。
分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对 key 哈希应尽可能的避免重复。
但是:Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
Redis-Cluster
redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在【这种模式下每台redis服务器都存储相同的数据】,很浪费内存,所以在【redis3.0上加入了cluster模式,实现的redis的分布式存储】,【也就是说每台redis节点上存储不同的内容】。
Redis-Cluster采用无中心结构,它的特点如下:
1. 【所有的redis节点彼此互联(PING-PONG机制)】,内部使用二进制协议优化传输速度和带宽。
2. 节点的fail是通过集群中【超过半数的节点检测失效】时才生效。
3. 客户端与redis节点直连,不需要中间代理层。客户端不需要连接集群所有节点,【客户端连接集群中任何一个可用节点即可】。
redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster负责维护node<->slot<->value。
Redis集群预分好16384个桶,当需要在Redis集群中放置一个key-value 时,【根据CRC16(key) mod 16384的值,决定将一个key放到哪个桶中】。
要让集群正常工作至少需要3个主节点,一共就需要6个节点,其中3个为主节点,3个为从节点