前面两篇博客我们分别搭建了 基于代理的两种不同的分片集群,但是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 都持有什么槽位
来到 Redis 源码存放路径,去修改配置文件,我这里保持不变
cd /jqk/redis/redis-6.0.9/utils/create-cluster/
ls
vi create-cluster
在这个目录下,输入命令一下子启动
./create-cluster start
输入命令,中间输入 yes
./create-cluster create
根据 Redis 预分区的原理,我们随意连接一个主即可,我在这里连接 30001,
注意:不要 redis-cli -p 30001 这样启动,在存入数据的时候,经过hash后,计算这个key存储的槽位不在这个redis上,会报错,不会进行路由,应该用下面的方式启动
注意:数据放进同一个redis,那么对这个key,是支持事务和watch的。
redis-cli -c -p 30001
输入命令,继续关闭
./create-cluster stop
./create-cluster clean
上面我们是使用了 Redis 的脚本模拟了一下 预分区的情况,但在真实的场景下,我们可能会增加节点,这个是需要我们继续手动分配的。
官网上很详细,可以参考官网:https://redis.io/topics/cluster-tutorial
在这个目录下,创建 一个文件夹 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
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
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
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
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
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
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
新打开一个界面,进入到 /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
前面我们已经创建过了 7007,并已经启动了,我们直接执行命令加入节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
节点增加成功,但是有两个特点
它没有数据,因为它没有分配的哈希槽。
因为它是一个没有分配槽的master,所以当一个replica想成为master时它不参与选举过程。
通过命令查看帮助
redis-cli --cluster help
redis-cli --cluster reshard 127.0.0.1: 7007
因为 7008 我们在前面也都启动了,我们需要先找到 7007 的id,执行下面的命令
redis-cli -p 7007
cluster nodes
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id d6706e23f5ddf59a50df4f7f03e9ddc8b5624160
基本上很少去删除节点,所以只说一下思路
1:删除从节点
# 例如 redis-cli --cluster del-node 127.0.0.1:7008 e830ebe75c0f729a4726dfcabc5dd72e739026e9
redis-cli --cluster del-node ip地址 ` 节点ID `
2:删除主节点
删除主节点有一个前提,它必须为空。如果主节点不为空,您需要将数据从它重新分片到之前的所有其他主节点。
删除主节点的另一种方法是在其一个副本上对其执行手动故障转移,并在该节点变成新主节点的副本后删除该节点。
当主节点为空时。删除命令和 上面的命令一样。绕不开一个话题:您想减少集群中的实际 master 数量时,这无济于事,在这种情况下,需要重新分片。
顾名思义,将 一个 主节点的从节点变成另一个从节点,只需要执行下面的命令即可。
cluster replicate 主节点ID