Redis集群中节点的增删

1、Redis集群的数据分片原理

Redis集群引入了哈希槽的概念,一个Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。
集群的每个节点负责一部分哈希槽。

(1)添加节点

如果想添加新的节点,则需要从原有节点中获得部分哈希槽分到新节点上。

(2)删除节点

如果想删除现有节点,则需要想删除节点上的哈希槽移到其他现有节点上,再删除没有分配哈希槽的节点。

(3)这样数据分片的益处

将哈希槽从一个节点转移到另一个节点的过程并不会停止服务,所以添加和删除节点,或改变节点中哈希槽的数量,都不会造成Redis集群不可用

2、如何增加Redis集群中的节点

(1)配置新节点的目录

创建两个新的目录,在目录中放入写好的配置文件,改一下配置文件的端口即可。

命令 功能
mkdir 700{7…8} 创建新节点目录,一个主节点,一个从节点
cd 700x 分别进入到目录中
cp …/7001/redis.conf . 将redis.conf文件复制过来,只改端口即可

Redis集群中节点的增删

(2)开启配置的两个实例

进入到目录中打开两个新的实例,并且查看,此时实例虽然已经开始运行,但是并没有真正的加入到集群中。

命令 功能
cd 700x 分别进入到目录中
redis-server redis.conf 开启实例
ps ax 查看实例是否开启

Redis集群中节点的增删
Redis集群中节点的增删

(3)将新主节点加入到集群中

添加7007节点到集群中,此处的add-node意为添加节点,127.0.0.1:7007为想要添加的实例地址和端口,最后一个参数为集群中已经存在的任意一个实例地址和其端口。
添加成功后可查看节点的信息,含有节点的唯一id、哈希槽分配情况等等,此时加入的新主节点还没有分配哈希槽,所以没有哈希槽的分配信息。

命令 功能
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 添加节点7007到集群中
redis-cli -c -p 7002 进入到任意一个节点中
cluster nodes 查看集群的节点信息,此时可看到节点7007添加成功,但无分配的哈希槽

Redis集群中节点的增删
Redis集群中节点的增删

(4)给新主节点分配哈希槽

命令 功能
redis-cli --cluster reshard 127.0.0.1:7001 进入该集群的哈希槽的分配页面

Redis集群中节点的增删
此时询问我们想要移动多少哈希槽,我这里写了150
Redis集群中节点的增删
此处询问想要接收这些哈希槽的节点ID,在页面中可找到7007节点对ID,复制即可
Redis集群中节点的增删
提供这150个哈希槽的节点是哪些?此处为写了all,由所有节点一起提供这150个哈希槽
Redis集群中节点的增删
是否接受这个分片的方案?这里选了yes
Redis集群中节点的增删
这时再查看集群节点信息,发现7007节点有哈希槽分配信息
Redis集群中节点的增删

(5)将从节点加入到集群中

命令 功能
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 先将7008节点加入到集群中
redis-cli -c -p 7008 进入到该节点中
cluster replicate 7007的节点ID 指定7008节点为7007节点的从节点
cluster nodes 查看集群节点信息,7008节点成功添加为7007的从节点

Redis集群中节点的增删
Redis集群中节点的增删

3、如何删除Redis集群中的节点

这里我想要删除的节点是7007和7008节点,删除时的顺序应该为:先删除从节点,再删除主节点

(1)删除从节点

命令 功能
redis-cli -c -p 7002 登陆现有任意节点
cluster nodes 查看节点信息,此时节点7008是存在的
redis-cli --cluster del-node 127.0.0.1:7008 7008节点ID 将该节点从集群中删除
redis-cli -c -p 7002 登陆现有任意节点
cluster nodes 查看节点信息,确认节点7008已经删除

Redis集群中节点的增删

(2)删除主节点

<1>转移主节点分配的哈希槽

在删除主节点之前,为了防止数据的丢失以及集群功能的正常,先应把主节点所分配的哈希槽转移到其他主节点上。在移动哈希槽时,要注意哈希槽从0开始计数,所以移动时要输入的数字比添加时少1
redis-cli --cluster reshard 127.0.0.1:7001

想移动多少个哈希槽?这里我输入149
Redis集群中节点的增删
希望哪个节点ID接收?某一个主节点就可以,这里我选了节点7001的ID。
Redis集群中节点的增删
希望谁提供这些哈希槽?我写了7007的节点ID,然后输入done,表示已经没有其他节点ID需要输入。
Redis集群中节点的增删
使用cluster nodes查看时,节点7007已经没有哈希槽的分配了,而节点7001多了哈希槽的分配,已经在信息中列出。
Redis集群中节点的增删

<2>删除没有哈希槽的主节点

命令 功能
redis-cli --cluster del-node 127.0.0.1:7007 7007的节点ID 删除该主节点
redis-cli -c -p 7002 登陆现有任意节点
cluster nodes 查看节点信息,确认节点7007已经删除

Redis集群中节点的增删

相关文章: