Redis入门第十二讲——搭建Redis集群

前言

为什么需要Redis啊?

一般来说,如果我们是做一个互联网项目,那么通常都需要在工程中添加缓存,之所以这样做,是因为在互联网项目中查询功能是非常频繁的,如果每次查询都调用数据库的话,会给数据库造成很大的压力,因此需要在用户和数据库之间加一层缓存,对于同样的查询,只查询一遍数据库,然后把数据保存到缓存当中,当其他用户再访问同样的页面时便可以直接从缓存中去读取数据,这样查询效率将会提升非常多,同时也会大大减轻数据库的压力。

后面我花了大量时间做了一个项目,即淘淘商城项目,并且我都把自己的所思所想所做详细记录了下来,这儿是传送门:一个淘淘商城项目送给你,愿你有一个灿烂的前程!为什么我会说到这个项目呢?因为淘淘商城这个项目就用到了Redis来作为缓存。对淘淘商城这个项目来说,首页是系统的门户,也就是系统的入口,所以首页的访问量是这个系统最大的。如果每次展示首页都从数据库中查询首页的内容信息,那么势必会对数据库造成很大的压力,所以就需要使用缓存来减轻数据库的压力了。实现缓存的工具有很多,现在比较流行的是Redis,而我们在淘淘商城项目中也是用的Redis。

强烈建议你有时间的话,可以尝试着写一写这个项目,可能在一过程中,你会学到很多东西吧!

如何在Linux服务器上搭建单机版Redis呢?

如何在Linux服务器上搭建单机版Redis,不用我讲了吧!要是你真的不会,那么可以参考我的《Redis入门第二讲——Redis的安装和简单使用》这篇文章进行学习。

温馨提示:新版的Redis可能不够稳定,所以建议大家还是使用旧版本的Redis,比如3.2.3版本,这里我使用的就是redis-3.2.3.tar.gz这个版本。

Redis集群的搭建

本文我将会带领大家如何搭建一个Redis集群。

为什么需要搭建Redis集群啊?

为什么需要搭建Redis集群呢?Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的HBase或者是MongoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,而这就需要用到集群了。

redis-cluster架构图

我们来看一下redis-cluster架构图,如下图所示。
这里写图片描述
可以看到Redis集群是没有统一入口的,客户端连集群中的哪台设备都行,集群中各个设备(节点)之间都会定时进行交互,以便知道节点是否还正常工作。

我按照我个人的理解说一下集群架构中的一些细节:

(1)上图中的蓝圈表示的都是节点,每个节点和节点之间使用PING-PONG机制来相互通信,内部使用二进制协议优化传输速度和带宽。

(2)在整个集群内部,没有一个代理层,也就是说集群中没有哪个节点是入口。也就是说客户端要连集群的话,连集群中的哪个节点都行,只要连上了其中一个,那么这时你就可以通过这个节点访问集群中任意一个节点了。

(3)我们现在集群中有这么多节点,节点上面存储的数据都是一样的吗?如果存储的数据要是一样的话,那么这个集群其实意义并不太大,顶多也就算是一个备份。Redis的所有数据都是保存在内存中的,内存能放的东西其实并不太多,如果数据量很大的话,那么这时候一台服务器就会存不下,你就算加多少台备份机也不能解决该问题。

而你要想解决这个存储容量的问题,那么就得需要保证每个节点上面存放的数据不一样。如果其中一个节点挂掉了呢?这时,整个集群中的这些节点数据便不完整了。如果有其中任意一个节点挂掉了,那么集群就挂掉了,你要想让它不挂掉,每一个节点就应该有一个备份机,即主节点挂掉了,备份机就立马顶上来。

那么如何判断一个节点挂掉了呢?节点挂掉了是通过集群中超过半数的节点投票(投票机制)决定的,如果超过半数的节点认为这个节点它挂掉了,那么它就挂掉了,没挂也挂。 说得更细致一点,Redis集群是有容错投票机制的,如下图所示。
这里写图片描述
浅黄色的那个节点向红色的那个节点发出ping命令,红色节点没有回应,这时浅黄色节点便认为这个红色节点可能挂掉了,它会投上一票,不过这时还只是疑问,所以浅黄色节点画了一个?。然后浅黄色节点告诉别的节点说这个红色的节点可能挂掉了,第二个节点去尝试和这个红色节点联系,发现也ping不同,于是第二个节点也认为这个红色节点挂掉了,第二个节点也投上一票,接着第三个节点去和红色节点联系,也联系不上,于是也投上一票,这样便有三票了。Redis的容错投票机制是集群中过半数的节点认为某个节点挂掉了,那么就认定这个节点挂掉了。 这时要看这个红色节点还有没有备用节点,若没有备用节点,则整个集群将停止对外提供服务;若有备份节点,则会将备份节点扶正,继续对外提供服务。

