Redis7【⑧ Redis集群(cluster)】

news2024/11/18 17:46:16

Redis集群

在这里插入图片描述

Redis 集群是 Redis 数据库的分布式解决方案,它可以将数据分散存储在多个节点上,以支持大规模数据存储和高并发访问。

Redis 集群使用的是基于槽的分区策略,即将数据分成固定数量的槽,每个槽由一个主节点和多个从节点组成。客户端请求会根据键值的哈希值被路由到对应的槽上,从而实现数据的分布式存储和访问。同时,Redis 集群还提供了多种操作槽的命令,以支持集群的管理和维护。

Redis 集群的主要特点包括:

  1. 分布式存储:Redis 集群将数据分散存储在多个节点上,每个节点负责处理一部分数据,从而实现数据的分布式存储和访问。集群可以扩展到数千个节点,以支持海量数据存储和高并发访问。建议控制在1000个以内的节点数。
  2. 高可用性:Redis 集群通过多副本机制和自动故障转移机制,保证数据的可靠性和可用性。每个节点都有多个副本,其中一个副本为主节点,负责处理客户端请求,其他副本为从节点,负责复制主节点的数据。当主节点宕机时,从节点会自动选举一个新的主节点,以保证数据的连续性和可用性。
  3. 数据自动分片:Redis 集群将数据自动分片存储在多个节点上,以实现数据的均衡分布和高效访问。每个节点都负责处理一部分数据,同时维护一份槽指派表,记录每个槽对应的主节点和从节点。客户端请求会根据键值的哈希值被路由到对应的槽上,从而实现数据的分布式存储和访问。
  4. 支持在线扩容缩容:Redis 集群支持在线添加和删除节点,以扩展或缩小集群的容量,而无需停机或数据迁移。集群会自动将数据重新分片和迁移,以保证数据的连续性和可用性。
  5. 负载均衡:Redis 集群通过智能路由算法,将客户端请求均匀地分发到不同的节点上,以实现负载均衡和性能优化。客户端可以通过集群模式下的代理节点(cluster-enabled proxy)进行连接,代理节点会自动将请求路由到正确的节点上。


1. redis集群槽位

在 Redis 集群中,槽位(slot)是将数据进行分片的基本单位,也是实现数据分布式存储和访问的重要机制。Redis 集群默认将 16384 个槽位均分给不同的节点,每个节点负责处理一部分槽位,从而实现数据的分布式存储和访问。

具体来说,Redis 集群使用哈希槽(hash slot)的方式将数据进行分片,每个槽对应着一个整数编号,从 0 开始,一直到 16383。每个节点会负责处理一部分槽位,同时维护一份槽指派表(slot map),记录每个槽对应的主节点和从节点。

客户端请求会根据键值的哈希值被路由到对应的槽上,从而实现数据的分布式存储和访问。具体来说,客户端会将键值的哈希值对 16384 取模,得到一个槽号,然后将请求发送到对应的槽所在的节点上。如果该节点是主节点,它会将请求处理后的结果返回给客户端;如果该节点是从节点,则会将请求转发给对应的主节点进行处理。

需要注意的是,槽的数量是固定的,因此如果需要扩展 Redis 集群的容量,就需要将一些槽移动到新的节点上,以实现数据的重新分片和迁移。Redis 集群提供了多种操作槽的命令,以支持集群的管理和维护。


2. redis集群分片

在 Redis 集群中,数据分片(sharding)是将数据划分成多个部分,分别存储在不同的节点上,从而实现分布式存储和访问的基本方式。Redis 集群使用哈希槽(hash slot)的方式将数据进行分片,每个节点负责处理一部分槽位,从而实现数据的分布式存储和访问。

具体来说,Redis 集群默认将 16384 个槽位均分给不同的节点,每个节点负责处理一部分槽位,同时维护一份槽指派表(slot map),记录每个槽对应的主节点和从节点。客户端请求会根据键值的哈希值被路由到对应的槽上,从而实现数据的分布式存储和访问。

数据分片能够提高 Redis 集群的容量和可用性,减少单节点的负载压力,并支持横向扩展和动态扩容。同时,数据分片也会带来一些挑战和问题,例如数据迁移、节点失效、一致性维护等方面的问题,需要进行合理的设计和实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SW7tUjy-1687977148295)(img/redis集群分片.png)]


