转载:http://blog.csdn.net/shmnh/article/details/72868328

Redis集群的目的是实现数据的横向伸缩,把一块数据分片保存到多个机器,可以横向扩展数据库大小,扩展带宽,计算能力等。

实现数据分片(集群)方式大致有三种:

1)客户端实现数据分片

即客户端自己计算数据的key应该在哪个机器上存储和查找,此方法的好处是降低了服务器集群的复杂度,客户端实现数据分片时,服务器是独立的,服务器之前没有任何关联。多数redis客户端库实现了此功能,也叫sharding,这种方式的缺点是客户端需要实时知道当前集群节点的联系信息,同时,当添加一个新的节点时,客户端要支持动态sharding.,多数客户端实现不支持此功能,需要重启redis。另一个弊端是redis的HA需要额外考虑。

2)服务器实现数据分片

其理论是,客户端随意与集群中的任何节点通信,服务器端负责计算某个key在哪个机器上,当客户端访问某台机器时,服务器计算对应的key应该存储在哪个机器,然后把结果返回给客户端,客户端再去对应的节点操作key,是一个重定向的过程,此方式是redis3.0正在实现,目前处于beta版本, Redis 3.0的集群同时支持HA功能,某个master节点挂了后,其slave会自动接管。

服务器端实现集群需要客户端语言实现服务器集群的协议,目前java,php,ruby语言多数有redis-cluster客户端实现版本。

Redis Cluster原理http://www.cnblogs.com/foxmailed/p/3630875.html

Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

关于负载均衡,集群的Redis Instance之间可以迁移数据,以Slot为单位,但不是自动的,需要外部命令触发。

关于集群成员管理,集群的节点(Redis Instance)和节点之间两两定期交换集群内节点信息并且更新,从发送节点的角度看,这些信息包括:集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(比如OK,PFAIL,FAIL,后面详述)是什么,包括节点角色(master 或者 slave)等。

关于可用性,集群由N组主从Redis Instance组成。主可以没有从,但是没有从 意味着主宕机后主负责的Slot读写服务不可用。

一个主可以有多个从,主宕机时,某个从会被提升为主,具体哪个从被提升为主,协议类似于Raft,参见这里。如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会定期给其他所有的节点发送Ping,cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。通过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,并且将其发送给其他所有节点,其他所有节点收到后立即认为该节点宕机。从这里可以看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。

Redis Cluster Slots是什么?http://www.zhizhihu.com/html/y2014/4590.html

举个栗子,Redis Cluster下,三个master,三个slave,即每个master有一个slave,那么slots是如何划分的呢?

Performing hash slots allocation on 6 nodes…

Using 3 masters:

127.0.0.1:7000

127.0.0.1:7001

127.0.0.1:7002

Adding replica 127.0.0.1:7003 to 127.0.0.1:7000

Adding replica 127.0.0.1:7004 to 127.0.0.1:7001

Adding replica 127.0.0.1:7005 to 127.0.0.1:7002

M: 09a89f7e08b7c00707e3507bea8016e9b4719d78 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: ddb8a2bc9b93b56a84d8e4c964af24e317767028 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 77335ea34c3d9fcff3a9bf55c1a73490a7153c29 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

S: 67ebdad9de818b13267c1779a941553e88798525 127.0.0.1:7003

replicates 09a89f7e08b7c00707e3507bea8016e9b4719d78

S: a3f6c70725c25f92c35816966aee9ee7248e4a33 127.0.0.1:7004

replicates ddb8a2bc9b93b56a84d8e4c964af24e317767028

S: 2a58a4ca50e0ad733e83be3eb4cbbc8d9103fbbe 127.0.0.1:7005

注意这里,

M: 09a89f7e08b7c00707e3507bea8016e9b4719d78 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: ddb8a2bc9b93b56a84d8e4c964af24e317767028 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 77335ea34c3d9fcff3a9bf55c1a73490a7153c29 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

好了,可以看到slots就是这样分配的。

如果一个key经过crc16后,如果他的slot为16381,那么他就在id为77335ea34c3d9fcff3a9bf55c1a73490a7153c29 的master上。

3)通过代理服务器实现数据分片

