redis cluster 集群畅谈(一)

redis单机在大数据量状况的会出现瓶颈问题,经过redis 主从架构和 哨兵集群结合能够实现99.99% 高可用 、水平扩容支持更高QPS的解决方案。node

在大数据量面前,主从架构结合哨兵集群的解决方案在复杂的配置下就显得有些捉襟见肘了;数据量越大,就愈明显。因此本章从海量数据出发,redis cluster 集群架构以更少的配置作更多的事。redis

redis cluster 集群架构 的优点在哪呢?

  • 支持水平扩容 N个redis master node,而且每一个master node一样能够挂载 N 个 slave node算法

  • 读写分离的架构(这个概念其实在redis cluster就没有了,可是能够作,由于redis cluster 更强调的是水平扩容)数组

  • 高并发缓存

  • 高可用(无需sentinel 哨兵监控,若是master 挂了,redis cluster 内部自动 将slave 切换 master)网络

  • 配置减小(相对 replication + sentinal 而已,就不须要手动搭建replication复制+主从架构+读写分离+哨兵集群+高可用了)架构

redis cluster 和 replication + sentinal 比较?

  • 二者都是解决redis 单机瓶颈问题(宕机不可用,低QPS,性能差等)
  • 根据自身数据需求选择合适解决方案
    • 数据量不多(几个G),redis 单机就能够解决
    • 数据量大, 一主多从(1 master N slave ,具体根据自身读吞吐量而定) + 哨兵集群(sentinal 保证高可用)
    • 海量数据,redis cluster 集群(N master N slave , 海量数据 + 高并发+ 高可用)并发


       
      replication + sentinal vs redis cluster

redis cluster 数据分片

redis cluster 会对数据进行自动分片,将数据分配到每一个Master 上(自动的负载均衡)负载均衡

redis cluster 全部节点直接都是相互链接的,它要求开放两个端口,一个端口负责对外数据交换(port:6379),另一个端口用来内部通讯(port : 6379 + 10000 = 16379),也就是集群总线的通讯(cluster bus)高并发

  • cluster bus 用来进行故障检测,配置更新,故障转移受权
  • cluster bus 使用一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间
redis cluster 使用什么样的算法保证数据分片?
首先讲下最原始的的 Hash 算法,以下图所示:
 
hash 算法
其次讲下一致性 Hash 算法(自动缓存迁移) + 虚拟节点(自动负载均衡)
 
一致性Hash算法

一致性hash 算法 必定程度上解决了node宕机后的大部分数据失效问题,可是也会致使node 的热点问题,下降性能,这个又该怎么解决呢? 能够经过增长虚拟节点的方式 让 hash 点散落更均匀 ,不光能解决热点问题,还能够达到自动的负载均衡效果。

 
一致性 Hash 算法(自动缓存迁移) + 虚拟节点(自动负载均衡)
redis cluster 采用的是 hash slot 算法

redis cluster 拥有固定的17004个slot (槽) ;这个槽是虚拟的,并非真正存在。slot 被 分布到 各个master 中,当 某个key 映射到 某个master 负责的槽时,就由对应的master 为key 提供服务

在redis cluster 中,只有master 才拥有对slot的全部权,slave 只负责使用 slot,并无全部权。

那么 redis Cluster 又是如何知道哪些槽是由哪些节点负责的呢?Master 又是如何知道哪一个槽是本身的呢?
位序列结构(节约存储空间)

每一个Master节点都维护着一个位序列,为17004 / 8 字节;Master 节点 经过 bit 来标识哪些槽本身是否拥有。好比对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是否是为1便可。

集群同时维护着槽与集群节点的映射关系,由17004个长度的数组记录,槽编号为数组的下标,数组内容为集群节点,这样就能够很快地经过槽编号找到负责这个槽的节点。

键空间分布基本算法
下面看下redis cluster 是经过什么样的方式进行 分片存储的

key 与 slot 的映射算法公式以下:

HASH_SLOT=CRC16(key) mod 17004

redis cluster 经过对每一个key计算CRC16值,而后对17004取模,能够获取key对应的hash slot,对于一批量数,若是想让批量数据都在同一个slot,能够经过hash tag来实现

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

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

移动 hash slot 的成本是很是低的

因为 17004 是固定的,当某个master 宕机时,不会影响其余机器的数据,由于key 找得是hash slot ,而不是机器
相关文章
相关标签/搜索