Redis集群分片原理
转载: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集群分片原理相关推荐
- Redis集群的原理和搭建
Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...
- Redis集群选举原理与脑裂问题
系列文章目录 第一节 Redis的安装 第二节 Redis的五种数据结构(String.Hash.List.Set.ZSet) 第三节 Redis的持久化方式 第四节 Redis主从架构 第五节 Re ...
- redis集群分片存储
文章目录 redis集群分片存储 为什么要分片存储 官方集群方案 搭建集群 集群关心的问题 Java客户端代码 非官方集群方案 redis集群分片存储 为什么要分片存储 假设公司用户有3千万,用户基本 ...
- redis 集群 分片 扩容_Redis高可用之集群实现原理
概要:本文主要用于介绍Redis集群实现的原理,以及集群中的主从切换.副本漂移.分片迁移的原理 1 Redis集群实现的原理 集群是用来提供横向扩展能力,即当数据量增多以后,通过增加服务节点就可以扩展 ...
- redis 集群模式原理
一.Redis分布式扩展之Redis Cluster方案 主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题.而且每个节点都保存了所有数据,一个是内存的占用率较高 ...
- Redis 集群搭建原理
一.设计的主要特性和基本原理 1.集群目标 Redis 集群是 Redis 的分布式实现,在设计中按重要性顺序具有以下目标: 高性能和线性可扩展性,多达 1000 个节点.没有代理,使用异步复制,并且 ...
- 三张图秒懂Redis集群设计原理
Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计. 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读写分离,直接上图: 图上能 ...
- Redis集群分片存储原理图
- Redis集群架构搭建和原理
Redis集群架构教程 Redis常见的架构有主从.哨兵.高可用集群,接下来的文章分四章分别介绍linux安装redis.主从架构搭建.哨兵模式搭建.集群架构搭建 第一章 Redis的安装 我的cen ...
最新文章
- Java入门教程系列【1】Java基本数据类型 小白必入系列
- DOM模拟京东常用快捷键
- App Feedback
- springboot 2.3_Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Angular form控件原生HTML代码里ng-reflect-form属性和其值的生成时机
- 对KVM虚拟机进行cpu pinning配置的方法
- 2017.3.22 小z的袜子 思考记录
- error lnk2001: mysql_使用mysql时的链接错误 | 学步园
- php根据时间搜索的控件,yii2 crud生成的搜索中 自定义按 时间 搜索
- html实现颜色色板,JS实现的系统调色板完整实例
- python贪吃蛇的实验报告_贪吃蛇游戏程序设计实验报告.doc
- 树莓派 能干啥_大神们都用树莓派做了哪些事
- Mathematica 分段函数 求导 求积分
- bcoma 应用程序发生错误_打开网页老是出现《应用程序错误》是怎么回事?
- 查看自己电脑的处理器和操作系统的位数
- SpringBoot使用mybatis-autogenerator时,显示Failure to find org.eclipse.m2e:lifecycle-mapping:pom:1.0.0错误
- 【已解决】SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.SLF4J: Defaulting to no-operat
- 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
- zoj 1905 Power String(后缀数组)
- H264 FU-A解包分析