3. redis槽位映射

  • 哈希取余分区

    哈希取余分区是一种常见的数据分区技术,它将数据划分成多个分区,并将每个分区分配给集群中的不同节点,从而实现分布式存储和访问。

    在哈希取余分区中,首先根据某个键的哈希值对分区总数取模,得到该键所在的分区编号,然后将该键存储在对应的节点上。当需要访问某个键值对时,同样通过哈希值计算得到该键所在的分区编号,然后访问对应的节点,从而实现数据的分布式访问。

    哈希取余分区技术简单易懂,易于实现,可以较好地均衡数据在各个节点之间的分布,从而提高系统的可扩展性和可用性。但是,该技术存在数据倾斜和数据迁移等问题。如果某个键的哈希值对分区总数取模后恰好落在某个分区上,那么该分区的负载将会比其他分区更重,可能会导致性能问题。此外,在节点的动态扩容和缩容时,会需要进行数据迁移,对系统的稳定性和性能也会带来影响。
    在这里插入图片描述

  • 一致性哈希算法分区

    一致性哈希算法(Consistent Hashing Algorithm)是一种用于分布式存储系统的数据分区技术,它可以使得数据在集群中的分布更加均匀,同时减少在数据分区发生变化时需要重新分配的数据量。
    在这里插入图片描述

    在一致性哈希算法中,所有的数据被分成一定数量的分区,每个分区被映射到一个哈希环上。每个节点也被映射到哈希环上,并负责其所在的某些分区。当需要存储一个数据时,先对该数据进行哈希,然后将哈希值映射到哈希环上,找到最近的节点,并将数据存储在该节点上。当需要读取一个数据时,也先对该数据进行哈希,并映射到哈希环上,然后从离该数据最近的节点上读取数据。

    一致性哈希环

    一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0,2^32-1],这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqt9r2Mi-1687977148297)(img/一致性哈希环.png)]

    一致性哈希算法的核心思想是将哈希环视为一个环形空间,并将节点和数据视为该空间上的点。通过在哈希环上的均匀分布,可以使得数据在集群中的分布更加均匀。当某个节点宕机时,只会影响该节点所负责的一部分分区,不会影响整个集群,从而提高了系统的可用性和稳定性。同时,一致性哈希算法也能够自动地将数据重新映射到新的节点上,从而减少了数据的迁移量和系统的维护成本。

    一致性哈希算法已经被广泛地应用于各种分布式系统中,包括缓存系统、负载均衡系统、分布式文件系统等

在这里插入图片描述

  1. 优点
    在这里插入图片描述
    在这里插入图片描述

  2. 缺点
    在这里插入图片描述

  • 哈希槽分区

    哈希槽分区是 Redis 集群中常用的数据分区技术,它将整个数据集划分为固定数量的槽位(slot),然后将每个槽位分配到集群中不同的节点上,从而实现数据的分布式存储和访问。
    2 ^ 14 = 16384

    在哈希槽分区中,每个槽位都对应着一个哈希值范围,例如 0 到 16383。当需要存储某个键值对时,先计算出该键的哈希值,然后确定该哈希值所在的槽位,最后将键值对存储在负责管理该槽位的节点上。当需要访问某个键值对时,同样先计算出该键的哈希值,然后确定该哈希值所在的槽位,最后访问负责管理该槽位的节点,从而实现数据的分布式访问。
    在这里插入图片描述

    哈希槽分区技术具有简单、可扩展性强等优点,它可以自动完成节点的动态扩容和缩容,并且在数据迁移时可以只迁移部分槽位,从而降低数据迁移的成本和风险。但是,该技术也存在一些问题,例如槽位的分配不均匀可能会导致某些节点的负载过重,从而影响系统的性能和可用性,此时可以通过手动调整槽位分配来解决这个问题。

