上一篇文章,我们已经学会了redis cluster的搭建及相关配置信息,本篇文章就重点学习一下redis cluster在运行过程中相关节点的操作。
目前我们已经搭建好的集群如下所示:
当初始规模(6节点)集群不够用时,我们会进行节点增加,而有时节点数量太多时,也会进行删减,下面就来看一看redis cluster对节点数量变动的支持。
此时slot分配情况如下:
1.添加数据
添加节点前,我们先set一些测试数据,目的是查看节点变更后,这部分数据会不会自动同步过去。
添加的数据为:key0-->key99999,共10万个。
然后使用dbsize命令统计各节点数据分布情况,如下:
192.168.80.129:6379> dbsize (integer) 33320 192.168.80.129:6380> dbsize (integer) 33390 192.168.80.129:6381> dbsize (integer) 33290
3个节点相加为10000,如果不是那就说明集群有问题:)
此时数据分布情况如下:
2.增加节点
1)添加主节点
首先我们查看一下集群信息,redis命令行状态下输入(以6382节点为例):
192.168.80.129:6382> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:7 cluster_my_epoch:7 cluster_stats_messages_sent:10288 cluster_stats_messages_received:10286
添加节点可以使用如下命令:
./redis-trib.rb add-node 新节点IP:新节点端口 旧节点IP:旧节点端口 或 ./redis-cli --cluster add-node 新节点IP:新节点端口 旧节点IP:旧节点端口
第一个参数很明确,而第二个参数就有些迷惑了,旧节点指的是那个节点?master还是slave?
这次我们准备添加2个节点,分别为redis-6385与redis-6386,于是我们先输入如下命令进行尝试:
[admin@localhost bin]$ ./redis-trib.rb add-node 192.168.80.129:6385 192.168.80.129:6382 >>> Adding node 192.168.80.129:6385 to cluster 192.168.80.129:6382 >>> Performing Cluster Check (using node 192.168.80.129:6382) M: ef8de3f336e23da1e703719621ac878cb0ac2e40 192.168.80.129:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 0779cac46b6e8b0908ca16feb2bb28f916348eff 192.168.80.129:6383 slots: (0 slots) slave replicates 7812b87e4c22ad604869a4350b32911eb9ef5865 M: 98017cd8a46aee30e6cc3222fa1657118f1eeec2 192.168.80.129:6381 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 5cee1d472a3d956ae56332b8a30b05520b8893ea 192.168.80.129:6382 slots: (0 slots) slave replicates ef8de3f336e23da1e703719621ac878cb0ac2e40 S: 79ed8fc747c0c02ee8b7318d83f96d6fa7d5ffa5 192.168.80.129:6384 slots: (0 slots) slave replicates 98017cd8a46aee30e6cc3222fa1657118f1eeec2 M: 7812b87e4c22ad604869a4350b32911eb9ef5865 192.168.80.129:6380 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.80.129:6385 to make it join the cluster. [OK] New node added correctly.我们发现添加成功了,那么第二个参数也就明确了,指的是集群中的任意一个节点即可,因为都可以获取到集群的信息。
而此时新添加的6385节点并没有出现在集群信息当中,通过CLUSTER INFO命令就可以看到,集群cluster_size:3。
补充,redis-trib.rb有以下参数可以使用:
create:创建一个集群环境host1:port1 ... hostN:portN(集群中的主从节点比例)
例如:./redis-trib.rb create --replicas 1 192.168.80.129:6379 192.168.80.129:6380 192.168.80.129:6381 192.168.80.129:6382 192.168.80.129:6383 192.168.80.129:6384
call:可以执行redis命令
例如:./redis-trib.rb call 192.168.80.129:6379 cluster info
add-node:将节点添加到集群里,第一个参数为要添加节点的IP与端口,第二个参数为集群中任意一个已经存在的节点的IP与端口
例如:./redis-trib.rb add-node 192.168.80.129:6385 192.168.80.129:6379
del-node:移除一个节点
例如:./redis-trib.rb del-node 192.168.80.129:6386 13ed528b7f45bfe03d6728d9dd3bc34a38d6cf75
reshard:重新分片
例如:./redis-trib.rb reshard 192.168.80.129:6379
check:检查集群状态
例如:./redis-trib.rb check 192.168.80.129:6379
2)添加从节点
虽然上面已经添加了master节点6385,从6385的node配置中也看到了,接下来我们继续添加6385的从节点,命令如下:
[admin@localhost bin]$ ./redis-trib.rb add-node --slave --master-id 3a1d7eadcc99f296ca76ef7a687184fec9dee782 192.168.80.129:6386 192.168.80.129:6379 >>> Adding node 192.168.80.129:6386 to cluster 192.168.80.129:6379 >>> Performing Cluster Check (using node 192.168.80.129:6379) M: ef8de3f336e23da1e703719621ac878cb0ac2e40 192.168.80.129:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 0779cac46b6e8b0908ca16feb2bb28f916348eff 192.168.80.129:6383 slots: (0 slots) slave replicates 7812b87e4c22ad604869a4350b32911eb9ef5865 M: 98017cd8a46aee30e6cc3222fa1657118f1eeec2 192.168.80.129:6381 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 3a1d7eadcc99f296ca76ef7a687184fec9dee782 192.168.80.129:6385 slots: (0 slots) master 0 additional replica(s) S: 5cee1d472a3d956ae56332b8a30b05520b8893ea 192.168.80.129:6382 slots: (0 slots) slave replicates ef8de3f336e23da1e703719621ac878cb0ac2e40 S: 79ed8fc747c0c02ee8b7318d83f96d6fa7d5ffa5 192.168.80.129:6384 slots: (0 slots) slave replicates 98017cd8a46aee30e6cc3222fa1657118f1eeec2 M: 7812b87e4c22ad604869a4350b32911eb9ef5865 192.168.80.129:6380 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.80.129:6386 to make it join the cluster. Waiting for the cluster to join. >>> Configure node as replica of 192.168.80.129:6385. [OK] New node added correctly.
至于从哪里获取6385节点的ID,我就不说了。
这时我们惊奇的发现,此时集群中cluster_size依然为3,这就说明虽然两个节点已经加入集群,当应该还未正常工作。
3.重新分配slot
因为我们没有给新节点分配slot的关系,所以它还不能正常工作。
redis-6379与redis-6381的slot数量为5461个,redis-6380的slot数量为5462个,这里需要注意。
因为此时集群中已经有4个mster节点,并且16384/4=4096,正好可以平均分配,所以就需要从6379与6381节点中拆分出1365个slot,从6380节点中拆分出1366个slot,如下所示:
接下来输入reshard命令并根据提示执行,如下所示:
[admin@localhost bin]$ ./redis-trib.rb reshard 192.168.80.129:6379 >>> Performing Cluster Check (using node 192.168.80.129:6379) M: ef8de3f336e23da1e703719621ac878cb0ac2e40 192.168.80.129:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 0779cac46b6e8b0908ca16feb2bb28f916348eff 192.168.80.129:6383 slots: (0 slots) slave replicates 7812b87e4c22ad604869a4350b32911eb9ef5865 M: 98017cd8a46aee30e6cc3222fa1657118f1eeec2 192.168.80.129:6381 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 13ed528b7f45bfe03d6728d9dd3bc34a38d6cf75 192.168.80.129:6386 slots: (0 slots) slave replicates 3a1d7eadcc99f296ca76ef7a687184fec9dee782 M: 3a1d7eadcc99f296ca76ef7a687184fec9dee782 192.168.80.129:6385 slots: (0 slots) master 1 additional replica(s) S: 5cee1d472a3d956ae56332b8a30b05520b8893ea 192.168.80.129:6382 slots: (0 slots) slave replicates ef8de3f336e23da1e703719621ac878cb0ac2e40 S: 79ed8fc747c0c02ee8b7318d83f96d6fa7d5ffa5 192.168.80.129:6384 slots: (0 slots) slave replicates 98017cd8a46aee30e6cc3222fa1657118f1eeec2 M: 7812b87e4c22ad604869a4350b32911eb9ef5865 192.168.80.129:6380 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 1365(这里输入要调整的slot数量) What is the receiving node ID? 3a1d7eadcc99f296ca76ef7a687184fec9dee782(这里输入要接受slot的node ID,此处为6385节点的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:ef8de3f336e23da1e703719621ac878cb0ac2e40(从哪个节点拆分,此处为6379节点的ID) Source node #2:98017cd8a46aee30e6cc3222fa1657118f1eeec2(从哪个节点拆分,此处为6381节点的ID) Source node #3:done (开始执行) 开始打印 ........ Moving slot 11593 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11594 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11595 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11596 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11597 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11598 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11599 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11600 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11601 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11602 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11603 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Moving slot 11604 from 98017cd8a46aee30e6cc3222fa1657118f1eeec2 Do you want to proceed with the proposed reshard plan (yes/no)?yes(输入yes确认) 开始打印 ...... Moving slot 11598 from 192.168.80.129:6381 to 192.168.80.129:6385: ..... Moving slot 11599 from 192.168.80.129:6381 to 192.168.80.129:6385: ......... Moving slot 11600 from 192.168.80.129:6381 to 192.168.80.129:6385: ......... Moving slot 11601 from 192.168.80.129:6381 to 192.168.80.129:6385: .... Moving slot 11602 from 192.168.80.129:6381 to 192.168.80.129:6385: ........ Moving slot 11603 from 192.168.80.129:6381 to 192.168.80.129:6385: ... Moving slot 11604 from 192.168.80.129:6381 to 192.168.80.129:6385: ........ 至此,6379节点与6381节点的slot已经reshard完成。
6380节点的reshard操作我就不再赘述了,都拆分完成后,我们利用redis-trib.rb来查看一下redis中数据的分布情况,如下所示:
[admin@localhost bin]$ ./redis-trib.rb call 192.168.80.129:6379 dbsize >>> Calling DBSIZE 192.168.80.129:6379: 29181 192.168.80.129:6380: 25088 192.168.80.129:6381: 29130 192.168.80.129:6385: 16601
29181+25088+29130+16601=100000!
我们发现reshard操作并不会丢失数据,就像直接把slot移动过来一般。
然后我们查看一下此时的的集群信息,如下:
[admin@localhost bin]$ ./redis-cli -c -p 6379 -h 192.168.80.129 192.168.80.129:6379> cluster info cluster_state:fail cluster_slots_assigned:16384 cluster_slots_ok:13653 cluster_slots_pfail:0 cluster_slots_fail:2731 cluster_known_nodes:8 cluster_size:4 cluster_current_epoch:8 cluster_my_epoch:1 cluster_stats_messages_sent:98899 cluster_stats_messages_received:98453
cluster_size已经是4,证明最新的节点已经添加成功。
4.删除nodes
1)删除从节点
删除从节点的工作比较简单,因为我们不需要考虑数据问题,只需要执行以下命令即可:
[admin@localhost bin]$ ./redis-trib.rb del-node 192.168.80.129:6386 13ed528b7f45bfe03d6728d9dd3bc34a38d6cf75 >>> Removing node 13ed528b7f45bfe03d6728d9dd3bc34a38d6cf75 from cluster 192.168.80.129:6386 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
很轻松的就把6386这个节点从集群中删除掉了。
注意:删除节点后该节点对应的进程也会被终止,如下:
列表中已经没有了6386节点的进程。
2)删除从节点
删除之前我们需要考虑当前节点的数据转移问题,那么redis会帮我们自动转移吗?
先直接按照删除从节点的方法直接删除主节点,如下:
[admin@localhost bin]$ ./redis-trib.rb del-node 192.168.80.129:6385 3a1d7eadcc99f296ca76ef7a687184fec9dee782 >>> Removing node 3a1d7eadcc99f296ca76ef7a687184fec9dee782 from cluster 192.168.80.129:6385 [ERR] Node 192.168.80.129:6385 is not empty! Reshard data away and try again.
发现删除失败,提示我们6385节点内还存在数据,需要我们reshard后再尝试。
于是我们reshard一下6385节点,操作如下:
[admin@localhost bin]$ ./redis-trib.rb reshard 192.168.80.129:6385 >>> Performing Cluster Check (using node 192.168.80.129:6385) M: 3a1d7eadcc99f296ca76ef7a687184fec9dee782 192.168.80.129:6385 slots:0-682,5461-6826,10923-11604 (2731 slots) master 0 additional replica(s) S: 0779cac46b6e8b0908ca16feb2bb28f916348eff 192.168.80.129:6383 slots: (0 slots) slave replicates 7812b87e4c22ad604869a4350b32911eb9ef5865 M: 98017cd8a46aee30e6cc3222fa1657118f1eeec2 192.168.80.129:6381 slots:11605-16383 (4779 slots) master 1 additional replica(s) S: 79ed8fc747c0c02ee8b7318d83f96d6fa7d5ffa5 192.168.80.129:6384 slots: (0 slots) slave replicates 98017cd8a46aee30e6cc3222fa1657118f1eeec2 M: 7812b87e4c22ad604869a4350b32911eb9ef5865 192.168.80.129:6380 slots:6827-10922 (4096 slots) master 1 additional replica(s) S: 5cee1d472a3d956ae56332b8a30b05520b8893ea 192.168.80.129:6382 slots: (0 slots) slave replicates ef8de3f336e23da1e703719621ac878cb0ac2e40 M: ef8de3f336e23da1e703719621ac878cb0ac2e40 192.168.80.129:6379 slots:683-5460 (4778 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 2731(输入要移动的slot数,取上文列出的即可) What is the receiving node ID? 7812b87e4c22ad604869a4350b32911eb9ef5865(选择谁接收,这里选择了6380节点) 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:3a1d7eadcc99f296ca76ef7a687184fec9dee782(来源,即从谁哪里移动) Source node #2:done(确认执行) ...... ...... Moving slot 11596 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11597 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11598 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11599 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11600 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11601 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11602 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11603 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Moving slot 11604 from 3a1d7eadcc99f296ca76ef7a687184fec9dee782 Do you want to proceed with the proposed reshard plan (yes/no)? yes ...... ...... Moving slot 11602 from 192.168.80.129:6385 to 192.168.80.129:6380: ........ Moving slot 11603 from 192.168.80.129:6385 to 192.168.80.129:6380: ... Moving slot 11604 from 192.168.80.129:6385 to 192.168.80.129:6380: ........
reshard成功,接下来我们验证以下,执行cluster slots命令,如下:
192.168.80.129:6379> CLUSTER SLOTS 1) 1) (integer) 11605 2) (integer) 16383 3) 1) "192.168.80.129" 2) (integer) 6381 3) "98017cd8a46aee30e6cc3222fa1657118f1eeec2" 4) 1) "192.168.80.129" 2) (integer) 6384 3) "79ed8fc747c0c02ee8b7318d83f96d6fa7d5ffa5" 2) 1) (integer) 683 2) (integer) 5460 3) 1) "192.168.80.129" 2) (integer) 6379 3) "ef8de3f336e23da1e703719621ac878cb0ac2e40" 4) 1) "192.168.80.129" 2) (integer) 6382 3) "5cee1d472a3d956ae56332b8a30b05520b8893ea" 3) 1) (integer) 0 2) (integer) 682 3) 1) "192.168.80.129" 2) (integer) 6380 3) "7812b87e4c22ad604869a4350b32911eb9ef5865" 4) 1) "192.168.80.129" 2) (integer) 6383 3) "0779cac46b6e8b0908ca16feb2bb28f916348eff" 4) 1) (integer) 5461 2) (integer) 11604 3) 1) "192.168.80.129" 2) (integer) 6380 3) "7812b87e4c22ad604869a4350b32911eb9ef5865" 4) 1) "192.168.80.129" 2) (integer) 6383 3) "0779cac46b6e8b0908ca16feb2bb28f916348eff"
果然列表中已经没有了6385节点的slots,而这部分slot已经移动到了6380节点上。
最后我们重新调用删除命令,进行6385节点的删除,如下:
[admin@localhost bin]$ ./redis-trib.rb del-node 192.168.80.129:6385 3a1d7eadcc99f296ca76ef7a687184fec9dee782 >>> Removing node 3a1d7eadcc99f296ca76ef7a687184fec9dee782 from cluster 192.168.80.129:6385 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
删除成功,并且进程也被终止。
下一篇我们来看看redis集群中内部通信与选举过程。
相关推荐
RedisCluster节点分配与槽(Slot) 在Redis Cluster中,数据不是按键存储,而是按槽存储。所有键被映射到16384个槽中,这样可以确保数据的均匀分布。当客户端向集群写入或读取数据时,根据键的哈希值定位到对应的...
Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,从而实现高可用性和水平扩展。本文将详细介绍Redis Cluster的工作原理、配置、使用以及与MySQL数据库的配合。 **一、Redis ...
在`redisCluster-demo`这个项目中,你可以期待找到一个使用Java实现的示例,展示如何配置和使用`JedisCluster`或者`Lettuce`来连接Redis Cluster,以及如何进行基本的数据操作。这个示例可以帮助初学者理解如何在...
这个压缩包文件"rediscluster配置文件.zip"包含了一系列配置文件,用于搭建一个三主三从的Redis Cluster架构。在这个架构中,每个主节点都有一个对应的从节点,确保在主节点失效时可以从其从节点接管服务,从而保持...
在Redis Cluster中,每个主节点都有零个或多个从节点,主节点负责处理写操作,从节点负责读操作,实现读写分离。当主节点发生故障时,从节点可以被提升为主节点,保证服务的连续性。这种高可用性设计减少了单点故障...
搭建 Redis Cluster 需要至少三个主节点,本文将以单机多实例的方式部署 3 个主节点及 3 个从节点,6 个节点实例分别使用不同的端口及工作目录。 5. Redis Cluster 的配置 Redis Cluster 的配置需要在每个节点的...
使用JFinal Redis Cluster插件时,首先需要将其引入到项目中,这里我们看到有一个名为 "jfinal-rediscluster-plugin-by-shixiaotian-0.0.1.jar" 的文件,这应该是该插件的可执行版本。通常,开发者会将这个JAR文件...
6. **数据分布与槽管理**:由于是关于Redis Cluster的示例,所以代码可能包含了如何在多节点之间分配和操作槽的逻辑,以及如何确保数据一致性。 7. **异常处理**:由于分布式系统可能出现网络故障或节点故障,所以`...
Redis Cluster节点分配使用哈希槽(hash slot)的方式来分配16384个slot。每个节点承担的slot区间可以根据需要进行调整。 例如,三个主节点分别是:A, B, C三个节点,它们可以是一台机器上的三个端口,也可以是三台...
- **单节点操作限制**:除了重新分配(resharding)操作外,Redis Cluster 中的数据不会在节点间迁移。这意味着每次操作只在一个节点上执行,确保了良好的扩展性和较低的延迟。 - **多键操作约束**:Redis Cluster ...
RedisCluster是Redis的一种分布式集群解决方案,它允许将数据分散存储在多个节点上,以实现高可用性和可扩展性。在RedisCluster中,每个节点都存储一部分数据,并且负责处理一部分客户端请求,这样可以分摊服务器...
Redis Cluster是Redis官方提供的分布式解决方案,它通过将数据分片(sharding)到多个节点来实现高可用性和可扩展性。在本实战栗子中,我们将深入探讨如何搭建Redis Cluster,学习其基本概念、操作指令以及如何处理...
实验结果表明,在高并发访问数(例如10000以上)的场景下,RedisCluster的响应时间明显优于Codis系统,验证了RedisCluster分布式缓存系统在处理高并发访问时的高效率和优越性能。 关键词“分布式缓存”指的是分布式...
Redis Cluster 是 Redis 3.0 开始推出的无中心结构集群模式,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,官方向要求至少 6 个节点才可以保证高可用,即 3 主 3 从。扩展性强、更好做到高可用...
redis cluster 集群节点配置 拿来即用
本示例“rediscluster集群demo”旨在展示如何设置和操作一个简单的Redis Cluster实例,确保在本地环境中的正确运行。 首先,Redis Cluster采用无中心架构,每个节点都是对等的,并且负责一部分数据。它通过槽(slot...
Redis Cluster 是 Redis 的一个高可用解决方案,通过将多个 Redis 节点组合成集群,提高 Redis 的可用性和性能。 环境准备 在开始部署 Redis Cluster 之前,需要准备 3 台服务器,每台服务器上需要安装 Redis ...
本指南将详细讲解如何完整地搭建一个 Redis Cluster,同时推荐配合网页教程进行操作以获得最佳体验。 ### 1. 预备知识 在开始之前,确保你已经了解了 Redis 的基本概念,如数据类型、命令等。此外,你需要以下工具...
首先,RedisCluster 实现了数据分片(Sharding)的概念,即将数据自动分散存储在多个节点上,每个节点负责一部分数据,从而实现水平扩展。通过哈希槽(Hash Slots)来决定数据在哪个节点上,这种方式保证了数据的...