前言
前面两节我们介绍了Redis的主从和哨兵,对Redis的一般高可用性搭建有了一定的了解和认识,上节我也说过,要适应大型互联网项目,最好的方案还是使用Redis的集群,那么今天我们就来介绍下Redis的集群到底是怎么玩的。
什么是Redis集群?
讲集群之前我们要了解一点,Redis是从3.0开始才支持集群的,在3.0版本之前我们只能使用哨兵来保证高可用的Redis服务,3.0版本之后集群不仅保证了高可用,还能支持容错功能。下面我们先介绍Redis集群的几个概念:
节点:Redis集群中一个个独立的Redis服务器,他们之间独立部署通过集群产生关联,节点又分为主节点和从节点,每个从节点与自己的主节点关联,多个主节点之间又相互关联组成集群;
槽(slot):Redis集群通过分片的方式来保存缓存数据库中的键值对,集群的整个数据库被分为16384个槽,每个key对应其中的一个槽,集群中的每个节点可以处理0个或者最多16384个槽;
集群状态:当每个槽都被分配完毕,集群就处于上线状态,否则就处于下线状态;
重新分片:当集群中新增主节点时,集群就会进行重新分片,将槽重新划分,并且槽所对应的数据也一起划分,该操作可以在线进行,集群不需要下线,而且在这个过程中,每个节点还能继续处理客户端的请求;
集群大致分布图如下:
集群处理key流程如下:
集群计算key属于哪个槽的计算方式
CRC16(key) &16383:
CRC16(key)表示计算key的CRC-16校验和;
&16383表示计算出一个介于0到16383之间的整数,作为key的槽号;
如何搭建Redis集群?
环境准备:3主3从(Redis集群要求最低3台主服务器,主要是为了故障转移时投票选举,Redis集群判断一个主机下线是需要通过主节点选举结果来实现的,超过半数以上认为某主机下线,才能真正下线)
第一步:如果你是在一台机器上部署,那么就需要建立多个实例出来,生产中一般是一台机器一个redis;
第二步:配置每个redis的配置文件redis.conf,每个节点相应节点替换掉即可(持久化,端口配置我就不列出来了,需要注意的一点就是集群模式下不能配置从节点slaveof,因为redis的集群主从关系是创建集群时指定的);
配置节点数据信息存储位置:
启动集群模式:
配置节点文件的名称:
配置节点之间通信的超时时间,超过这个时间就认为节点处于fail状态:
第三步:安装Ruby,因为创建Redis集群需要ruby命令来操作(这里不要问我为什么,因为我也不知道,可能是因为Redis作者对c和ruby比较熟吧);
安装ruby这里需要注意的一点就是Ruby的版本号,我开始不知道这一点,安装了一个2.0版本的ruby,结果搭建集群时提示我需要2.2.2以上的版本,下面是我安装的步骤;
OK,Ruby就安装完成了,接下来还需要安装redis和ruby的接口:
第四步:创建集群,有了上面的基础我们就可以开始我们的集群了,先把6个节点全部启动起来;我们会发现开启集群模式的节点启动后跟非集群模式下启动有点不同的是,每个节点都自己主动开启了一个进程1637*,其实这就是我们上节所说的哨兵,也就是说集群中,redis会自己为每个节点开启一个哨兵对节点进行监测:
节点全部启动成功,那么我们就来开始创建集群,刚刚在上面配置文件时我提到了,不允许配置主从关系,就是因为这里,我们会通过ruby命令进行创建:
至此Redis集群就搭建完成了,我们登录上客户端,来操作一把试试:
我们也可以在客户端查看集群的状态:
CLUSTER INFO
以及查看集群中节点的状态:
CLUSTER NODES
注意:
细心的小伙伴会发现我上面怎么出现一个
[ERR] Sorry, can't connect to node 127.0.0.1:6379
其实这是我开始搭建时出现的问题,其实搭建这个我也不是一次就成功了,有些地方没注意所导致的,下面我来讲讲可能会出现的问题:
密码问题,如果使用redis-trib.rb的方式来创建集群的话,最好一开始你的节点别设置密码,可以等集群起来之后再去设置密码;
如果你的集群节点都设置了密码(每个节点密码得相同,masterauth和requirepass),那就一定要注意在redis-trib.rb文件中添加密码,告知集群在创建时需要密码验证
集群启动成功之后,我们要操作时启动客户端时,一定需要使用集群模式打开客户端(-c模式),否则你的客户端是无法跟其他节点认证通过的,会出现下面的错误:
故障转移
我们在本文开篇就说了,Redis集群能做到容错和故障转移,现在我们来将其中一个Master宕机,看看会发生什么:
我将6379这台主机停掉,我们看看他所对应的从6376发生什么?
我们在从客户端查看下集群的节点信息:
当6379恢复启动时,会怎样呢?从前面我们学习的哨兵知识知道,6379将以6376的从节点的身份加入集群中,我们来验证下:
6376的日志
6379的日志
再看客户端集群的节点信息:6379成功加入集群,角色是从节点
上述我们在创建Redis时,提到分片,是Redis自动分配的,如果你对分配的结果不满意,其实还可以进行重新分片,主要也是依赖redis-trib来完成的,感兴趣的小伙伴可以自己查阅资料补充这块,或者后面讲底层实现时我们再来看。
OK,以上就是我们今天所讲的Redis集群,基本上Redis我们也就先讲到这里了,至于底层的实现原理和一些细节,暂时就先不一一概括了,后面有时间我们再讲,今天先到这里,感谢阅读!!!
领取专属 10元无门槛券
私享最新 技术干货