在这里插入图片描述
在这里插入图片描述
大概可能是:如果slot过多,每个心跳包占用带宽就过于多了,而如果槽位超过1000,网络又会拥塞,所以最合理的选择就是16384个槽给1000个以内的主机使用。在节点少的情况下,即小型集群中,因为填充率为slots/N,若采用65536的话,压缩比将会很低,不容易传输,但是采用16384的话,压缩率将会高很多,容易传输些
在这里插入图片描述
在这里插入图片描述
Redis集群并不保证强一致性,这意味着在特定条件下,Redis集群可能会丢失一些被系统写入的数据。
在这里插入图片描述

Redis群集在节点之间使用异步复制,最后一次故障转移赢得隐式合并功能,这意味着最后一次选择的主数据将替换所有其他副本。在分区期间可能丢失写的时候总是有一个时间窗口。
与大多数主程序相连接的客户端和与少数主程序连接的客户端则不同。


4. 集群环境搭建

(1)三主三从redis集群配置

由于机器性能有限,这里只配置了三台虚拟机,一台虚拟机配置两个redis实例

192.168.110.100 (下面简称100)配置端口为6381和6382两个实例,配置文件分别为cluster6381.conf和cluster6382.conf
192.168.110.101 (下面简称101)配置端口为6383和6384两个实例,配置文件分别为cluster6383.conf和cluster6384.conf
192.168.110.102 (下面简称102)配置端口为6385和6386两个实例,配置文件分别为cluster6385.conf和cluster6386.conf

以实例cluster6381.conf为例,配置文件内容如下所示:
注意!这里配置文件部分不能有注释!!!要不然无法被连接!!

bind 0.0.0.0
daemonize yes
protected-mode no
port 6381
logfile "/myredis/cluster/cluster6381.log"
pidfile /myredis/cluster6381.pid
dir /myredis/cluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 123456
masterauth 123456
 
cluster-enabled yes		# 开启集群
cluster-config-file nodes-6381.conf		# 集群生成的配置文件
cluster-node-timeout 5000	# 集群节点之间的超时时间

在每台虚拟机的根目录创建/myredis/cluster目录,然后在该目录创建两个配置文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DN8Ib9DJ-1687977148297)(img/2023-04-15_125434.png)]

查看cluster6381.conf文件内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXBzgXQN-1687977148297)(img/2023-04-15_124752.png)]

(2)启动六台redis实例

启动集群实例和之前启动redis实例一样,只不过配置文件中配置了开启集群,会以集群的方式启动redis实例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57J9D3gx-1687977148298)(img/2023-04-15_130446.png)]

(3)构建主从关系

使用命令构建集群间的主从关系:redis-cli -a 密码 --cluster create --cluster-replicas 1 IP:端口号 [IP:端口号]

选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点

IP:端口号是redis实例的地址和端口号,多个redis实例构成一个集群

主从关系是随机分配的(个人见解:一般按照输入的顺序基数位为master,偶数位为slave),其master-slave关系是随机分配的。

在任意一个虚拟机中执行这个命令都可以,下面在110虚拟机中执行此命令:

[root@redis cluster]# redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.110.100:6381 192.168.110.100:6382 192.168.110.101:6383 192.168.110.101:6384 192.168.110.102:6385 192.168.110.102:6386
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460			# 1号主节点分配了0-5460的槽位
Master[1] -> Slots 5461 - 10922		# 2号主节点分配了5461-10922的槽位
Master[2] -> Slots 10923 - 16383	# 3号主节点分配了10923-16383的槽位
Adding replica 192.168.101.111:6384 to 192.168.101.110:6381	#111机器的6384实例同步110机器的6381实例
Adding replica 192.168.101.112:6386 to 192.168.101.111:6383	#112机器的6386实例同步111机器的6383实例
Adding replica 192.168.101.110:6382 to 192.168.101.112:6385	#110机器的6382实例同步112机器的6385实例
M: e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381	# 主节点id IP:端口号
   slots:[0-5460] (5461 slots) master	# 分配了5461个槽位
S: 202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382	# 从节点id IP:端口号
   replicates 154d23ad6fb321801ebe84e8066411e3f3fc05ec	# 从属154d23(主节点id,对应6385)
M: 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383
   slots:[5461-10922] (5462 slots) master
S: 851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384
   replicates e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6
M: 154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385
   slots:[10923-16383] (5461 slots) master
