Redis集群功能概述
在单机Redis中介绍过Redis的复制特性以及Redis Sentinel和twemproxy,其中:
复制:可以创建指定服务器的复制品,这些复制品可以用户扩展系统处理读请求的能力;
Redis Sentinel:可以在复制特性的基础上,通过监视主从服务器并在主服务器故障时执行自动故障转移来保证系统的可用性;
twemproxy:使用分片策略来讲数据库划分到多个不同的服务器,以此来扩展系统存储的数据量,并通过将命令请求分散给不同的服务器来处理,以此来扩展系统处理命令请求的能力;
但是以上的特性都是独立的,如果我们需要一个完整地包含复制、高可用和分片特性的Redis服务器集群,那么就需要用到Redis的集群(Cluster)特性;
Redis集群
Redis的分布式数据库实现
分布式
Redis集群是一个由多个Redis服务器组成的分布式网络服务器群,集群中的各个服务器被称为节点(Node),这些节点会相互连接并进行通信;
分布式的Redis集群没有中心节点,所以用户不必当心某个节点会成为整个集群的性能瓶颈;

复制
Redis集群的每个节点都有两种角色可选:主节点(master node)和从节点(slave node),其中主节点用于存储数据,而从节点则是某个主节点的复制品;
当用户需要处理更多的请求时,添加从节点可以扩展系统的读性能。因为Redis集群重用了单机Redis复制特性,所以集群的复制行为和单机复制行为是完全一样的;
下图展示了为每个主节点各添加一个从节点:

节点故障检测和自动故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移;
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。
举个栗子:当7000下线时,7001和7002会觉察到这一点,并对7000进行故障转移。

分片
集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担;
集群将使用这个数据库分为16384个槽(slot),所有键都属于这16384个槽的其中一个,计算键key属于哪个槽的公式:slot_number = crc16(key)%16384,其中crc16为16位的循环冗余校验和函数;
集群中的每个主节点都可以处理0到16384个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求;
举个栗子:
有三个主节点7000,7001和7002,那么:
将槽0到5460指派给节点7000负责处理;
将槽5461到10922指派给节点7001负责处理;
将槽10923到16383指派给节点7002复制处理;
这样就可以将16384个槽平均地指派给三个节点负责处理;
转向
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求;
如果一个节点接收到了和自己处理的槽无关的命令,那么节点会向客户端反馈一个转向错误(redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含的地址和端口号重新向正确的节点发送命令请求;

Redis集群功能概述的更多相关文章
- Redis集群功能预览
目前Redis Cluster仍处于Beta版本,Redis 3.0将会加入,在此可以先对其主要功能和原理进行一个预览.参考<Redis Cluster - a pragmatic approa ...
- 基于Twemproxy的Redis集群方案(转载)
原文地址:基于Twemproxy的Redis集群方案 概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的 ...
- Redis集群方案(来自网络)
参考: https://www.zhihu.com/question/21419897 http://www.cnblogs.com/haoxinyue/p/redis.html 为什么集群? 通常, ...
- Redis总结(八)如何搭建高可用的Redis集群
以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html ...
- 就publish/subscribe功能看redis集群模式下的队列技术(一)
Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...
- 峰Redis学习(9)Redis 集群(概述)
第一节:Redis 集群概述 redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其他所有节点 ...
- 详细介绍redis的集群功能,带你了解真正意义上的分布式
Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset). ...
- 一种简单实现Redis集群Pipeline功能的方法及性能测试
上一篇文章<redis pipeline批量处理提高性能>中我们讲到redis pipeline模式在批量数据处理上带来了很大的性能提升,我们先来回顾一下pipeline的原理,redis ...
- Redis集群概述
Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代,目前,Redis已经发布了3.0.7版本. redis cluster是去中心化,去中间件的,也就是 ...
随机推荐
- Jenkins: 基础篇(环境配置)
自动化领域比较有影响力的开源框架jenkins,确实比较强大,易用.很多公司将其用来做持续即成CI(continuous integration).为了拓展和强化自己的软件设计生态系统,也将很久前使用 ...
- c#(winform)中ComboBox添加Key/Value项、获取选中项、根据Key
WinForm下的ComboBox默认是以多行文本来设定显示列表的, 这通常不符合大家日常的应用, 因为大家日常应用通常是键/值对的形式去绑定它的. 参考了一些网上的例子,最终写了一个辅助类用于方便对 ...
- 关于今天mysql数据库的一系列问题
首先,字符集的问题: mysql> show variables like 'character%';+--------------------------+------------------ ...
- MySQL指定mysqld启动时所加载的配置文件
mysqld.exe --init-file=file_name 以下为配置文件参数优化和中文详解: [client]port = 3306socket = /tmp/mysql.sock [mysq ...
- 转:Java学习路线图,专为新手定制的Java学习计划建议
转自:http://blog.csdn.net/jinxfei/article/details/5545874 怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业 ...
- Hibernate与MyBatis区别
Hibernate是当前主流的ORM框架,对数据库结构提供了较为完整的封装. MyBatis同样也是非常流行的ORM框架,主要在于pojo与SQL之间的映射关系. 区别: 1.两者最大的区别 针对简单 ...
- file_get_content和curl的性能比较
今天在获取微信一张二维码图片时发现使用php中的file_get_content方式和curl方式竟然相差了50倍左右,直接晕倒!!!
- 并发编程之二:wait、notify、notifyAll的使用方法
wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. public final native void wait(long timeout ...
- CSS如何实现数字分页效果
代码实例如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- Yii 框架中带有区间的搜索