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. linux -- ubuntu14.10安装gnome桌面环境和dock工具

    ubuntu14.10系统自带Unity桌面环境,但是还是习惯于gnome桌面环境,再加上dock用着就很顺手了.   方法/步骤 首先,按Ctrl+Alt+T,调出终端.在其中输入:sudo apt ...

  2. Android 利用cursor来进行排序(转至http://blog.csdn.net/yangzongquan/article/details/6547860)

    主要思路是:override move系列的方法,让cursor以自己想要的顺序来移动,从而达到对cursor排序的目的.比如数组A0里有 4(0),3(1),1(2),2(3),括号内为位置,排序后 ...

  3. 基于mvcpager的分页(get请求,刷新页面),提供两种样式(来自bootstrap的样式)

    使用方法:先把mvcpager.dll引用加入mvc项目 下载路径在本文末尾 前台代码 前台: @{ Layout = null; } @using Webdiyer.WebControls.Mvc ...

  4. jquery-根据现有结果集得到另一个结果集(后代、祖先或兄弟元素)

    1.获取后代元素 1)children() 不传参数:得到结果集内所有元素的子元素 传入选择器:得到结果集内元素的匹配传入选择器的子元素 2)find() 传入选择器:得到匹配选择器的后代元素 传入j ...

  5. 基于PhoneGap3.4框架的iOS插件的实现

    Phonegap 提供了iOS 设备的基础特性接口来供HTML页面调用,可是这些基础接口不能满足我们的一些特殊需求,所以有时候我们须要开发插件来扩展其功能. 基于PhoneGap3.4框架的iOS插件 ...

  6. ftp命令行工具如何 连接 非标准21端口(其他端口)的ftp服务器

    windows: step1:ftp命令进入ftp交互环境 step2:ftp>open ip空格port 然后...

  7. AssetBundle中Unload()方法的作用

    AssetBundle.Unload(false)的作用: 官网的解释是这样的: When unloadAllLoadedObjects is false, compressed file data ...

  8. ubuntu zip解压

    您好,zip xx.zip压缩,unzip xx.zip 解压,tar zcvf xx.tar.gz压缩tar zxvf xx.tar.gz解压

  9. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  10. swift - UISegmentedControl 的用法

    一.创建控件,并监听控件选择值 /*选项除了文字还可以是图片 as关键字的作用就是字面意思:类型转换*/ let items = ["选项一", "选项二", ...