S: e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386
   replicates 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d
Can I set the above configuration? (type 'yes' to accept): yes	# 是否保存这些配置,输入yes保存
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 192.168.101.110:6381)
M: e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384
   slots: (0 slots) slave	# 从节点分配了0个槽位
   replicates e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6
M: 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382
   slots: (0 slots) slave
   replicates 154d23ad6fb321801ebe84e8066411e3f3fc05ec
S: e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386
   slots: (0 slots) slave
   replicates 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d
M: 154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385
   slots:[10923-16383] (5461 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.

重连6381实例再查看集群信息:CLUSTER INFO

[root@redis cluster]# redis-cli -a 123456 -p 6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> 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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3652
cluster_stats_messages_pong_sent:3675
cluster_stats_messages_sent:7327
cluster_stats_messages_ping_received:3670
cluster_stats_messages_pong_received:3652
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:7327
total_cluster_links_buffer_limit_exceeded:0

查看集群节点的状态信息:CLUSTER NODES

[root@redis cluster]# redis-cli -a 123456 -p 6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> CLUSTER NODES	# 查看集群节点状态信息
e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381@16381 myself,master - 0 1681569469000 1 connected 0-5460	# myself,master表示当前所在的节点,是主节点。前面的一大串是该节点的id、IP端口信息
851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384@16384 slave e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 0 1681569472503 1 connected	# 从节点851c41(6384)同步e4d44f(6381)
1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383@16383 master - 0 1681569472000 3 connected 5461-10922
202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382@16382 slave 154d23ad6fb321801ebe84e8066411e3f3fc05ec 0 1681569472000 5 connected
e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386@16386 slave 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 0 1681569472503 3 connected
154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385@16385 master - 0 1681569472604 5 connected 10923-16383

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwzHzogZ-1687977148298)(img/2023-04-15_224005.png)]


5. 测试集群读写

每个key都有自己的哈希值,根据哈希值通过某种算法算出对应的槽位,该key只能存储到该槽位所在的节点上。

然而这种情况并不是我们想要的,可以在连接redis客户端时添加-c参数,这样会帮我们把数据路由到指定的槽位上,即使在不同的节点上也能随便存储数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqjEhMM7-1687977148298)(img/2023-04-15_232003.png)]

查看某个key对应的槽位值:CLUSTER KEYSLOT key

任何字符都有对应的哈希值,所以任何字符都能计算出对应的槽位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMHm1wvE-1687977148299)(img/2023-04-15_232246.png)]

查看某个槽位是否被占用:CLUSTER COUNTKEYSINSLOT 槽位号

返回1表示该槽位被占用;返回0表示该槽位没有被占用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XAHCb4z-1687977148299)(img/2023-04-16_021649.png)]


6. 测试集群主从切换

  • 首先查看当前节点主从关系:INFO REPLICATION

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLUWchCb-1687977148299)(img/2023-04-15_233204.png)]

  • 手动关闭主节点6381,查看集群节点状态

    在其他任何集群节点查看集群节点的状态都可以。

    主节点宕机后,从节点会成为新的master。

  • 重新连接节点6381,查看集群节点状态

    恢复6381节点后,该节点会变成新master的slave。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B49jiEaw-1687977148299)(img/2023-04-16_000001.png)]

  • 恢复6381master的身份:CLUSTER FAILOVER

    使用cluster failover可以恢复发生故障前的主从关系

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rgf53rH-1687977148300)(img/2023-04-16_000849.png)]
    在这里插入图片描述
    比如从机上位的过程中,写入数据,还未上位的时候,分配的槽位到这里,可能就出现了数据丢失。

手动故障转移 or 主从关系调整:

CLUSTER FAILOVER
在这里插入图片描述


7. redis集群扩容

在112虚拟机上新建两个redis实例6387和6388,此时112虚拟机上有4个redis实例分别是6385、6386、6387、6388

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIGE5vFD-1687977148300)(img/2023-04-16_002143.png)]

启动这两个新节点,此时它们都是master

在这里插入图片描述

将6387节点作为master加入到集群中:redis-cli -a 密码 --cluster add-node IP:port IP:port