此方式是借助一个代理服务器实现数据分片,客户端直接与proxy联系,proxy计算集群节点信息,并把请求发送到对应的集群节点。降低了客户端的复杂度,需要proxy收集集群节点信息。Twemproxy是twitter开源的,实现这一功能的proxy。这个实现方式在客户端和服务器之间加了一个proxy,但这是在redis 3.0稳定版本出来之前官方推荐的方式。结合redis-sentinel的HA方案,是个不错的组合。

参考:http://www.zhizhihu.com/html/y2014/4590.html

http://www.cnblogs.com/foxmailed/p/3630875.html

http://itindex.net/detail/51037-redis-%E9%9B%86%E7%BE%A4

Redis集群分片原理相关推荐

  1. Redis集群的原理和搭建

    Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...

  2. Redis集群选举原理与脑裂问题

    系列文章目录 第一节 Redis的安装 第二节 Redis的五种数据结构(String.Hash.List.Set.ZSet) 第三节 Redis的持久化方式 第四节 Redis主从架构 第五节 Re ...

  3. redis集群分片存储

    文章目录 redis集群分片存储 为什么要分片存储 官方集群方案 搭建集群 集群关心的问题 Java客户端代码 非官方集群方案 redis集群分片存储 为什么要分片存储 假设公司用户有3千万,用户基本 ...

  4. redis 集群 分片 扩容_Redis高可用之集群实现原理

    概要:本文主要用于介绍Redis集群实现的原理,以及集群中的主从切换.副本漂移.分片迁移的原理 1 Redis集群实现的原理 集群是用来提供横向扩展能力,即当数据量增多以后,通过增加服务节点就可以扩展 ...

  5. redis 集群模式原理

    一.Redis分布式扩展之Redis Cluster方案 主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题.而且每个节点都保存了所有数据,一个是内存的占用率较高 ...

  6. Redis 集群搭建原理

    一.设计的主要特性和基本原理 1.集群目标 Redis 集群是 Redis 的分布式实现,在设计中按重要性顺序具有以下目标: 高性能和线性可扩展性,多达 1000 个节点.没有代理,使用异步复制,并且 ...

  7. 三张图秒懂Redis集群设计原理

    Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计. 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读写分离,直接上图: 图上能 ...

  8. Redis集群分片存储原理图

  9. Redis集群架构搭建和原理

    Redis集群架构教程 Redis常见的架构有主从.哨兵.高可用集群,接下来的文章分四章分别介绍linux安装redis.主从架构搭建.哨兵模式搭建.集群架构搭建 第一章 Redis的安装 我的cen ...

最新文章

  1. Java入门教程系列【1】Java基本数据类型 小白必入系列
  2. DOM模拟京东常用快捷键
  3. App Feedback
  4. springboot 2.3_Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  5. Angular form控件原生HTML代码里ng-reflect-form属性和其值的生成时机
  6. 对KVM虚拟机进行cpu pinning配置的方法
  7. 2017.3.22 小z的袜子 思考记录
  8. error lnk2001: mysql_使用mysql时的链接错误 | 学步园
  9. php根据时间搜索的控件,yii2 crud生成的搜索中 自定义按 时间 搜索
  10. html实现颜色色板,JS实现的系统调色板完整实例
  11. python贪吃蛇的实验报告_贪吃蛇游戏程序设计实验报告.doc
  12. 树莓派 能干啥_大神们都用树莓派做了哪些事
  13. Mathematica 分段函数 求导 求积分
  14. bcoma 应用程序发生错误_打开网页老是出现《应用程序错误》是怎么回事?
  15. 查看自己电脑的处理器和操作系统的位数
  16. SpringBoot使用mybatis-autogenerator时,显示Failure to find org.eclipse.m2e:lifecycle-mapping:pom:1.0.0错误
  17. 【已解决】SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.SLF4J: Defaulting to no-operat
  18. 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
  19. zoj 1905 Power String(后缀数组)
  20. H264 FU-A解包分析

热门文章

  1. 一款手机制作软件类工具的简单分析
  2. python是从abc发展_Python 简介
  3. NC推拉单或超链接打开单据的编辑页面
  4. 基于android的移动学习平台(前端APP+后端Java和MySQL)
  5. C++ 虚表 多态的实现原理
  6. 常用python机器学习库总结
  7. Python中常见的添加IP代理简单介绍
  8. dpdk 收发包问题案例:使用不匹配的收发包函数触发的不收包问题定位
  9. python实现pow函数(求n次幂,求n次方,分享两道阿里P7究极难度算法题
  10. 图像的深度和颜色类型