redis集群原理

六月ゝ 毕业季﹏ 提交于 2020-11-22 19:53:53

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。整个集群共有16384slot,这些slot被全部分配在各个节点中,并且可以在不同节点间迁移。而每个slot存放哪些数据是由key通过CRC16校验后对16384取模来决定的。

  为了使集群中部分节点故障或者失去联系的情况下集群其他节点可以提供持续服务,Redis cluster 采用主从复制模型。简单的说,就是每个对外提供服务的节点,我们称之为master节点,并为每个master节点提供一个slave节点。当其中一个master节点故障时,其slave节点替代原有的master节点,以保证不会因为找不到slot而使整个集群不可用。

Redis cluster所具备的水平伸缩能力和高可用性。

注:对集群进行扩容收缩的工作,实际就是对slot的迁移,意味着进行数据迁移,过程挺消耗性能的,因此建议大家及时根据业务趋势提前做好评估和规划工作,避免在高峰时段给服务器增加额外的压力。

Slot机制的并发收益:

  Slot机制还有一个很明显的优势,就是在处理并发的场景,因为它将数据集进行了分割,实际上减小了锁的粒度,从而扩大了并发度。Java中的ConcurrentHashMap容器是应用这种机制来实现并发的典型的例子

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!