Redis集群
一、Redis集群原理
集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。
上一篇我们讲到了 Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。
集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。
一致性哈希有四个重要特征:
1、均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。
2、单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。
但一致性哈希不是我们今天要介绍的重点,因为 Redis 引入另一种哈希槽(hash slot)的概念。
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
二、Redis集群配置
因为我们要启动多个 redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是 redis 实例的端口号。

然后我们把以前编译过和修改过的 redis-server、redis.conf这两个文件分别拷贝到这三个目录里面,拷贝完之后就像这样子了:

打开 redis.conf 文件,为了简单起见,我们只保留下面几个配置项:
daemonize yes
port 9001
cluster-enabled yes 开启Cluster
cluster-config-file nodes.conf
cluster-node-timeout 15000 结点超时多久则认为它宕机了
appendonly yes
cluster-require-full-coverage no 默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
注意:port 要修改成对应目录的名字,也就是每个实例要有不同的端口。
配置说明请参见:http://blog.csdn.net/dc_726/article/details/48552531
下面我们分别启动这三个实例:
A:~ $ cd applications/dev/redis-cluster
A:redis-cluster$ cd 9001
A:9001 $ ./redis-server ./redis.conf
A:9003 $ cd ../9002
A:9002 $ ./redis-server ./redis.conf
A:9002 $ cd ../9003
A:9003 $ ./redis-server ./redis.conf
运行成功后,分别会在9001,9002及9003目录下生成如下文件

接下来我们来创建集群,让三个实例互相通讯:
A:src $ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003
>>> Creating cluster
Connecting to node 127.0.0.1:9001: OK
Connecting to node 127.0.0.1:9002: OK
Connecting to node 127.0.0.1:9003: OK
>>> Performing hash slots allocation on 3 nodes...
Using 3 masters:
127.0.0.1:9001
127.0.0.1:9002
127.0.0.1:9003
M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001
slots:0-5460 (5461 slots) master
M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002
slots:5461-10922 (5462 slots) master
M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003
slots:10923-16383 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:9001)
M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001
slots:0-5460 (5461 slots) master
M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002
slots:5461-10922 (5462 slots) master
M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003
slots:10923-16383 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
zhaoguihuadediannao:src zhaogh$
需要注意的是执行 redis-trib.rb 命令需要 ruby 的支持,如果你没有安装可以先安装。
ruby的依赖包如下:

gem install redis (运行此命令,安装redis-3.0.gem)
ruby及yaml文件的安装需要先解压,然后运行./configure、make、make install命令进行安装.
下面我们用 redis 自带的客户端测试一下:
A:src $ ./redis-cli -c -p 9001 注意-c不能丢
127.0.0.1:9001> get testkey001
-> Redirected to slot [12786] located at 127.0.0.1:9003
(nil)
127.0.0.1:9003> set testkey002 testvalue002
-> Redirected to slot [401] located at 127.0.0.1:9001
OK
127.0.0.1:9001> get testkey002
"testvalue002"
127.0.0.1:9001> set testkey003 testvalue003
OK
127.0.0.1:9001>
可以看到,虽然我们第一次连接的是9001端口,当我们去获取 testkey001 的时候,redis cluster 自动帮我们重定向到 9003 。
当我们在 9003 设置 testkey002 时,redis cluster 又重定向到 9001 。
其它执行脚本:ps -ef|grep redis|egrep -v grep|awk -F ' ' '{print $2}'|xargs kill -9 --直接kill掉已启动的redis进程;
清空redis缓存:
A:src $ ./redis-cli -c -p 9001 注意-c不能丢
127.0.0.1:9001>flushall
Redis集群的更多相关文章
- Redis集群案例与场景分析
1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...
- Java Spring mvc 操作 Redis 及 Redis 集群
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...
- Redis集群搭建与简单使用
介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...
- window下使用Redis Cluster部署Redis集群
日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...
- Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义
回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...
- [个人翻译]Redis 集群教程(中)
上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial 水 ...
- [个人翻译]Redis 集群教程(上)
官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢. 这是 ...
- Redis集群(九):Redis Sharding集群Redis节点主从切换后客户端自动重新连接
上文介绍了Redis Sharding集群的使用,点击阅读 本文介绍当某个Redis节点的Master节点发生问题,发生主从切换时,Jedis怎样自动重连新的Master节点 一.步骤如下: 1.配 ...
- Redis集群(八):Redis Sharding集群
一.Redis目前的集群方案主要有两种:Redis Sharding和Redis Cluster 1.Redis Sharding:3.0以前基本上使用分片实现集群,目前主流方案,客户端实现 2.Re ...
- Redis-Sentinel(Redis集群监控管理)
Redis的高可用方案的实现:主从切换以及虚拟IP或客户端 从Redis 2.8开始加入对Sentinel机制从而实现了服务器端的主从切换,但目前尚未发现实现虚拟IP或客户端切换方案 Redis-Se ...
随机推荐
- North America Qualifier (2015)
https://icpc.baylor.edu/regionals/finder/north-america-qualifier-2015 一个人打.... B 概率问题公式见代码 #include ...
- HDU 1029 Ignatius and the Princess IV DP
kuangbin 专题 这题,有很多种解法. 第一种: 直接比较每个数出现次数. #include<iostream> #include<string> #include< ...
- 了解常见的 Azure 灾难
以下内容涵盖多种不同类型的灾难情况.数据中心故障不是应用程序范围内发生故障的唯一原因.设计不良或管理错误也会导致中断.请在恢复计划的设计和测试阶段设想可能导致故障的原因,这样做很重要.一个好的计划可充 ...
- 题目1043:Day of Week(输入日期与当前日起天数差%7,在做相关星期调整)
题目描述: We now use the Gregorian style of dating in Russia. The leap years are years with number divis ...
- Docker系列(八)Kubernetes介绍
Kubernetes组件功能图 各组件说明: 节点 节点在Kubernetes由虚拟机或者实体机表示,常称为Minion,即从属主机.当一个节点加入到Kubernetes系统中时,它将会创建一个数 ...
- HDU-4681 String 枚举+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的su ...
- 挑战树莓派:谁才是Geek最爱的开发板?
树莓派(Raspberry Pi)是一块跟信用卡差不多大小的开发板,它的初衷是以低廉的硬件和开源软件扶持一些落后地区的电脑科学教育.由于它在性能和价格方面有一个很好的平衡点,所以很多硬件玩家也想买一个 ...
- 删除TreeView节点以及其子节点
//1.删除TreeView节点以及其子节点procedure TForm2.Button1Click(Sender: TObject);var TreeNode:TTreeNode;begin i ...
- Go: using a pointer to array
下面的不是指针指向数组,而是指针指向Slice I'm having a little play with google's Go language, and I've run into someth ...
- Runtime 10种用法
来源:haojingxue_iOS 链接:http://www.jianshu.com/p/3182646001d1 阅读了多篇运行时的文章,感觉都很不错,从几篇文章里面提取一些个人认为比较重要的,偏 ...