(7)Redis-Cluster集群理论及实践【上】
前言
redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。
redis在年初发布了3.0.0,官方支持了redis cluster,也就是集群。至此结束了redis 没有官方集群的时代,之前我们用redis cluster用的最多的应该是twitter 发布的Twemproxy(https://github.com/twitter/twemproxy)
还有就是豌豆荚开发的codis (https://github.com/wandoulabs/codis)
这2个我会在后续去使用它们。下面的文字,我尽量用通熟易懂的方式来阐述。
1、Redis-cluster 理论
1.1 Redis-Cluster设计要点
Redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
那么redis 是如何合理分配这些节点和数据的呢?
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
注意的是:必须要3个以后的主节点,否则在创建集群时会失败,我们在后续会实践到。
所以,我们假设现在有3个节点已经组成了集群,分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
如下图所示:
那么,现在我想设置一个key ,比如叫my_name:
set my_name yangyi
按照redis cluster的哈希槽算法:CRC16('my_name')%16384 = 2412。 那么就会把这个key 的存储分配到 A 上了。
同样,当我连接(A,B,C)任何一个节点想获取my_name这个key时,也会这样的算法,然后内部跳转到B节点上获取数据。
这种哈希槽的分配方式有好也有坏,好处就是很清晰,比如我想新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大致就会变成这样:
- 节点A覆盖1365-5460
- 节点B覆盖6827-10922
- 节点C覆盖12288-16383
- 节点D覆盖0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
所以redis cluster 就是这样的一个形状:
1.2 Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
流程下图所示:
2、Redis-cluster 集群实践
网上有很多教程,我最先是按照这个教程(http://blog.51yip.com/nosql/1725.html) 一步步的按照这个教程来,可是在最后启动集群的时候第一台机器的6379端口死活启动不了,这样就没有3台主服务器,就完成不了集群。最后也没找到解决办法。
[原因:#./redis-trib.rb create --replicas 1的 这个1没有写!!!!]
现在,还是按照官方的教程,全程再演示一次,官方教程是在一台机器上启动6个节点,3个当主节点,3个当从节点(http://redis.io/topics/cluster-tutorial):
先下载官方的redis 版本(3.0.5) : http://download.redis.io/releases/redis-3.0.5.tar.gz
下载不了,请自行翻墙。
如果之前已经下载了redis的 2.x版本,只需要将 /usr/local/bin/redis-* 这几个命令先删除即可。
下边这一节,我们复习一下Redis的常规安装。
2.1 在Linux环境下安装Redis
Redis是C语言开发,建议在linux上运行,本教程使用Centos7.2作为安装环境。
安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++
版本说明
可以看个人习惯使用最新版的Redis。
3.0版本增加了redis集群功能。
源码下载
从官网下载
http://download.redis.io/releases/redis-3.0.0.tar.gz
将redis-3.0.0.tar.gz拷贝到/usr/local下
解压源码
tar -zxvf redis-3.0.0.tar.gz
进入解压后的目录进行编译
cd /usr/local/redis-3.0.0
make
安装到指定目录,如 /usr/local/redis
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
redis.conf
redis.conf是redis的配置文件,redis.conf在redis源码目录。
注意修改port作为redis进程的端口,port默认6379。
拷贝配置文件到安装目录下
进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
安装好Redis之后,我们开始继续我们的集群搭建。
2.2 开始集群搭建
新建一个r目录redis-cluster,用来做集群环境搭建的起点吧,
[root@k8s-master local]# mkdir redis-cluster
注意:我们需要将redis环境的redis.conf这个配置文件做一下修改:
[root@k8s-master bin]# vi redis.conf
#修改以下地方
port 6381
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
daemonize yes
appendonly yes
新建6个节点:【用端口号做区分】
- [root@k8s-master redis-cluster]# mkdir -p /usr/local/cluster-test
- [root@k8s-master redis-cluster]# cd /usr/local/redis-cluster/
- [root@k8s-master redis-cluster]# mkdir redis-6381
- [root@k8s-master redis-cluster]# mkdir redis-6382
- [root@k8s-master redis-cluster]# mkdir redis-6383
- [root@k8s-master redis-cluster]# mkdir redis-6384
- [root@k8s-master redis-cluster]# mkdir redis-6385
- [root@k8s-master redis-cluster]# mkdir redis-6386
将Redis的bin目录分别拷贝到这6个文件夹中,并修改对应目录下redis.conf 的port成对应的端口号6381~6386
【注意:】这6个文件夹的bin目录下需要删除appendonly.aof、dump.rdb、nodes-6381.conf三个文件夹,保证各个节点是干净的。
分别启动这6个节点:
[root@k8s-master redis-cluster]# cd /usr/local/cluster-test/redis-6381/bin
[root@k8s-master bin]# ./redis-server redis.conf
[root@k8s-master bin]# cd ../../redis-6382/bin
[root@k8s-master bin]# ./redis-server redis.conf
.....
[root@k8s-master bin]# cd ../redis-6386/bin
[root@k8s-master bin]# ./redis-server redis.conf
一个一个启动节点有点麻烦,写个start-all.sh脚本一步启动:
cd redis-6381/bin
./redis-server redis.conf
cd ..
cd ..cd redis-6382/bin
./redis-server redis.conf
cd ..
cd ..cd redis-6383/bin
./redis-server redis.conf
cd ..
cd ..cd redis-6384/bin
./redis-server redis.conf
cd ..
cd ..cd redis-6385/bin
./redis-server redis.conf
cd ..
cd ..cd redis-6386/bin
./redis-server redis.conf
有节点启动脚本,停用节点的时候也不能一个一个手动停止,所以肯定也需要节点写一个停用脚本stop-all.sh:
./redis-6381/bin/redis-cli -h 192.168.72.134 -p 6381 shutdown./redis-6382/bin/redis-cli -h 192.168.72.134 -p 6382 shutdown./redis-6383/bin/redis-cli -h 192.168.72.134 -p 6383 shutdown./redis-6384/bin/redis-cli -h 192.168.72.134 -p 6384 shutdown./redis-6385/bin/redis-cli -h 192.168.72.134 -p 6385 shutdown./redis-6386/bin/redis-cli -h 192.168.72.134 -p 6386 shutdown
查看6381~6386这6个节点的启动进程情况:【这里能看到6387和6388两个节点,是因为后边做节点调试时,后添加的,可暂时忽略】
注意看每个节点屁股后边的[cluster],说明该节点已经开放式加入集群中了,但是这个时候集群的节点之间不能相互进行交流,因此还不能称之为集群,只能称为“伪集群”,或“聋哑集群”。
要想盘活这个集群的6个节点,我们还需要用到的命令就是redis-trib.rb,这是官方的一个用ruby写的一个操作redis cluster的命令,所以,你的机器上需要安装ruby。我们先试一下这个命令:
[root@k8s-master redis-cluster]#./redis-trib.rb create --replicas 1 192.168.72.134:6381 192.168.72.134:6382 192.168.72.134:6383 192.168.72.134:6384 192.168.72.134:6385 192.168.72.134:6386 |
因为我们要新建集群, 所以这里使用create命令. --replicas 1 参数表示为每个主节点创建一个从节点. 其他参数是实例的地址集合。
如果你的节点环境中没有安装ruby,报错:
/usr/bin/env: ruby: No such file or directory
那需要安装ruby和rubygems:
[root@k8s-master /]#yum install ruby[root@k8s-master /]#yum install rubygem[root@k8s-master /]#gem install redis
OK,创建集群:
执行集群创建命令:
[root@k8s-master redis-cluster]#./redis-trib.rb create --replicas 1 192.168.72.134:6381 192.168.72.134:6382 192.168.72.134:6383 192.168.72.134:6384 192.168.72.134:6385 192.168.72.134:6386
【
请不要反复执行命令 “./redis-trib.rb create --replicas 1 192.168.72.134:6381 192.168.72.134:6382 192.168.72.134:6383 192.168.72.134:6384 192.168.72.134:6385 192.168.72.134:6386”,反复创建将报错。可以各个节点bin目录下的这几个文件删除,将节点数据擦干净后,重新创建集群即可。
】
打印一下集群创建过程信息:
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.72.134:6381
192.168.72.134:6382
192.168.72.134:6383
Adding replica 192.168.72.134:6384 to 192.168.72.134:6381
Adding replica 192.168.72.134:6385 to 192.168.72.134:6382
Adding replica 192.168.72.134:6386 to 192.168.72.134:6383
M: 9c150bad671c01c448c46f04e87fc2f113bde4fb 192.168.72.134:6381slots:0-5460 (5461 slots) master
M: fe1eb03a73cc4da7d81f6f8c98a0507361fda52f 192.168.72.134:6382slots:5461-10922 (5462 slots) master
M: 2a3b4c018fbf54ff5b3f1eb06f254851808541da 192.168.72.134:6383slots:10923-16383 (5461 slots) master
S: a48b6c9b0e61e3d5d5febcc3b2bfe2513346c104 192.168.72.134:6384replicates 9c150bad671c01c448c46f04e87fc2f113bde4fb
S: 176f72b1b9fc3207d9da575711d6d90882680856 192.168.72.134:6385replicates fe1eb03a73cc4da7d81f6f8c98a0507361fda52f
S: 7da08d4152d959e1011eac2a4d9fa50ceac1aab0 192.168.72.134:6386replicates 2a3b4c018fbf54ff5b3f1eb06f254851808541da
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 192.168.72.134:6381)
M: 9c150bad671c01c448c46f04e87fc2f113bde4fb 192.168.72.134:6381slots:0-5460 (5461 slots) master
M: fe1eb03a73cc4da7d81f6f8c98a0507361fda52f 192.168.72.134:6382slots:5461-10922 (5462 slots) master
M: 2a3b4c018fbf54ff5b3f1eb06f254851808541da 192.168.72.134:6383slots:10923-16383 (5461 slots) master
M: a48b6c9b0e61e3d5d5febcc3b2bfe2513346c104 192.168.72.134:6384slots: (0 slots) masterreplicates 9c150bad671c01c448c46f04e87fc2f113bde4fb
M: 176f72b1b9fc3207d9da575711d6d90882680856 192.168.72.134:6385slots: (0 slots) masterreplicates fe1eb03a73cc4da7d81f6f8c98a0507361fda52f
M: 7da08d4152d959e1011eac2a4d9fa50ceac1aab0 192.168.72.134:6386slots: (0 slots) masterreplicates 2a3b4c018fbf54ff5b3f1eb06f254851808541da
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试集群状态:
命令:[root@k8s-master redis-cluster]#./redis-trib.rb check 192.168.72.134:6381
【主要看节点6381~6386等6个点,至于为什么6381节点是从节点,而6384节点是主节点。还有6387和6388这两个点是后边测试主从节点增删时,怼上去的,至于为什么会出现这样的变化,下节见分晓。】
可以看到有3个主节点【开头标识:“M”】,3个从节点【开头标识:“S”】。每个节点都是成功的连接状态。
3个主节点[M]是:
192.168.72.134:6382、
192.168.72.134:6383、
192.168.72.134:6384
3个从节点[S]是:
192.168.72.134:6381、
192.168.72.134:6385、
192.168.72.134:6386
另,关于主、从节点:
哈希槽的分配都是在主节点master上进行的,主节点负责恩数据的存储和读取,因此,我们可以看到“M”节点对应的slots均有数值的,这个实际上就创建集群是脚本自动为我们分配好的哈希槽
从节点上的哈希槽均为0。从节点负责从主节点上同步数据,当集群中主节点挂了之后,从节点将被推举替换该master节点,成为一个新的master主节点。
----每个master主节点和slave从节点具有一个由“一长串字母数字”混合组成的id,这个id也是master节点和slave节点相互识别的依据。
----master节点信息有个1 additional replica(s),说明该主节点已经有1个或者多个从节点;
----slave节点信息有个replicates + id的标识,表名该节点能够找到的id为xxxxxxx的master主节点;
到这里,我们的集群基本上初步搭建完成。
下一节,我们将从测试角度,试验一下所搭建的这个集群关于主从节点新增、删除,数据分片、故障转移等内容。
(7)Redis-Cluster集群理论及实践【上】相关推荐
- Redis Cluster集群的搭建与实践[转]
Redis Cluster集群的搭建与实践 Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后 ...
- Redis Cluster集群的搭建与实践
Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...
- Redis Cluster集群知识学习总结
Redis集群解决方案有两个: 1) Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...
- redis cluster 集群 HA 原理和实操(史上最全、面试必备)
文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...
- Redis——cluster集群原理
摘要 在 redis3.0之前,redis使用的哨兵架构,它借助 sentinel 工具来监控 master 节点的状态:如果 master 节点异常,则会做主从切换,将一台 slave 作为 mas ...
- redis映射的概念_搭建分布式Redis Cluster集群与Redis入门
目录 Redis 集群搭建Redis 是啥集群(Cluster)Redis Cluster 说明Redis Cluster 节点Redis Cluster 集群模式不能保证一致性创建和使用 Redis ...
- Redis cluster集群原理与配置
Redis cluster集群原理与配置 一.cluster集群原理 1.数据迁移 过程 2.复制以及故障转移 故障检测 故障转移 二.配置cluster集群 1.创建文件夹 2.编辑 7001.co ...
- redis cluster集群选主
redis 选主过程分析 当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master.由于挂掉的master可能会有多个slave.Failover的 ...
- Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...
- centos7 docker-compose安装_Docker Compose 搭建 Redis Cluster 集群环境
在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...
最新文章
- 如何在Matlab中获取函数参数的数目?
- photoshop基础教程视频-贺叶铭-传智播客-笔记
- 常用的一些注入命令,方便一下大家哦
- 北斗导航 | 基于卡尔曼滤波的IMU+GNSS的组合导航(附Matlab源代码)
- amd sata controller下载_AMD发布全新锐龙芯片组驱动:告别卡死、报错
- logback 配置详解
- 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤
- C程序设计语言现代方法18:声明
- 华为发布近2万元折叠屏手机Mate Xs;iPhone 12或支持WiFi新标;Electron 6.1.8发布 | 极客头条...
- 同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案...
- 为什么谐振时电抗为0_108kVA/108kV/27kV变频串联谐振试验装置
- 分享两款免费的流程图、原型图工具
- 音频文件压缩大小如何操作?分享一个音频压缩的小技巧
- 用C语言写一个数字版的3阶魔方
- python爬取微博评论_python爬虫抓取新浪微博数据
- 从此爱情与我无关,只做一个嗜钱如命的渣男!
- 接口偶尔超时,竟又是JVM停顿的锅!
- python输入一组数字求平均值和标准差_如何计算PySpark DataFrame的平均值和标准差?...
- 第30届深圳礼品展暨1688工厂直采季开幕,携手创增长
- 自己动手,修改 Firefox3 的快捷键