Redis Cluster集群的实现原理

  • 时间:
  • 浏览:1

  在分布式集群中,怎样保证相同请求落到相同的机器上,或者上边的集群机器能不可不也能尽或者的均分请求,时需使用合理的策略,有并有无生活传统的法子 :

1、哈希算法:采用固定节点数量,当某一节点宕机,缓存重建。

2、一致性哈希算法:当某一结点宕机,不可不也能此节点数据受影响。会将压力压到数据库。

  Redis Cluster使用的时hash slot算法通过采用固定节点数量和可配置映射节点,来补救取模的不灵活性和一致性哈希的主次影响。

  Redis Cluster将所有数据按照hash slot算法分布到16384[0-16383]个哈希槽上边,哈希槽分布在各节点上,各节点维护本人的哈希槽。

  当有新主节点加入集群中、从集群中移除节点或者因数据分布不均衡时时需数据重新分布时,就时需对数据分片的迁移。数据迁移分为有4个多多 步骤:

1、向目标节点发送请况变更命令,将目标节点的对应哈希槽请况置为importing。

2、向源节点发送请况变更命令,将源节点对应的哈希槽请况置为migrating。

3、针对源节点上的哈希槽的所有key,向源节点发送migrate命令,告知源节点将对应的key迁移到目标节点。

  当源节点的请况置为migrating后。此时源节点提供的服务和通常请况下有所区别:

1、或者Client访问的key尚未迁出,则正常的补救该key;

2、或者key或者迁出或者key不指在,则回复Client ASK,信息让其跳转到目标节点补救;

  当目标节点请况变成importing后。表示对应的slot正在向目标节点迁入。目标节点和通常请况下有所区别:

1、对于该slot上所有非ask跳转的操作,目标节点不必进行操作,随后通过moved让Client跳转至源节点执行。原先就保证了同有4个多多 key在迁移完后 总爱在源节点执行。迁移后总爱在目标节点执行,从而杜绝了双写的冲突。

2、迁移过程中,新增加的key会在目标节点执行,源节点不必新增key。使得迁移有界限,能不可不也能在某个选用的时刻现在结束了了。

  单个key的迁移过程能不可不也能通过原子化的migrate命令完成。对于源节点和目标节点的从节点,是通过主备群克隆,从而达到增删数据。当所有key迁移完成后,Client 通过Redis Cluster的setslot命令设置目标节点的分片信息,从而含晒 了迁入的slot。设置过程中会让Epoch自增,或者是Cluster中的最新值。或者通过相互感知,传播到Cluster 中的一点节点。

  Redis Cluster保证基本可用的特性,在达到一定条件时才会认定为fail:

1、某个主节点和所有从节点删改挂掉,则集群进入fail请况。

2、或者集群超过半数以上主节点挂掉,无论有无有从节点,集群进入fail请况。

3、或者集群任意主节点挂掉,且当前主节点这样从节点,集群进入fail请况。

  Redis Cluster是Redis在3.0版本推出的分布式补救方案。Redis Cluster由多个Redis节点组成。不同节点之间数据无交集,每个节点对应多个数据分片。节点内主次为主备节点,通过主备群克隆的法子 保证数据的一致性。有4个多多 主节点能不可不也能有多个从节点,主节点提供读写服务,从节点提供读服务。

  在Redis Cluster中,原则上每个主节点全是有4个多多 或多个Slave节点。集群中所有的Master节点都能不可不也能进行读写数据,不分主次。每个主节点与从节点间通过Goossip协议内部通信,异步群克隆。或者异步群克隆会原因一点特定请况下的数据丢失。随后有,Redis Cluster不可不也能保证数据的强一致性。

Redis Cluster设计的核心思想:数据拆分、去中心化。

  当集群中某节点中的所有从实例宕机时,Redis Cluster会将一点节点的非唯一从实例进行副本迁移,成为此节点的从实例。

  原先集群中每个主节点大慨有有4个多多 slave,使得Cluster 具有高可用。集群中只时需保持 2*master+1 个节点,就能不可不也能保持任一节点宕机时,故障转移后继续高可用。

  当主节点被集群公认为fail请况,这样它的从节点就会发起竞选,或者指在多个从节点,数据越新的节点越有或者发起竞选。集群中一点主节点返回响应信息。

  当Client访问的Key没哟当前节点的哈希槽中时,Redis Cluster会返回moved命令,并告知正确路由信息。当Client接收到moved命令时,会再次请求Redis并更新其内部路由缓存信息。

  当Redis Cluster在数据重新分布时,Redis Cluster会使用ask命令用于重定向。或者在数据重新分布时,某个哈希槽的数据或者同去指在于新旧有4个多多 节点。随后有ask只会重定向,不必说会更新路由信息。

  Redis Cluster实现了在分布式环境下各节点之间自动分割数据集、多节点读写与高可用的能力!

  首先,在Redis Cluster中每个节点都存有集群中所有节点的信息。它们之间通过互相ping-pong判断节点有无能不可不也能连接。或者有一半以上的节点去ping有4个多多 节点的完后 这样敲定,集群就认为你这人 节点宕机。

  当竞选从节点收到过半主节点同意,便会成为新的主节点。此后会以最新的Epoch通过PONG消息广播,让Redis Cluster的一点节点尽快的更新集群信息。当原主节点恢复加入后会降级为从节点。

  Redis Cluster各节点之间通过Redis Cluster Bus交互信息。Redis Cluster每个节点后会记录集群的配置信息:如信息版本号Epoch、集群请况State等数据。

  Redis Cluster的每个节点都保存着Node视角的集群特性。它描述了数据的分片法子 ,节点主备关系,并通过Epoch作为版本号实现集群特性信息的一致性,同去控制着数据迁移和故障转移的过程。