(4)我们要把数据分散存储到不同的节点,这时我们如何确定我的这个数据存储到哪个节点上了呢?这个时候Redis集群便引入了另外一个概念,即slot(哈希槽) 这个概念,槽的数量是固定的,一共16384个槽。我们先把这个槽分配到不同的节点上,这样每个节点都将会被分配一定数量的槽,反正加起来一共16384个槽。当我们要往集群里面存储某个key的时候,先计算一下这个key它应该在哪个槽上,计算完了之后,我们就能找到这个槽相对应的服务器(这个槽具体被分配到了哪个服务器上,我们是知道的),然后再把该key存到对应的服务器上。

Redis集群内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时(即操作set命令时),Redis会先对key使用crc16算法算出一个结果,然后把该结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,Redis会根据节点数量大致均等的将哈希映射到不同的节点。

我们以下图为例,我们把这16384个哈希槽分配到了三个Server上,假设Server1上卡槽是0-5460,Server2上卡槽是5461-10922,Server3上卡槽是10923-16383。现在我们要保存字符串"Hello""Hello"经过crc16算法再对16384求余后假定是500,很显然这时它应该存到Server1上;假设要存储的字符串"Hello2"经过crc16算法再对16384求余后是11500,那么很显然这时它应该存到Server3上;同理,"Hello3""Hello1"被分别存到了Server2和Server1上。可以发现每个Server其实存储的内容都是不一样的,这也就是说某个节点挂掉后如果没有备用节点的话,那么整个集群都会挂掉,原因是数据不全了啊!另外,关于每个服务器上卡槽的分布数量可以根据服务器的性能来定,性能好的可以多分配些卡槽,这样在它上面存储的内容也就多了。
在这里插入图片描述

一步一步教你搭建Redis集群

下面我们来搭建Redis集群,由于集群的容错机制是超过半数的节点认为某个节点挂掉就确认挂掉,因此我们搭建的集群最好是奇数台(>=3)。又由于为了高可用性,每个节点还得需要有个备份节点,因此我们搭建一个Redis集群至少要有6台虚拟机。考虑到我们的本机有可能确实跑不了6台虚拟机,但我们还想搭建Redis集群,那该怎么办呢?其实很简单,只能搭建伪分布式集群了,可想而知这并不是真正的集群。具体做法是可以使用一台虚拟机运行6个Redis实例,每个Redis实例需要运行在不同的端口,这里我假设为7001-7006这6个端口。

在一台虚拟机上创建6个Redis实例

前提是你得知道如何在一台虚拟机上创建一个Redis实例,我相信大家应该都知道这点了,要是你还不知道,我只能说:小老弟,你还得继续努力了😁

首先我们在/usr/local目录下创建一个redis-cluster目录,如下图所示。
在这里插入图片描述
然后我们将redis/bin目录复制到redis-cluster/redis01目录下,若redis-cluster目录下没有redis01这个目录,则会创建该目录。这时我们可以进入到redis-cluster/redis01目录中,并使用ll命令查看一下该目录,如下图所示。
在这里插入图片描述
可以发现Redis实例里面有一些持久化文件,记住我们一定要把这些持久化文件删掉,否则,这个节点中有数据的话,集群是搭不起来的。
在这里插入图片描述
接着我们通过redis.conf配置文件来修改redis01实例的运行端口号,将其端口号置为7001,还要记得将该配置文件中的cluster-enabled设置为yes哟!
在这里插入图片描述
redis01实例的配置文件修改并保存之后,我们只须在redis-cluster目录下复制5个这样的Redis实例就可以了,如下图所示。
在这里插入图片描述
虽然现在我们有6个Redis实例了,但是一定记得要把每个Redis实例运行在不同的端口上。redis01这个实例的端口号已经被改为7001了,接下来就是修改其他5个Redis实例的运行端口号了。具体做法是将redis02实例的端口号置为7002,redis03实例的端口号置为7003,redis04实例的端口号置为7004,redis05实例的端口号置为7005,redis06实例的端口号置为7006。

启动每个Redis实例

我们在一台虚拟机上创建好6个Redis实例之后,就需要把每个Redis实例启动起来了。如果想启动每个Redis实例的话,不必每个实例一个个启动,这样太麻烦了,我们可以写个批处理程序来把它们一下子都启动起来。

在redis-cluster目录下使用vim redis-cluster-start-all.sh命令来创建一个批处理文件,文件内容为:

cd /usr/local/redis-cluster/redis01
./redis-server redis.conf

cd /usr/local/redis-cluster/redis02
./redis-server redis.conf

cd /usr/local/redis-cluster/redis03
./redis-server redis.conf

cd /usr/local/redis-cluster/redis04
./redis-server redis.conf

cd /usr/local/redis-cluster/redis05
./redis-server redis.conf

cd /usr/local/redis-cluster/redis06
./redis-server redis.conf

保存完该文件之后,使用ll命令查看一下redis-cluster目录,可以发现有这样一个文件了,如下图所示。
在这里插入图片描述
但是这个批处理程序是不能运行的,所以还得使用chmod u+x redis-cluster-start-all.sh命令改一下它的权限,让其可执行,这样我们就可以使用./redis-cluster-start-all.sh命令来启动每个Redis实例了。
在这里插入图片描述
如何知道每个Redis实例都启动起来了呢?可使用ps -ef | grep redis命令来查看每一个Redis实例的启动进程,如下图所示。
在这里插入图片描述
万一如果我们想要关闭每个Redis实例,那么该怎么办呢?肯定不会每个实例一个个关闭,因为这样做太麻烦了,为了让这些Redis实例一下子都关闭掉,我们同样也可以写个批处理程序,即创建一个关闭集群的脚本。

