扩展集群操作
扩容
在我们原始的集群基础上,我们决定增加一台主节点(8007)和一台从节点(8008),这样新增的节点将会在下图中以虚线框的形式显示在集群中。
1: 首先,在 /usr/local/redis-cluster 目录下创建两个文件夹,分别命名为 8007 和 8008。接下来,将 8001 文件夹下的 redis.conf 文件复制到 8007 和 8008 这两个文件夹中。- mkdir 8007 8008
- cd 8001
- cp redis.conf /usr/local/redis‐cluster/8007/
- cp redis.conf /usr/local/redis‐cluster/8008/
复制代码 2: 为了修改 8007 文件夹下的 redis.conf 配置文件,可以按照以下步骤进行操作:- vim /usr/local/redis‐cluster/8007/redis.conf
- # 修改如下内容:
- port:8007
- dir /usr/local/redis‐cluster/8007/
- cluster‐config‐file nodes‐8007.conf
- # 修改8008文件夹下的redis.conf配置文件
- vim /usr/local/redis‐cluster/8008/redis.conf
- # 修改内容如下:
- port:8008
- dir /usr/local/redis‐cluster/8008/
- cluster‐config‐file nodes‐8008.conf
复制代码 3: 启动 8007 和 8008 两个服务并查看它们的状态- /usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/8007/redis.conf
-
- /usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/8008/redis.conf
-
- ps ‐el | grep redis
复制代码 4: 查看redis集群的命令帮助- cd /usr/local/redis‐5.0.3
- src/redis‐cli ‐‐cluster help
复制代码
- create:用于创建一个集群环境,需要指定主机和端口号,例如:create host1:port1 ... hostN:portN。
- call:用于执行Redis命令,可以在集群中的任意一个节点上执行,例如:call 。
- add-node:用于将新的节点添加到集群中,需要提供新节点的IP和端口号,以及集群中任意一个已经存在的节点的IP和端口号作为参数,例如:add-node 。
- del-node:用于移除集群中的一个节点,需要指定要移除的节点的IP和端口号作为参数,例如:del-node 。
- reshard:用于重新分片,可以根据需要重新分配集群中的槽位。
- check:用于检查集群的状态,可以获取当前集群的信息和状态。
5: 配置8007为集群主节点
使用add-node命令新增一个主节点8007(master)。新增节点的ip:port应该放在命令的前面,已知存在节点的ip:port应该放在命令的后面。当你在日志的最后看到[OK] New node added correctly这个提示时,代表新节点加入成功。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster add‐node 192.168.0.61:8007 192.168.0.61:8001
6: 查看集群状态- 192.168.0.61:8001> /usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8001
- 192.168.0.61:8001> cluster nodes
复制代码 请注意:当成功添加节点后,新增的节点将不包含任何数据,因为它尚未分配任何哈希槽。因此,我们需要手动为新节点分配哈希槽。
7: 我将使用redis-cli命令为8007分配hash槽,并找到集群中的任意一个主节点,然后对该主节点进行重新分片工作。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster reshard 192.168.0.61:8001
输出如下:- ... ...
- How many slots do you want to move (from 1 to 16384)? 600
- (ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
- What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
- (ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)
- Please enter all the source node IDs.
- Type 'all' to use all the nodes as source nodes for the hash slots.
- Type 'done' once you entered all the source nodes IDs.
- Source node 1:all
- (ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
- ... ...
- Do you want to proceed with the proposed reshard plan (yes/no)? yes
- (ps:输入yes确认开始执行分片任务)
- ... ...
复制代码 8: 查看下最新的集群状态- 192.168.0.61:8001> /usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8001
- 192.168.0.61:8001> cluster nodes
复制代码
如上图所示,我们可以得出结论:在集群中,我们已经成功为8007分配了hash槽,这意味着我们可以在8007上进行数据的读写操作了!因此,我们可以确认8007已经成功加入到集群中,并且作为一个主节点(Master)存在。
9: 配置8008为8007的从节点
添加从节点8008到集群中去并查看集群状态
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster add‐node 192.168.0.61:8008 192.168.0.61:8001
如图所示,还是一个master节点,没有被分配任何的hash槽。
10: 为了将当前的8008节点作为从节点(slave)指向之前创建的8007主节点,我们需要执行replicate命令。首先,我们需要连接到8008节点的客户端,然后使用集群命令来执行操作。- /usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐c ‐h 192.168.0.61 ‐p 8008
- 192.168.0.61:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 #后面这串id为8007的节点id
复制代码 查看下目前的集群状态,8008节点已成功添加为8007节点的从节点了
缩容
1: 删除8008从节点
请使用del-node命令来删除节点8008。指定节点的IP地址为[IP地址],端口为[端口号],节点ID为[8008]。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster del‐node 192.168.0.61:8008 a1cfe35722d151cf70585cee21275565393c0956
再次使用cluster nodes命令查看集群状态。根据下图所示,可以看到已成功移除节点8008,而且该节点的redis服务也已经停止。
2: 删除8007主节点
最后,我们尝试删除之前加入的主节点8007。这个步骤相对比较麻烦一些,因为主节点里面分配了hash槽。因此,我们必须先将8007里的hash槽放入其他可用主节点中,然后再进行移除节点操作,以避免数据丢失问题。目前只能将master的数据迁移到一个节点上,暂时无法实现平均分配功能。执行命令如下:
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster reshard 192.168.0.61:8007
输出如下:- ... ...
- How many slots do you want to move (from 1 to 16384)? 600
- What is the receiving node ID? dfca1388f124dec92f394a7cc85cf98cfa02f86f
- (ps:这里是需要把数据移动到哪?8001的主节点id)
- Please enter all the source node IDs.
- Type 'all' to use all the nodes as source nodes for the hash slots.
- Type 'done' once you entered all the source nodes IDs.
- Source node 1:2728a594a0498e98e4b83a537e19f9a0a3790f38
- (ps:这里是需要数据源,也就是我们的8007节点id)
- Source node 2:done
- (ps:这里直接输入done 开始生成迁移计划)
- ... ...
- Do you want to proceed with the proposed reshard plan (yes/no)? Yes
- (ps:这里输入yes开始迁移)
复制代码 至此,我们已经成功将主节点8007的数据迁移到8001上。现在,让我们来查看一下集群的当前状态,如下图所示。你会注意到,8007下面已经没有任何hash槽了,这证明迁移已经成功完成!
3: 最后,我们可以直接使用del-node命令删除8007主节点。这样就可以完全移除该节点了。
/usr/local/redis‐5.0.3/src/redis‐cli ‐a xiaoyu ‐‐cluster del‐node 192.168.0.61:8007 2728a594a0498e98e4b83a537e19f9a0a3790f38
现在,让我们来查看一下集群的当前状态,你会发现一切都已经还原到最初的状态了!这代表我们的工作取得了巨大的成功,大功告成!
总结
通过本文,我们学习了如何扩展和缩容Redis集群。扩容操作包括增加新的主节点和从节点,并将它们添加到集群中。我们首先创建了新的文件夹,并将原始节点的配置文件复制到新的文件夹中。然后,我们修改了新节点的配置文件,指定新的端口和目录。接下来,我们启动了新的节点,并使用redis-cli命令添加新的主节点和从节点到集群中。为了确保新节点成功加入集群,我们手动为它们分配了hash槽。最后,我们查看了集群状态,确保所有操作都成功完成。
缩容操作涉及删除节点。我们首先使用del-node命令从集群中删除从节点,并查看集群状态以确认节点已成功删除。然后,我们尝试删除主节点,这需要先将其hash槽迁移到其他节点上,然后再删除主节点。我们使用reshard命令将主节点的hash槽迁移到其他主节点上,并查看集群状态以确认迁移成功。最后,我们使用del-node命令删除主节点,并再次查看集群状态以确认节点已成功删除。
通过学习扩展和缩容操作,我们可以更好地管理和优化Redis集群,提高其性能和可伸缩性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |