Redis 的分片集群搭建-预分区(Redis 自带)

1:注意

前面两篇博客我们分别搭建了 基于代理的两种不同的分片集群,但是redis 自身其实还有一种预分区的分片集群方式。 详细查看官网:https://redis.io/topics/cluster-tutorial

预分区:
1:哈希法
一开始把魔术值设置的较大,比如10个,取模是10,模数值得范围是:0,1…9,中间加一层mapping,0,1,2,3,4给第一个redis,5,6,7,8,9给第二个redis;如果有新的redis,那么让前两个redis让出一些槽位即可。迁移数据即可,比如3,4,8,9给第三台redis.

2:redis是怎么做的?(无主模型)
客户端get k1,随机连接一台redis,先hash%n,得到槽位,如果当前redis的槽位中有,取数据;否则,因为每个redis都知道其他 redis的槽位,返回客户端,应该去那个redis,进行重定向,重复上述操作。要求每个 redis 有相同的算法,并且知道别的 redis 都持有什么槽位

2:单机预分区分片集群搭建

2.1:修改 redis 配置文件,修改节点数

来到 Redis 源码存放路径,去修改配置文件,我这里保持不变

cd /jqk/redis/redis-6.0.9/utils/create-cluster/
ls
vi create-cluster 

在这里插入图片描述

2.2:启动全部实例

在这个目录下,输入命令一下子启动

./create-cluster start

在这里插入图片描述

2.3:给主机分配槽位(分赃)

输入命令,中间输入 yes

./create-cluster create

在这里插入图片描述

2.4:启动客户端,继续测试

根据 Redis 预分区的原理,我们随意连接一个主即可,我在这里连接 30001,
注意:不要 redis-cli -p 30001 这样启动,在存入数据的时候,经过hash后,计算这个key存储的槽位不在这个redis上,会报错,不会进行路由,应该用下面的方式启动
注意:数据放进同一个redis,那么对这个key,是支持事务和watch的。

redis-cli -c -p 30001

在这里插入图片描述

2.5:关闭

输入命令,继续关闭

./create-cluster stop 
./create-cluster clean

在这里插入图片描述

3:手动预分区分片集群搭建(分布式场景下)

上面我们是使用了 Redis 的脚本模拟了一下 预分区的情况,但在真实的场景下,我们可能会增加节点,这个是需要我们继续手动分配的。
官网上很详细,可以参考官网:https://redis.io/topics/cluster-tutorial

3.1:创建实例

在这个目录下,创建 一个文件夹 cluster-test ,进入这个文件夹,创建 7001,7002,7003,7004,7005,7006,7007,7008 文件夹

mkdir cluster-test
cd cluster-test
mkdir  7001 7002 7003 7004 7005  7006 7007 7008

在这里插入图片描述

1: 进入 7001 文件夹,创建 7001.conf

cd 7001
vim 7001.conf

写入以下内容

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7001 实例

redis-server  7001.conf

在这里插入图片描述

2:进入 7002文件夹,创建 7002.conf

cd 7002
vim 7002.conf

写入以下内容

port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7002 实例

redis-server  7002.conf

在这里插入图片描述
3:进入 7003文件夹,创建 7003.conf

cd 7003
vim 7003.conf

写入以下内容

port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7003实例

redis-server  7003.conf

在这里插入图片描述
4:进入 7004文件夹,创建 7004.conf

cd 7004
vim 7004.conf

写入以下内容

port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7004实例

redis-server  7004.conf

在这里插入图片描述
5:进入 7005文件夹,创建 7005.conf

cd 7005
vim 7005.conf

写入以下内容

port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7005实例

redis-server  7005.conf

在这里插入图片描述
6:进入 7006文件夹,创建 7006.conf

cd 7006
vim 7006.conf

写入以下内容

port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7006实例

redis-server  7006.conf

在这里插入图片描述
7:进入 7007文件夹,创建 7007.conf

cd 7007
vim 7007.conf

写入以下内容

port 7007
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7007实例

redis-server  7007.conf

在这里插入图片描述
7:进入 7008文件夹,创建 7008.conf

cd 7008
vim 7008.conf

写入以下内容

port 7008
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后启动 7008实例

redis-server  7008.conf

在这里插入图片描述

3.2:创建集群(我们先使用7001-7006实例)

新打开一个界面,进入到 /jqk/redis/redis-6.0.9/utils/create-cluster/ 文件夹,执行命令

cd /jqk/redis/redis-6.0.9/utils/create-cluster/ 

# 创建集群
redis-cli --cluster create 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 127.0.0.1:7006 \
--cluster-replicas 1

在这里插入图片描述
输入 yes 后,回车即可,三主三从 分片集群搭建完毕

3.3:增加新的主节点 7007

前面我们已经创建过了 7007,并已经启动了,我们直接执行命令加入节点

redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

在这里插入图片描述
节点增加成功,但是有两个特点
它没有数据,因为它没有分配的哈希槽。
因为它是一个没有分配槽的master,所以当一个replica想成为master时它不参与选举过程。

3.4:给主节点 7007 手动分配槽位

通过命令查看帮助

redis-cli --cluster help

在这里插入图片描述
通过帮助,我们执行命令

 redis-cli --cluster reshard 127.0.0.1: 7007

在这里插入图片描述

回车后
在这里插入图片描述
输入 yes ,回车后即可移动。

3.5:给主节点 7007 添加从节点 7008

因为 7008 我们在前面也都启动了,我们需要先找到 7007 的id,执行下面的命令

redis-cli -p 7007
cluster nodes

在这里插入图片描述
找到 主节点 ID 后,我们去添加 从节点

redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id d6706e23f5ddf59a50df4f7f03e9ddc8b5624160

在这里插入图片描述

3.6:删除节点

基本上很少去删除节点,所以只说一下思路
1:删除从节点

# 例如  redis-cli --cluster del-node  127.0.0.1:7008  e830ebe75c0f729a4726dfcabc5dd72e739026e9
redis-cli --cluster del-node  ip地址 ` 节点ID `

2:删除主节点
删除主节点有一个前提,它必须为空。如果主节点不为空,您需要将数据从它重新分片到之前的所有其他主节点。

删除主节点的另一种方法是在其一个副本上对其执行手动故障转移,并在该节点变成新主节点的副本后删除该节点。

当主节点为空时。删除命令和 上面的命令一样。绕不开一个话题:您想减少集群中的实际 master 数量时,这无济于事,在这种情况下,需要重新分片。

3.7:副本迁移

顾名思义,将 一个 主节点的从节点变成另一个从节点,只需要执行下面的命令即可。

cluster replicate  主节点ID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值