在redis-cluster目录下使用vim redis-cluster-stop-all.sh命令来创建一个批处理文件,文件内容为:

cd /usr/local/redis-cluster/redis01
./redis-cli -p 7001 shutdown

cd /usr/local/redis-cluster/redis02
./redis-cli -p 7002 shutdown

cd /usr/local/redis-cluster/redis03
./redis-cli -p 7003 shutdown

cd /usr/local/redis-cluster/redis04
./redis-cli -p 7004 shutdown

cd /usr/local/redis-cluster/redis05
./redis-cli -p 7005 shutdown

cd /usr/local/redis-cluster/redis06
./redis-cli -p 7006 shutdown

存完该文件之后,使用ll命令查看一下redis-cluster目录,可以发现有这样一个文件了,如下图所示。
在这里插入图片描述
这个批处理程序同样是不能运行的,所以还得使用chmod u+x redis-cluster-stop-all.sh命令改一下它的权限,让其可执行,这样我们就可以使用./redis-cluster-stop-all.sh命令来关闭每个Redis实例了。
在这里插入图片描述

安装ruby环境

我们是使用ruby脚本来搭建集群的,所以还需要安装ruby的运行环境。具体做法是在联网的情况下输入yum install ruby命令来安装ruby的运行环境,如下图所示。
在这里插入图片描述
安装完ruby之后,我们还需要安装rubygems(也就是ruby第三方包管理工具),使用命令yum install rubygems,如下图所示。
在这里插入图片描述
安装完ruby和rubygems之后,我们还需要安装ruby脚本运行所需要的一个包,即redis-3.3.5.gem。你不禁就要问了,怎么才能获取到该包呢?当然了,你可以从网上查找继而下载下来,但是你要是实在是懒,那么可以从我给出的百度网盘链接地址中进行下载。你看我对你好不好啊😂

链接:https://pan.baidu.com/s/1fI0uUtfRbPrpMGJ2GbFx-w,提取码:wfus

大家下载完之后要上传到虚拟机上,怎样知道我们真的上传上去了呢?在当前用户主目录(即root)下使用ll命令查看一下该目录即可。
在这里插入图片描述
下面来安装这个第三方包,输入gem install redis-3.3.5.gem命令然后回车,如下图所示。
在这里插入图片描述

使用ruby脚本搭建集群

上面做了那么多准备其实是为一个脚本文件(redis-trib.rb)服务的,这个脚本文件的位置在/root/redis-3.2.3/src目录下,如下图所示。
在这里插入图片描述
为方便管理,我们把这个脚本文件复制到/usr/local/redis-cluster目录下,然后进入到该目录中,使用ll命令查看一下该目录中是否有redis-trib.rb这个脚本文件,如下图所示。
在这里插入图片描述
下面正式开始搭建集群,我们使用如下命令来搭建集群。

./redis-trib.rb create --replicas 1 192.168.81.129:7001 192.168.81.129:7002 192.168.81.129:7003 192.168.81.129:7004 192.168.81.129:7005 192.168.81.129:7006

命令中的--replicas是指定每个节点备份的节点的数量,我们现在是每个节点备份一个,因此输入1。
在这里插入图片描述
从上图中可以看到从主节点是随机组成的,主节点是192.168.81.129:7001、192.168.81.129:7002以及192.168.81.129:7003这三台设备,192.168.81.129:7004、192.168.81.129:7005以及192.168.81.129:7006这三台是备用节点。槽号为0-5460的卡槽被分配到了192.168.81.129:7001上,5461-10922被分配到了192.168.81.129:7002上,10923-16383被分配到了192.168.81.129:7003上。

Adding replica 192.168.81.129:7004 to 192.168.81.129:7001的意思是192.168.81.129:7004作为192.168.81.129:7001的从节点,同理,192.168.81.129:7005作为了192.168.81.129:7002的从节点,192.168.81.129:7006作为了192.168.81.129:7003的从节点。这样我们的集群便搭建完了。

测试一下集群

既然集群已经启动好了,我们便使用redis客户端随意连接一台设备进行测试一下,比如我们连接192.168.81.129:7006这台设备(这是个从节点,从属于192.168.81.129:7003),如下图所示。注意:一定要加上参数-c否则没办法重定向到其它节点
在这里插入图片描述
连接上之后,我们先来保存key1,它的值是123,如下图所示,可以看到这个key1经过crc16算法并对16384进行求余之后的数字是9189,这个槽号是在192.168.81.129:7002上,因此key1便被保存到了192.168.81.129:7002上。
在这里插入图片描述
我们再接着保存key2,它的值是abc,如下图所示,可以看到key2所对应的槽号是4998,显然是在192.168.81.129:7001上。
在这里插入图片描述
最后,我们可以使用get命令取得key1、key2的值,如下图所示。
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值