Redis cluster集群模式的原理

redis cluster

  自动将数据进行分片,每个master上放一部分数据
  提供内置的高可用支持,部分master不可用时,还是可以继续工作的

  支撑N个redis master node,每个master node都可以挂载多个slave node

  读写分离的架构,对于每个master来说,写就写到master,然后读就从mater对应的slave去读

  高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master

redis cluster vs. replication + sentinal

  如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了

  replication,一个mater,多个slave,要几个slave跟你的要求的读吞吐量有关系,然后自己搭建一个sentinal集群,去保证redis主从架构的高可用性,就可以了

  redis cluster,主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster

数据分布算法

hash算法

  比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache :

  hash(object)%N

  如果增加一个cache,映射公式变成了 hash(object)%(N+1)

  如果一个cache宕机了,映射公式变成了 hash(object)%(N-1)

  在这两种情况下,几乎所有的 cache 都失效了。会导致数据库访问的压力陡增,严重情况,还可能导致数据库宕机。

一致性hash算法

  一个master宕机不会导致大部分缓存失效,可能存在缓存热点问题

用虚拟节点改进

redis cluster的hash slot算法

  redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot

  redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot

  hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去

  移动hash slot的成本是非常低的

  客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现

  127.0.0.1:7000>CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000  可以将槽0-5000指派给节点7000负责。

  每个节点都会记录哪些槽指派给了自己,哪些槽指派给了其他节点。

  客户端向节点发送键命令,节点要计算这个键属于哪个槽。

  如果是自己负责这个槽,那么直接执行命令,如果不是,向客户端返回一个MOVED错误,指引客户端转向正确的节点。

转自:中华石杉Java工程师面试突击

猜你喜欢

转载自www.cnblogs.com/mengchunchen/p/10059436.html