前者IP:port为需要加入到集群的节点ip和端口
后者IP:port指集群中任一节点的ip和端口(可以理解为推荐人)

[root@redis2 cluster]# redis-cli -a 123456 --cluster add-node 192.168.101.112:6387 192.168.101.110:6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.101.112:6387 to cluster 192.168.101.110:6381
>>> Performing Cluster Check (using node 192.168.101.110:6381)
M: e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386
   slots: (0 slots) slave
   replicates 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d
S: 202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382
   slots: (0 slots) slave
   replicates 154d23ad6fb321801ebe84e8066411e3f3fc05ec
S: 851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384
   slots: (0 slots) slave
   replicates e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Getting functions from cluster
>>> Send FUNCTION LIST to 192.168.101.112:6387 to verify there is no functions in it
>>> Send FUNCTION RESTORE to 192.168.101.112:6387
>>> Send CLUSTER MEET to node 192.168.101.112:6387 to make it join the cluster.
[OK] New node added correctly.

检查集群情况:redis-cli -a 密码 --cluster check IP:port

只需要指定集群中任意一个在线的节点的地址(IP:端口号), 就会自动找到集群中的其他节点,即可查看整个集群的信息。

[root@redis1 ~]# redis-cli -a 123456 --cluster check 192.168.101.110:6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.101.110:6381 (e4d44fbd...) -> 2 keys | 5461 slots | 1 slaves.
192.168.101.112:6385 (154d23ad...) -> 1 keys | 5461 slots | 1 slaves.
192.168.101.112:6387 (b1ef21d8...) -> 0 keys | 0 slots | 0 slaves.	#可以看到节点6387加入了集群但是没有分配槽位
192.168.101.111:6383 (1b9c2607...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.101.110:6381)
M: e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b1ef21d88293bc1560f61a46c4fca8b601d59d60 192.168.101.112:6387
   slots: (0 slots) master
M: 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386
   slots: (0 slots) slave
   replicates 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d
S: 202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382
   slots: (0 slots) slave
   replicates 154d23ad6fb321801ebe84e8066411e3f3fc05ec
S: 851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384
   slots: (0 slots) slave
   replicates e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

重新分派槽号:redis-cli -a 密码 --cluster reshard IP:port

只需要指定集群中任意一个在线的节点的地址(IP:端口号)即可。

[root@redis2 cluster]# redis-cli -a 123456 --cluster reshard 192.168.101.110:6381
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.101.110:6381)
M: e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6 192.168.101.110:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 154d23ad6fb321801ebe84e8066411e3f3fc05ec 192.168.101.112:6385
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b1ef21d88293bc1560f61a46c4fca8b601d59d60 192.168.101.112:6387
   slots: (0 slots) master
M: 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d 192.168.101.111:6383
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e2512f82160d0e044b40dade1f6e2df7a942c83c 192.168.101.112:6386
   slots: (0 slots) slave
   replicates 1b9c2607caafa82ab53a407f4979b00c9ee1ea9d
S: 202075b6488c250e6f8227c44b905f7781162f30 192.168.101.110:6382
   slots: (0 slots) slave
   replicates 154d23ad6fb321801ebe84e8066411e3f3fc05ec
S: 851c4e7c78ddfb59672dcdfae5e29a2372fdc192 192.168.101.111:6384
   slots: (0 slots) slave
   replicates e4d44fbdc683d3882b39f7b02d5a78bc4c0b36a6
[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)? 4096
What is the receiving node ID? b1ef21d88293bc1560f61a46c4fca8b601d59d60	# 指定一个节点id接收槽位
Please enter all the source node IDs.
  # all表示现有的三个分片平均拿出一点槽位分给新节点
  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

Ready to move 4096 slots.

再次检查集群情况

在这里插入图片描述

为集群中新主节点添加从节点:
redis-cli -a 密码 --cluster add-node IP:port IP:port --cluster-slave --cluster-master-id 新主人节点id

前者IP:port指从节点的地址,后者IP:port为集群中任意一个在线节点的地址

