Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代,目前,Redis已经发布了3.0.7版本。redis
redis cluster是去中心化,去中间件的,也就是说,集群中的每一个节点都是平等的关系,都是对等的,每一个节点都保存各自的数据和整个集群的状态。每一个节点都和其余全部节点链接,并且这些链接保持活跃,这样就保证了咱们只须要链接集群中的任意一个节点,就能够获取到其余节点的数据。算法
那么redis 是如何合理分配这些节点和数据的呢?服务器
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另一种叫作哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当咱们set一个key 时,会用CRC16算法来取模获得所属的slot,而后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。中间件
注意的是:必需要3个之后的主节点,不然在建立集群时会失败,咱们在后续会实践到。blog
因此,咱们假设如今有3个节点已经组成了集群,分别是:A, B, C 三个节点,它们能够是一台机器上的三个端口,也能够是三台不一样的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:hash
节点A覆盖0-5460;class
节点B覆盖5461-10922;集群
节点C覆盖10923-16383.高可用
那么,如今我想设置一个key ,好比叫my_name:数据
set my_name wind
按照redis cluster的哈希槽算法:CRC16(‘my_name’)%16384 = 2412。 那么就会把这个key 的存储分配到 A 上了。
一样,当我链接(A,B,C)任何一个节点想获取my_name这个key时,也会这样的算法,而后内部跳转到B节点上获取数据。
这种哈希槽的分配方式有好也有坏,好处就是很清晰,好比我想新增一个节点D,redis cluster的这种作法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大体就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
一样删除一个节点也是相似,移动完成后就能够删除这个节点了。
Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 若是这3个节点都没有加入从节点,若是B挂掉了,咱们就没法访问整个集群了。A和C的slot也没法访问。
因此咱们在集群创建的时候,必定要为每一个主节点都添加了从节点, 好比像这样, 集群包含主节点A、B、C, 以及从节点A一、B一、C1, 那么即便B挂掉系统也能够继续正确工做。
B1节点替代了B节点,因此Redis集群将会选择B1节点做为新的主节点,集群将会继续正确地提供服务。 当B从新开启后,它就会变成B1的从节点。
不过须要注意,若是节点B和B1同时挂了,Redis集群就没法继续正确地提供服务了。
集群的时候,咱们能够单机集群也能够多机集群,后面咱们分别实验;