reids集群架构图:
在这个图中,每⼀个蓝⾊的圈都代表着⼀个redis的服务器节点。它们任何两个节点之间都是相互连通的(Gossip协议)。客户端可以与任何⼀个节点相连接,然后就可以访问集群中的任何⼀个节点。对其进⾏存取和其他操作。
那么redis是怎么做到的呢?⾸先,在redis的每⼀个节点上,有⼀个插槽(slot)可以理解为是⼀个可以存储两个数值的⼀个变量这个变量的取值范围是:0-16383。还有⼀个就是cluster我个⼈把这个cluster理解为是⼀个集群管理的插件。当我们的存取的key到达的时候,redis会根据CRC16的算法得出⼀个结果,然后把结果对 16384 求余数,这样每个 key 都会对应⼀个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接⾃动跳转到这个对应的节点上进⾏存取操作。 还有就是因为如果集群的话,是有好多个redis⼀起⼯作的,那么,就需要这个集群不是那么容易挂掉,所以呢,理论上就应该给集群中的每个节点⾄少⼀个备⽤的redis服务。这个备⽤的redis称为从节点(slave)。那么这个集群是如何判断是否有某个节点挂掉了呢?⾸先要说的是,每⼀个节点都存有这个集群所有主节点以及从节点的信息。
它们之间通过互相的ping-pong判断是否节点可以连接上。如果有⼀半以上的节点去ping⼀个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备⽤节点。如果某个节点和所有从节点全部挂掉,我们集群就进⼊faill状态。还有就是如果有⼀半以上的主节点宕机,那么我们集群同样进⼊发⼒了状态。这就是我们的redis的投票机制
Redis cluster是⼀个去中⼼化、多实例Redis间进⾏数据共享的集群。由于被设计为⽆中⼼节点和⽆代理节点,Redis cluster可以实现集群节点的在线线性伸缩,并通过主从复制模型来提供⼀定程度的⾼可⽤⾏,在实际环境中某个节点故障不可⽤时,集群其他节点可以持续提供服务。
关于数据分⽚,Redis cluster并没有采⽤⼀致性hash,⽽是引⼊了hash slot。整个集群共有16384个slot,这些slot被全部分配在各个节点中,并且可以在不同节点间迁移。⽽每个slot存放哪些数据是由key通过CRC16校验后对16384取模来决定的。
为了使集群中部分节点故障或者失去联系的情况下集群其他节点可以提供持续服务,Redis cluster 采⽤主从复制模型。简单的说,就是每个对外提供服务的节点,我们称之为master节点,并为每个master节点提供⼀个slave节点。当其中⼀个master节点故障时,其slave节点替代原有的master节点,以保证不会因为找不到slot⽽使整个集群不可⽤。
Redis cluster所具备的⽔平伸缩能⼒和⾼可⽤性。
注:对集群进⾏扩容收缩的⼯作,实际就是对slot的迁移,意味着进⾏数据迁移,过程挺消耗性能的,因此建议⼤家及时根据业务趋势提前做好评估和规划⼯作,避免在⾼峰时段给服务器增加额外的压⼒。
Slot机制的并发收益:
Slot机制还有⼀个很明显的优势,就是在处理并发的场景,因为它将数据集进⾏了分割,实际上减⼩了锁的粒度,从⽽扩⼤了并发度。Java中的ConcurrentHashMap容器是应⽤这种机制来实现并发的典型的例⼦
因篇幅问题不能全部显示,请点此查看更多更全内容