[root@redis2 cluster]# redis-cli -a 123456 --cluster add-node 192.168.101.112:6388 192.168.101.112:6387 --cluster-slave --cluster-master-id b1ef21d88293bc1560f61a46c4fca8b601d59d60
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.101.112:6388 to cluster 192.168.101.112:6387
>>> Performing Cluster Check (using node 192.168.101.112:6387)

再次检查集群情况

[接上传(img-DYuA09A3-1687977148301)(img/2023-04-16_011706.png)]


8. redis集群缩容

首先先将从节点6388删除:redis-cli -a 密码 --cluster del-node IP:从节点端口 从节点id

节点id可以通过检查集群情况命令查看:redis-cli -a 密码 --cluster check IP:port
也可以通过CLUSTER NODES命令查看。

[root@redis2 cluster]# redis-cli -a 123456 --cluster del-node 192.168.101.112:6388 8bc4986317910e2f57d67609931645b41d5a90e3		# 删除6388j
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 8bc4986317910e2f57d67609931645b41d5a90e3 from cluster 192.168.101.112:6388
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

将主节点6387的槽号清空重新分配

这里将清空的槽号全部分配给6381节点(当然也可以平均分配回之前的三个主节点,只不过要操作三次)

# 重新分配槽号
[root@redis2 cluster]# redis-cli -a 123456 --cluster reshard 192.168.101.110:6381

在这里插入图片描述

移除槽位后检查集群情况

6387节点槽位被清空,成为了6381节点的从节点

这和加入6387节点到集群时填写的集群中的IP:port有关(6381相当于推荐人)

在这里插入图片描述

此时节点6387是一个从节点,将节点6387删除

[root@redis2 cluster]# redis-cli -a 123456 --cluster del-node 192.168.101.112:6387 b1ef21d88293bc1560f61a46c4fca8b601d59d60

