Redis集群操作

如题所述

第1个回答  2022-07-25

有 slots

无 slots 时直接删除

(5)学习redis-trib命令使用:
添加两个节点
docker-compose.yaml 添加

1 create :创建一个集群环境host1:port1 ... hostN:portN(集群中的主从节点比例)
2 call :可以执行redis命令
3 add-node :将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
4 del-node [host:port node_id] :移除一个节点
5 reshard :重新分片
6 check [hosts:port]:检查集群状态

步骤一:使用add-node命令:绿色为新增节点,红色为已知存在节点

输出如下:

步骤二:查看集群状态:

注意: 当添加节点成功以后,新增的节点不会有任何数据,因为它没有分配任何的slot(hash槽)。我们需要为新节点手工分配slot。

步骤一:使用redis-trib命令,找到集群中的任意一个主节点(红色位置表现集群中的任意一个主节点),对其进行重新分片工作。

输出如下:

1提示一:是希望你需要多少个槽移动到新的节点上,可以自己设置,比如200个槽。
2提示二:是你需要把这200个slot槽移动到那个节点上去(需要指定节点id),并且下个 提示是输入all为从所有主节点(7001 7002 7003)中分别抽取响应的槽数(一共为200个槽到指定的新节点中!,并且会打印执行分片的计划。)
3提示三:输入yes确认开始执行分片任务。在最后我们再次看一下集群状态:

如上图所示,现在我们的7007已经有slot槽了,也就是说可以在7007上进行读写数据啦!到此为止我们的7007已经加入到集群中啦,并且是主节点(Master)

步骤一:还是需要执行add-node命令:

提示添加成功后我们继续看一下集群的状态:

如图所示,还是一个master节点,没有被分配任何的slot槽。

步骤二:我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个。
首先需要登录新加的7008节点的客户端,然后使用集群命令进行操作,把当前的7008(slave)节点指定到一个主节点下(这里使用之前创建的7007主节点,红色表示节点id)

我们继续看一下当前集群的状态,如下图:我们已经成功的把7008放到7007这个主节点下面了,到此为止我们已经成功的添加完一个从节点了。

(9)我们可以对集群进行操作,来验证下是否可以进行读写(当然可以)。
(10)我们现在尝试删除一个节点(7008 slave)
步骤一:删除从节点7008,输入del-node命令,指定删除节点ip和端口,以及节点id(红色为7008节点id)

输出如下:

步骤二:再次查看一下集群状态,如下图所示,我们已经成功的移除了7008 slave节点,另外我们发现移除一个节点以后,当前节点的服务进程也会随之销毁。可以使用ps命令查看当前的服务(ps -el | grep redis),发现少了一个运行的server,也就是刚移除的7008从节点。

(11)最后,我们尝试删除之前加入的主节点7007,这个步骤会相对比较麻烦一些,因为主节点的里面是有分配了slot槽的,所以我们这里必须先把7007里的slot槽放入到其他的可用主节点中去,然后再进行移除节点操作才行,不然会出现数据丢失问题。

步骤一:删除7007(master)节点之前,我们需要先把其全部的数据(slot槽)移动到其他节点上去(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能)。

输出如下:

到此为止我们已经成功的把7007主节点的数据迁移到7001上去了,我们可以看一下现在的集群状态如下图,你会发现7007下面已经没有任何数据(slot)槽了,证明迁移成功!

输出如下:

最后:我们查看集群状态,一切还原为最初始状态啦!OK 结束!

相似回答