手把手教你搭Redis Cluster集群——Redis Cluster的搭建与原理解析


参考蚂蚁课堂

1.传统的哨兵集群存在哪些缺点?

传统的哨兵集群只有一个master节点,每个节点都保存了相同的数据,存在着大量的冗余,只能允许一个master主节点,属于中心化集群。

2.Redis Cluster集群

Redis Cluster是Redis官方推出的一种去中心化的集群方式,采用hash槽分片的方式将数据存放到多个不同的Redis中,从而可以去减少冗余的数据。

核心原理:对key进行crc16(Redis自带的)计算,然后对16384(Redis规定的)进行取模运算的得到一个值,假设有3个redis服务器,那么这个就可以分为0-5461,5462-10992,10992~16383,上面计算的结果值落在哪个范围就放在哪个集群里。如下图所示。

在这里插入图片描述

比如说上图我添加了一个key是name,然后我通过计算得到了一个值,因为是3个集群所以会被分成三个卡槽,每个卡槽范围分别是0-5461,5462-10992,10992~16383。因为算出来的值为666(我瞎猜的)所以会被分配到第一个卡槽当中。由于每一个卡槽都会有一个master节点所以达到了去中心化的目的,不同key根据计算出来的值被分配到不同分片当中,这样就不会造成数据冗余,每个卡槽对应着一个Redis集群,除了master节点外会有很多slave节点所以能够保证高可用。同时卡槽的大小可以不同,可以不按平均分配,我们可以把服务器性能比较好的分配较大的卡槽。卡槽能在master节点上分配。

在查询的时候会首先计算crc(key)%16384看看落在了哪个范围内然后到那个范围里去寻找,假如说我直接连的就是第一个集群,那么怎么找都不会找到,所以他会被重定向到第二个以此类推直到找到为止。

3.搭建Redis Cluster集群

首先我们需要准备6台虚拟机3主3从,但是我的虚拟机每个是2G,搭六个我感觉就废了,所以我搭伪集群。伪集群就是ip相同端口号不同。所以我们可以在同一个Redis里面通过修改配置文件的端口号搭建不同的Redis。然后我们先做一些搭建rediscluster集群的准备工作。如下图所示

在这里插入图片描述

首先我们创建一个文件夹rediscluster这个文件加存放我们的集群环境。因为我们要搭建6个redis 服务器3主3从所以我们在这个文件夹下面创建redis7000-7005作为他的端口号。然后我们把原来的redis.conf复制粘贴到redis7000~7005下面然后修改就行了。

修改配置文件的步骤:

1.daemonize yes # 后台启动

2.protected-mode no;## 允许外部访问

3.cluster-enabled yes #开启cluster,去掉注释

4.cluster-config-file nodes-700x.conf #自动生成

5.cluster-node-timeout 15000 # 节点通信时间

6.logfile /usr/rediscluster/redis700x/redis.log

7.port 700x#从7000到7005

8.dpfilename “700xdump.rdb” #一定要加这一步不然会因为rdb文件冲突报错。

然后启动这六台服务器(写个脚本应该比较快)例如启动7000

/usr/redis/bin/redis-server /usr/rediscluster/redis7000/redis.conf

依次启动就可以了。

在这里插入图片描述

但是这样启动完了我还不知道哪个是master哪个是slave节点所以你无法添加数据。这时候你需要为这六台机器分配卡槽。

通过这个命令他会自动给你分配主节点和从节点。/usr/redis/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1这个1的意思是master和slave是1:1也就是说这个执行完之后会分配3个master节点和3个slave节点。

在这里插入图片描述

而且上面明确的给你分配了卡槽slots主节点后面就有,从节点后面就啥也没有。问你是不是接收这样的分配你一点yes就行了。

在这里插入图片描述

然后我们试一下添加数据首先连接到7000然后set name 经过计算这个应该放在7001这个节点也就是说默认他是不会给你重定向到7001你需要自己切换到7001然后set name成功了。但是如果你想重定向的话你就需要连接的时候在后面加一个-c代表了你是以集群的方式启动。我们来看一下效果

在这里插入图片描述

你连的是7000但是你的key在7001,加了-c他会自动的重定向到7001。

4.Redis Cluster的扩容和缩容

