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

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

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 ,而不是机器

redis cluster 集群畅谈(一)的更多相关文章

  1. redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

    上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊r ...

  2. redis cluster 集群畅谈(二)

    上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入.读写分离.实 ...

  3. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  4. jedis处理redis cluster集群的密码问题

    环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本 ...

  5. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  6. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  7. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

  8. CentOS7 安装Redis Cluster集群

    上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...

  9. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

随机推荐

  1. 【转载】PADS Layout将导入DXF,并转换成板框步骤

    1.在PADS Layout中选择 Import... 2.选择DXF文件(一般由结构工程师给出),直接点OK即可. 3.导入后,板框图一角视图如下.右键选择 Select Shapes,然后双击外框 ...

  2. 【Java面试题】32 ArrayList和Vector的区别

    1. Vector & ArrayList  相同点: 1.ArrayList和Vector都是继承了相同的父类和实现了相同的接口 2.底层都是数组实现的 3.初始默认长度都为10. 不同点: ...

  3. 【Java NIO的深入研究2】RandomAccessFile的使用

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...

  4. 笔记本怎么设置WIfi热点

    随着手机的发展,流量的消耗也是大大地增加.虽然很多手机支持wifi,但是不加密或者知道密码的wifi热点却寥寥无几.笔记本的无线网卡显出神通了.那么,如何在笔记本上建立wifi热点呢? 工具/原料 一 ...

  5. 编写高性能的jQuery代码

    jQuery Optimization 现在jQuery已经出现在很多项目中,然而许多同学忽略了他的性能问题以及代码质量问题, 下面是我对jQuery的一些性能方面的学习. 选择器 选择器是jQuer ...

  6. 超全面的JavaWeb笔记day13<JSTL&自定义标签>

    1.JSTL标签库(重点) core out set remove url if choose when otherwise forEach fmt formatDate formatNumber 2 ...

  7. Java类的设计----方法的重写、覆盖

    方法的重写.覆盖 在子类中可以根据需要对从父类中继承来的方法进行改造—覆盖方法(方法的重置.重写),在程序执行时,子类的方法将覆盖父类的方法. 覆盖方法必须和被覆盖方法具有相同的方法名称.参数列表和返 ...

  8. Python Scrapy初步使用

    1.创建爬虫工程 scrapy startproject stockproject001 2.创建爬虫项目 cd stockproject001 scrapy genspider stockinfo ...

  9. GIS-006-ArcGIS API 空间关系

    Name Description 解释 SPATIAL_REL_CONTAINS Part or all of a feature from feature class 1 is contained ...

  10. python2.0_s12_day10_Twsited异步网络框架

    Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Package application Configu ...