前言

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个节点:【用端口号做区分】

  1. [root@k8s-master redis-cluster]# mkdir -p /usr/local/cluster-test
  2. [root@k8s-master redis-cluster]# cd  /usr/local/redis-cluster/
  3. [root@k8s-master redis-cluster]# mkdir redis-6381
  4. [root@k8s-master redis-cluster]# mkdir redis-6382
  5. [root@k8s-master redis-cluster]# mkdir redis-6383
  6. [root@k8s-master redis-cluster]# mkdir redis-6384
  7. [root@k8s-master redis-cluster]# mkdir redis-6385
  8. [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集群理论及实践【上】相关推荐

  1. Redis Cluster集群的搭建与实践[转]

    Redis Cluster集群的搭建与实践 Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后 ...

  2. Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  3. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

  4. redis cluster 集群 HA 原理和实操(史上最全、面试必备)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

  5. Redis——cluster集群原理

    摘要 在 redis3.0之前,redis使用的哨兵架构,它借助 sentinel 工具来监控 master 节点的状态:如果 master 节点异常,则会做主从切换,将一台 slave 作为 mas ...

  6. redis映射的概念_搭建分布式Redis Cluster集群与Redis入门

    目录 Redis 集群搭建Redis 是啥集群(Cluster)Redis Cluster 说明Redis Cluster 节点Redis Cluster 集群模式不能保证一致性创建和使用 Redis ...

  7. Redis cluster集群原理与配置

    Redis cluster集群原理与配置 一.cluster集群原理 1.数据迁移 过程 2.复制以及故障转移 故障检测 故障转移 二.配置cluster集群 1.创建文件夹 2.编辑 7001.co ...

  8. redis cluster集群选主

    redis 选主过程分析  当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master.由于挂掉的master可能会有多个slave.Failover的 ...

  9. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)

    前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...

  10. centos7 docker-compose安装_Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

最新文章

  1. 如何在Matlab中获取函数参数的数目?
  2. photoshop基础教程视频-贺叶铭-传智播客-笔记
  3. 常用的一些注入命令,方便一下大家哦
  4. 北斗导航 | 基于卡尔曼滤波的IMU+GNSS的组合导航(附Matlab源代码)
  5. amd sata controller下载_AMD发布全新锐龙芯片组驱动:告别卡死、报错
  6. logback 配置详解
  7. 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤
  8. C程序设计语言现代方法18:声明
  9. 华为发布近2万元折叠屏手机Mate Xs;iPhone 12或支持WiFi新标;Electron 6.1.8发布 | 极客头条...
  10. 同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案...
  11. 为什么谐振时电抗为0_108kVA/108kV/27kV变频串联谐振试验装置
  12. 分享两款免费的流程图、原型图工具
  13. 音频文件压缩大小如何操作?分享一个音频压缩的小技巧
  14. 用C语言写一个数字版的3阶魔方
  15. python爬取微博评论_python爬虫抓取新浪微博数据
  16. 从此爱情与我无关,只做一个嗜钱如命的渣男!
  17. 接口偶尔超时,竟又是JVM停顿的锅!
  18. python输入一组数字求平均值和标准差_如何计算PySpark DataFrame的平均值和标准差?...
  19. 第30届深圳礼品展暨1688工厂直采季开幕,携手创增长
  20. 自己动手,修改 Firefox3 的快捷键

热门文章

  1. k8s搭建dashboard可视化界面
  2. java 反射 动态调动set_通过Java的反射动态调用类的set和get方法
  3. Spring boot 配置方法
  4. mysql关键字 distinct去重
  5. MyBatis源码阅读(八) --- Executor执行器
  6. 冒泡排序(C#)实现
  7. 深入理解Nacos源码注册中心之服务发现(订阅拉取)
  8. OpenCV-Python教程8-图像混合
  9. FreeDOS 24 周年,创始人分享常用 DOS 命令备忘表
  10. iOS,QRCord(矩阵二维码)