4.1Redis Cluster扩容原理

原来是3个集群每个集群我们会分配16384/3个卡槽,如果现在加一对那就是4个集群了这就是16384/4个卡槽,前面每个集群都要出一些卡槽分给第四个。

4.2Redis Cluster扩容实际操作

创建7006和7007和之前的节点一样更改配置文件,然后我们一会要把他们依次加入到Cluster当中。

在这里插入图片描述

我们看一下没加入7006和7007之前的Cluster node是谁和他们的卡槽范围。有查询结果可知7000,7001,7002是master他们的卡槽范围分别是0-5460,5461-10922,10923~16383。然后我们添加7006看看效果。

在这里插入图片描述

如图所示7006已经被添加到集群中。

在这里插入图片描述

这张图我们能看到7006而且它添加进来默认是master只不过没给他分配卡槽。然后我们再添加7007。

在这里插入图片描述

执行以下命令./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 0bdd75ed547be8e29a12a1ce4fb61838f4239ebc,把7007设置为7006的从节点。其中那个id就是7006的id。这回我们看一下cluster集群里的节点情况

在这里插入图片描述

我们可以看到7006,7007已经成功地添加成功了,而且7006为master节点,7007为slave节点只是没有给这个7006分配卡槽。然后我们重新给这个cluster分配卡槽。

在这里插入图片描述

执行命令./redis-cli --cluster reshard 127.0.0.1:7000然后他会问如果想扩充一个master你要到多少个卡槽我们一共是4个master所以每个应该是4096个。然后他又问你向移动到哪个ID上你把7006的ID赋复制过来就行了。然后他又问你以什么方式这里面all就是你之前所有的卡槽都可以当做源卡槽进行分配,这里面显然就是平均分所以选all,done需要你指定ID,从特定的节点上分配卡槽到7006,一般用于某个节点较多的情况。

分配完卡槽之后我们再看一下cluster nodes

在这里插入图片描述

如图所示分给7006的卡槽范围分别是01364,54616826,10923~12287。这个是这么得来的新增加一个节点我们要每个master节点分配16384/4 = 4096个卡槽,新增加一个所以我们要让之前老的节点平均出一点凑出来这个数,原来是3个master节点所以每个人出4096/3个卡槽,所以大概一人出1365个就差不多了。

4.3master节点宕机之后重新实现选举

比如说我们把7006宕机了,然后再看看cluster nodes的情况。

在这里插入图片描述

如图所示7007自动上位。

重启7006

在这里插入图片描述

重启7006之后可以看到他自动的被分配为slave节点。说明Cluster集群选举是自动进行的。

4.4 Redis Cluster的缩容

假设说我们要把7006和7007这个集群删了,那么一定要在宕机之前把他的卡槽清空。我们只需要执行以下命令/usr/redis/bin/redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 7007的id --cluster-to 7000的id --cluster-slots 4096

这条命令的意思就是将7007的所有的卡槽移动到7000上,这个–cluster-slots可以指定具体分配多少个,–cluster-to也可以指定多个id,但是具体分配多少需要你自己算。这里图个省事儿,不算了,直接全挪过去了。

在这里插入图片描述

从图中我们可以看出7007的卡槽全部挪到了7000。这里面注意一下哈,移动卡槽连着里面的数据也会跟着移动。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Redis集群是一个由多个主从节点组成的分布式服务集群。它的主要特点是具有复制、高可用和分片的能力。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。具体来说,Redis集群将数据划分为16384个slots,每个节点负责一部分槽位的数据。每个节点之间通过Gossip协议相互交互集群信息,并保存着其他节点的槽位分配情况。这种去中心化的方式使得集群具有高可用性和扩展性。集群中的每个节点都可以水平扩展,官方建议不超过1000个节点。Redis集群的配置相对简单,性能和高可用性也优于之前版本的哨兵模式。而在Redis 4.0之后的版本中,引入了面对槽位的管理,使得集群的路由信息管理和数据迁移更加灵活和高效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [redis系列六redis-cluster集群的原理](https://blog.csdn.net/sswltt/article/details/106438796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis——cluster集群原理](https://blog.csdn.net/weixin_41605937/article/details/114779041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

温JZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值