再次检查集群情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NKFXaIA-1687977148302)(img/2023-04-16_020413.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础教程: 入门简介

Python 最初由 Guido van Rossum 在 1991 年开发,当时他在执行其他项目的时候需要编写一个简单的解释器。Python 最初只是一种简单的脚本语言,但在后来的发展中,它迅速成为一种流行的编程语言。 Python 不仅在大型科技企业中应用广泛&#x…

spring cloud 之 gateway

网关介绍 在微服务架构体系中,一个系统会被拆分为很多个微服务,那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别调用,当然这样是不现实的…

Mysql事务原理

一、概述 事务:一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性。 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可…

水站桶装水订水系统桶装水小程序,改变了桶装水行业传统的送水模式;

水站桶装水订水系统桶装水小程序,改变了桶装水行业传统的送水模式,客户通过线上下单,送水工实时接单配送,空桶更好的记录管理,财务数据在后台清晰明了,提高了水站的工作效率。 除此之外,还有很多…

网络系统集成实验(五)| 系统集成路由器OSPF动态、综合路由配置

一、前言 该系列文章将会对网络系统集成课程中相关实验进行更新,本篇为第五篇,有关路由器的OSPF、综合路由配置,包括了OSPF的配置实验、单臂路由实验、RIP配置实验、综合实验等。 注意:该实验的后半部分综合实验基于前面的实验&am…

java Collection集合使用笔记

1、Collection集合概述 它是单例集合的最顶层接口,它表示一组对象,这些对象也称之为Collection的元素JDK不提供此接口任何直接实现,但提供更具体的子接口(如:List和Set)实现创建Collection集合对象的方法&…

麒麟信安与飞腾携手共赴云端

当前各行业已进入全面云化时代,云桌面技术作为典型办公终端替代方案,凭借其数据安全、便捷运维、综合成本占优的优势正逐步在各行业应用实施。伴随十四五规划加速数字化转型及信息产业核心技术自主化发展,各政企组织迫切需要基于国产软硬件实…

gmap构建离线地图,用createCustomerTiledLayer方法,瓦片地址尾部多了 ?x={x}y={y}z{z} 导致无法显示地图。

gmap构建离线地图,用createCustomerTiledLayer方法,瓦片地址尾部多了 ?x{x}&y{y}&z&{z} 导致无法显示地图。 function initMap() {this.map new GL.Map(map, {center: "120.650847,31.3092434",zoom: 12,zoomControl: false,sca…

青大数据结构【2018】【算法设计】

关键词: 单链表递增、树的先序遍历 1)带头结点的单链表L,从首结点开始,依次两两比较,如果前者大于等于后者,说明是非递增的;否则递增。 2) 1)先遍历二叉树,…

【mars3d】基于vue3的marsgis通用UI库 mars-ui 的使用

一名脑残程序员的mars-ui心酸使用记录。 通过mars3d的官网我们可以看到,有配套的UI库使用,那么我们如何使用到自己的项目中呢,跟着文章一步一步来吧! 1、引入UI库 ① 安装ant-design-vue cnpm install ant-design-vue --save②…

如何实现功能插件化

本文将介绍两种方式来实现功能插件化: Java SPISpring factories 在整个插件化的方案中,会涉及到如下 3 个组成部分: 插件定义(即将插件定义为一个接口) 插件实现(即对插件接口的实现) 这里…

【需求实现】输入多少就输出多少的拟合任务如何实现(二):进度条简化

文章目录 导读普通的输出方式上下求索TensorBoard是个不错的切入点与Callback参数对应的Callback方法官方的内置Callback官方进度条简单的猜测与简单的验证拼图凑齐了! 导读 在训练模型的过程中往往会有日志一堆一堆的困扰。我并不想知道,因为最后我会在…

今天给大家分享几款好用的卸载神器

在日常使用电脑的过程中,我们经常需要安装和卸载各种软件。然而,有时候使用操作系统自带的卸载程序可能无法完全清除程序及其相关文件和注册表项,导致系统出现垃圾文件和残留问题。为了解决这个困扰,今天我将向大家分享几款好用的…

【Spring】基于注解方式存取JavaBean:Spring有几种注入方式?有什么区别?

前言 Hello,我是小黄。众所周知,Spring是一个开源的Java应用程序框架,其中包括许多通过注解实现依赖注入的功能。Spring提供了多种注入方式,可以满足不同的需求和场景。常见的注入方式包括构造函数注入、Setter方法注入和属性注入…

【Redis】Redis的高可用与持久化

文章目录 一、Redis 高可用1. 概念2. 高可用技术以及作用2.1 持久化2.2 主从复制2.3 哨兵2.4 集群 二、Redis 持久化1. 持久化的功能2. Redis 持久化方式 三、RDB 持久化1. 概述2. 触发条件2.1 手动触发2.2 自动触发2.3 其他自动发机制 3. 执行流程4. 启动时加载 四、AOF 持久化…

Modin 入门学习

Modin 是一个 Python 第三方库,用于加速 Pandas 的 API 执行速度。原始的 Pandas 是单线程执行的,而 Modin 则重新打包了 Pandas 里面的 API,使其同时在多个内核中运行,提高硬件性能的利用率。 使用方法很简单,安装 M…

2.9C++多态

C 继承扩展 C继承在实际开发中它可以帮助我们实现代码重用,减少代码冗余,提高代码的可维护性和可扩展性。 通过继承,我们可以从已有的类中派生出新的类,新的类可以继承父类的属性和方法,并且可以添加自己的属性和方法…

selenium元素定位---ElementClickInterceptedException(元素点击交互异常)解决方法

目录 前言: 1、异常原因 2、解决方法: 前言: 当使用Selenium进行元素定位和交互时,可能会遇到ElementClickInterceptedException(元素点击交互异常)的异常。这通常是由于页面上存在其他元素或弹出窗口遮…

ROS学习之基础包创建的详细流程:包括rosnode, rostopic, rosrun,roslaunch等使用

0 引言 本文旨在学习ROS基础包的从零开始创建,包括如何创建一个发布消息节点,一个接收消息节点,还有如何使用roslaunch同时启动多个节点,如何编译ROS工程包等操作。 默认已在Ubuntu系统中安装ROS机器人系统,比如Ubun…

AOP--拦截器

AOP应用--拦截器Spring拦截器拦截器执行流程前缀的添加统一异常处理统一数据返回格式返回String类型 AOP应用–拦截器 AOP的作用:统一功能处理;我们将以三个内容作为学习的掌握点;而这三点也是我们非常迫切需要的 1:用户登录权限…