Redis学习手册19—集群

Redis集群

Redis集群是从Redis 3.0版本开始正式引入的功能,它给用户带来了在线扩展Redis系统读写性能的能力,而Redis 5.0更是在集群原有功能的基础上,进一步添加了更多新功能,并且对原有功能做了相当多的优化,使得整个集群系统更简单、易用和高效。

基本特性

Redis集群提供了非常丰富的特性供用户使用,下面逐个介绍。

复制与高可用

Redis集群与单机版的Redis服务器一样,也提供了主从复制功能。在Redis集群中,各个Redis服务器成为节点(node),其中主节点(master node)负责处理客户端发送的读写命令请求,而从节点(replica/slave node)则负责对主节点进行复制。

除了复制功能之外,Redis集群还提供了类似与单机版的Redis Sentinel 的功能,以此来为集群提供高可用特性。简单来说,集群中的各个节点将互相监视各自的运行状况,并在某个主节点下线时,通过提升该节点为主节点来继续提供服务。

在这里插入图片描述

分片与重分片

与单机版的Redis将整个数据库放在同一台服务器上的做法不同,Redis集群通过将数据库分散存储到多个节点上来平衡各个节点的复杂压力。
具体来说,Redis集群会将整个数据库空间划分为16384个槽(slot)来实现数据分片(sharding),而集群中的各个主节点则会分别负责处理其中的一部分槽。当用户尝试将一个键存储到集群中时,客户端会先计算出键所属的槽,接着在记录集群节点槽分布的映射表中找出处理该槽的节点,最后再将键存储到相应的节点中,如下图所示:

在这里插入图片描述
当用户想要向集群添加新节点时,只需要向Redis集群发送几条简单的命令,集群就会将相应的槽以及槽中存储的数据迁移到新节点;当用户想要从集群中移除已存在的节点时,被移除的节点也会将自己负责处理的槽以及槽中数据转交给集群中的其他节点负责。

高性能

Redis集群采用无代理模式,客户端发送的所有命令都会直接交由节点执行,并且对于经过优化的集群客户端来说,客户端发送的命令在绝对大多数下都不需要实施转向,或者仅需要转向一次。因此在Redis集群中执行命令的性能与单机Redis服务器上执行命令的性能非常接近。

简单易用

Redis为集群提供了丰富的工具和命令,用户可以通过工具快速创建测试用集群,并在之后通过命令行命令或者Redis内置的集群命令管理和控制集群。

搭建集群

要使用Redis集群,首先要做的就是搭建一个完整的集群,Redis为此提供两种方法:一种是使用源码附带的集群自动搭建程序。另一种则是使用配置文件手动配置。

快速搭建集群

Redis在源码中附带了集群自动搭建程序 create-cluster,这个程序可以快速构建起一个完整可用的集群以供测试。create-cluster 程序位于源码的 utils/create-cluster/create-cluster 位置,通过不给定任何参数来执行它:

./create-cluster

启动各个Redis节点

不给定任何参数,可以看到该程序的具体用法,执行 start 命令来创建6个节点,这6个节点的IP地址都是本机,而端口号则为30001~30006:

./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

创建集群

接着,我们需要使用 create 命令,把上述6个节点组合成一个集群,其中包含3个主节点和3个从节点:

./create-cluster create

在成功构建起集群之后,就可以使用客户端来连接使用集群了,Redis自带的客户端 redis-cli 在连接集群节点而不是单机Redis服务器时,我们需要向 redis-cli 提供 c(cluster,集群)参数以指示客户端进入集群模式,并通过 h(host,主机地址)参数或 p (port,端口号)参数指定集群中的某个节点作为入口:

-- 连接本机端口 30001 上的集群节点,并向它发送 PING命令
redis-cli -c -p 30001
127.0.0.1:30001> PING
PONG

如果接收到命令请求的节点并非负责处理命令所指键的节点,那么客户端将根据节点提示的转向信息再次向正确的节点发送命令请求,Redis集群把这个动作称为 “转向”

-- 发送至节点30001的命令请求被转向到节点30002
127.0.0.1:30001> SET msg "hello"
-> Redirected to slot [6257] located at 127.0.0.1:30002
OK

过程如下图所示:

在这里插入图片描述
如果客户端发送的命令请求,正好是由接收命令请求的节点负责处理,那么节点将直接返回命令的执行结果,就如单机Redis服务器一样:

-- 因为键number所属的槽 7743 正好是由节点 30002 负责
-- 所以命令请求可以在不转向的情况下直接运行
127.0.0.1:30002> SET number 10086
OK

关闭集群并清理节点

在使用完这个测试集群之后,我们可以通过以下命令关闭集群并清理各个集群节点的相关信息:

./create-cluster stop
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006

手动搭建集群

使用create-cluster程序快速搭建Redis集群虽然方便快捷,但是由于该程序搭建的Redis集群不具备配置文件、主从节点数量固定以及槽分配模式固定等原因,这些快速搭建的集群通常只能够用于测试。为了搭建真正能够在生产环境中使用的Redis集群,我们需要创建相应的配置文件,并使用集群管理命令对集群进行配置和管理。

为了保证集群的各项功能可以正常运作,一个集群至少需要3个主节点和3个从节点。不过为了与之前使用的 create-cluster 程序搭建的集群区别开来,这次我们将大家一个由5个主节点和5个从节点组成的Redis集群。

创建节点文件夹

首先,创建出10个文件夹,用于存放相应节点的数据以及配置文件:

mkdir my-cluster
cd my-cluster/
mkdir node1 node2 node3 node4 node5 node6 node7 node8 node9 node10

创建节点配置文件

接着,我们需要在每个节点文件夹中创建一个包含以下内容的 redis.conf 配置文件:

cluster-enabled yes
port 30001

其中,cluster-enabled 选项的值为 yes 表示将 Redis 实例设置成集群节点而不是单机服务器,而 port 选项则用于为每个节点设置不同的端口号。本例中,我们为10个节点分别设置了从 30001~30010的端口号。

启动各个节点

设置好相应的配置文件之后,我们需要通过以下命令,陆续启动各个文件夹中的节点:

redis-server redis.conf

创建集群

虽然我们启动了10个Redis服务器节点,但是由于这些节点并未互联互通,所以它们都只在自己的集群之内。因此,接下来要做的就是连接10个集群节点并为它们分配

redis-cli --cluster  create   127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 
127.0.0.1:30005 127.0.0.1:30006 127.0.0.1:30007 127.0.0.1:30008 127.0.0.1:30009 
127.0.0.1:30010 --cluster-replicas 1

redis-cli --cluster 是 Redis 客户端附带的集群管理工具,它的 create 子命令接受任意多个节点的IP地址和端口号作为参数,然后使用这些节点组建起一个Redis集群。create 子命令允许使用多个可选参数,其中可选参数 –cluster-replicas 用于指定集群中每个主节点的从节点数量。上面的例子中,该参数的值为1,表明我们要为每个主节点设置一个从节点。

上述命令会自动开始分派槽的工作,当出现以下内容时,输入 yes 并回车,create 命令就会执行实际的分配和指派工作:

Can I set the above configuration?(type 'yes' to accept):yes

当执行完分派工作后集群设置就已经设置完毕,并且 16384 个槽也已经全部分配给了各个节点,如下图所示:
在这里插入图片描述

散列标签

在默认情况下,Redis将根据用户输入的整个键计算出该键所属的槽,然后将键存储到相应的槽中。但是在某些情况下,出于性能考虑,或者为了在同一个节点上对多个相关联的键执行批量操作,我们也会想要将一些原本不属于同一个槽的键放到相同的槽里面。

为了满足这一要求,Redis为用户提供了 散列标签(hash tag)功能,该功能会找出键中第一个被大括号 {} 包围并且 非空 的字符串子串,然后根据子串计算出该键所属的槽。这样一来,即使两个键原本不属于同一个槽,但只要它们拥有相同的被包围子串,那么程序计算出的散列值就是一样的,因此Redis集群就会把它们存储到同一个槽中。

示例

比如,假设我们现在有一批数据,它们全部以 user:: 为前缀,后跟用户ID,其中键 user::10086user::10087 原本应该分别属于不同的槽:

-- 使用 cluster keyslot 命令查看给定键所属的槽
127.0.0.1:30002> cluster keyslot user::10086
(integer) 14982
127.0.0.1:30002> cluster keyslot user::10087
(integer) 10919

但如果我们对这两个键使用散列标签功能,即使用大括号去包围它们的 user 子串,让Redis集群只根据这一子串计算键的散列值,那么这两个键将被分配到同一个槽:

127.0.0.1:30002> cluster keyslot {user}::10086
(integer) 5474
127.0.0.1:30002> cluster keyslot {user}::10087
(integer) 5474
提示

关于散列标签的使用,有以下两点需要注意:
1) 虽然从逻辑上讲,我们把 user::10086{user}::10086 看作同一个键,但由于散列标签只是Redis集群对键名的一种特殊解释,因此这两个键在实际中并不相同,它们可以同时存在于数据库,并不会引发任何键冲突。
2) 散列标签只会根据键名中第一个被大括号包围的非空子串来计算散列值,而键名中其他被包围的子串或者被包围空串则会被忽略。

打开/关闭从节点的读命令执行权限

在使用单机Redis服务器时,用户可以为主服务器创建从服务器,然后通过让从服务器处理读请求来提升整个系统处理读请求的能力。但是在集群中,从节点在默认情况下只会对主节点进行复制,但是不会处理客户端发送的任何命令请求:每当从节点接收到命令请求时,它只会向客户端发送转向消息,引导客户端转向某个主节点重新发送命令请求。

示例
对于主节点 30001 的从节点 30005来说,如果客户端向从节点发送以下命令,那么节点将把客户端转向至主节点,然后再执行命令:

127.0.0.1:30005> GET num
-> Redirected to slot [2765] located at 127.0.0.1:30001
"10086"
127.0.0.1:30001>

但是在某些情况下,可能需要让从节点也能处理读请求,从而提高整个集群处理请求的能力。为此,Redis向用户提供了 READONLYREADWRITE 命令,它们可以临时打开或关闭客户端在从节点上执行读命令的权限。

READONLY:打开读命令执行权限

READONLY

使用 READONLY 命令可以让客户端临时获得在从服务器上执行读命令的权限。这个命令执行成功后返回OK。

127.0.0.1:30005> READONLY
OK
127.0.0.1:30005> GET num
"10086"

READONLY 命令只对执行了该命令的客户端有效,并不会影响正在访问相同节点的其他客户端。

READWRITE:关闭读命令执行权限

在使用 READONLY 命令打开客户端低从节点的读命令执行权限后,可以通过以下命令来关闭该权限:

READWRITE

127.0.0.1:30005> REWRITE
OK
127.0.0.1:30005> GET num
-> Redirected to slot [2765] located at 127.0.0.1:30001
"10086"
127.0.0.1:30001>

集群管理工具 redis-cli

Redis官方为管理集群提供了两种工具,一种是 redis-cli 客户端附带的集群管理程序,另一种则是 Redis内置的集群管理命令。

通过在执行 redis-cli 的时候给定 cluster 选项来启动,输入 help 子命令来查看该程序支持的子命令及其格式:

redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

创建集群

cluster 选项的 create 子命令运行用户根据已有节点创建出一个集群。用户只需要在命令中依次给出各个节点的IP地址和端口号,命令就会将它们聚合到一个集群中,并根据节点的数量将槽平均指派给它们负责:

redis-cli --cluster create <ip1>:<port1> ... <ipN>:<portN>

通过以下选项,用户还可以在创建集群的同时,决定要为每个主节点配备多少个从节点:

--cluster-replicas <num>

create命令首先会检查给定的所有节点,然后根据节点数量以及指定的从节点数量规划出一个集群配置并将其打印出来,如果我们觉得没问题,就可以在命令行中输入 yes 来接受它,这样命令就会根据该配置构建出集群。

查看集群信息

成功构建集群之后,可以通过 cluster 选项的 info 子命令查看集群的相关信息。为了找到指定的节点,用户需要向命令提供集群中任意一个节点的地址作为参数:

info <ip>:<port>

该命令返回结果包含:

  • 主节点的地址以及运行ID,它们存储的键数量以及负责的槽数量,以及它们拥有的从节点数量。
  • 集群包含的数据库键数量以及主节点数量,以及每个槽平均存储的键数量。

检查集群

通过 cluster 选项的 check 子命令,用户可以检查集群的配置是否正确,以及全部 16384 个槽是否已经完全指派给了主节点。与 info 子命令一样,check 子命令也接受集群中任意一个节点地址为参数:

check <ip>:<port>

修复槽错误

当集群在重分片、负载均衡或者槽迁移的过程中出现错误时,执行 cluster 选项的 fix 子命令,可以让操作涉及到的槽重新回到正常状态:

fix <ip>:<port>

fix 命令会检查各个节点处于 “导入中”“迁移中” 状态的槽,并根据情况,将槽迁移至合理的一方。

重分片

通过 cluster 选项的 reshard 子命令,可以将指定数量的槽从原节点迁移至目标节点,被迁移的槽将交由后者负责,并且槽中已有的数据也会从原节点转移至目标节点:

reshard <ip>:<port>
--cluster-from <id> #源节点的ID
--cluster-to <id> # 目标节点的ID
--cluster-slots <num> # 需要迁移的槽数量
--cluster-yes # 直接确认
--cluster-timeout <time> # 迁移的最大时限
--cluster-pipeline <yes/no> # 是否使用流水线

负载均衡

cluster 选项的 rebalance 子命令允许用户在有需要的时候重新分配各个节点负责的槽数量,从而使得各个节点的负载压力趋于平衡:

rebalance <ip>:<port>

rebalance 命令提供了很多可选项,它们可以让用户更准确的控制负载均衡操作的具体行为。

--cluster-weight <node_id1>=<weight1> <node2_id2>=<weight2> ...

使用可选项 cluster-weight 可以为各个节点设置权重,权重较大的节点将被指派更多的槽。

--cluster-use-empty-masters

cluster-use-empy-masters 可选项可以用来为尚未被指派槽的空节点也分配相应的槽。

rebalance 命令在执行时会根据各个节点目前负责的槽数量以及用户给定的权重计算出每个节点应该负责的数量(期望槽数量),如果这个槽数量与节点目前负责的槽数量之间的比率超过了指定的阈值,那么就会触发槽的重分配操作。这个值默认为 2.0,可以通过以下选项来设定这个值。

--cluster-threshold <value>

除了上述选项之外,用户还可以通过以下选项来设置负载均衡操作是否使用流水线:

--cluster-pipeline <yes/no>

或者使用以下可选项设置负载均衡操作的最大可执行时限:

--cluster-timeout <time>

如果想要同时多个节点实施调整,可以使用如下选项:

--cluster-simulate

添加节点

cluster 选项的 add-node 子命令允许用户将给定的新节点添加到已有的集群中:

redis-cli --cluster add-node <new_host>:<new_port> <existing_host>:<existing_port>

在默认情况下,add-node 命令新添加的节点将作为主节点。如果想要添加新的节点为从节点,那么可以在执行命令的同时,通过给定以下两个选项来将新节点设置为从节点:

--cluster-slave
--cluster-master-id <id>

其中 cluster-master-id 用于指定从节点将要复制的主节点,参数id为主节点的ID。

移除节点

当不在需要某个节点的时候,可以通过cluster选项的 del-node 子命令来移除该节点:

redis-cli --cluster dle-node <ip>:<port> <node_id>

其中命令的 ipport 参数用于指定集群中的某个节点为入口,而 node_id 为将要被移除的节点ID。

执行命令

通过 cluster 选项的 call 子命令,用户可以在整个集群的所有节点上执行给定的命令:

redis-cli --cluster call <ip>:<port> <command> arg arg ... arg

其中 ipport 参数用于指定集群的入口地址。

设置超时时间

通过 cluster 选项的 set-timeout 子命令,用户可以为集群的所有节点重新设置 cluster-node-timeout 选项的值:

set-timeout <host>:<port> <milliseconds>

导入数据

用户可以通过 cluster 选项的 import 子命令,将给定单机Redis服务器的数据导入集群中:

import <node-host>:<port> # 集群入口节点的IP地址和端口号
--cluster-from <server-host>:<port> # 单机服务器的IP地址和端口号
--cluster-copy # 使用复制导入
--cluster-replace # 覆盖同名键

在默认情况下,import 命令在向集群导入数据的同时,还会删除单机服务器中源数据。如果用户想要保留单机服务器中的数据,那么可以在执行命令的同时给定 –cluster-copy 选项。

此外,在导入数据的过程中,如果命令发现将要导入的键在集群数据库中已经存在(同名键冲突),那么命令在默认情况下将中断导入操作。如果用户想要使用导入的键去覆盖集群中已有的同名键,那么可以在执行命令的同时给定 –cluster-replace 选项。

集群管理命令

除了集群管理程序之外,Redis还提供了一簇以 CLUSTER 开头的集群管理命令,这些命令可以根据它们的作用分为集群管理命令和槽管理命令,前者管理的是集群及其节点,而后者管理的则是节点的槽分配情况。

CLUSTER MEET:将节点添加至集群

通过以下命令,可以将给定的节点添加到已有的集群中:

CLUSTER MEET ip port

CLUSTER MEET 命令在向给定节点发送完握手信息之后将返回OK,过程如下图所示:

在这里插入图片描述

添加多个节点

当用户执行 CLUSTER MEET 命令,尝试将一个给定的节点添加到当前节点所在的集群时,如果给定节点已经位于一个包含多个节点的集群当中,那么不仅给定节点会被添加到当前节点所在集群,给定节点原集群内的其他节点也会自动合并到当前集群中。

在这里插入图片描述

CLUSTER NODES:查看集群内所有节点的相关信息

用户可以通过执行以下命令,查看集群内所有节点的相关信息:

CLUSTER NODES

CLUSTER NODES 命令的结果通常由多个行组成,每个行都记录了一个节点的相关信息,行中的各项信息则由空格分隔,具体各项的说明如下表:

在这里插入图片描述
节点的角色和状态

在这里插入图片描述
槽的数字以及状态
在这里插入图片描述

CLUSTER MYID:查看当前节点的运行ID

当用户想要知道客户端正在连接的节点的运行ID,可以执行以下命令:

CLUSTER MYID

因为不少集群命令都需要使用节点ID作为参数,所以当我们需要对正在连接的节点执行某个使用运行ID作为参数的操作时,就可以使用该命令。

CLUSTER INFO:查看集群信息

用户可以通过执行CLUSTER INFO命令,查看与集群以及当前节点有关的状态信息:

CLUSTER INFO

命令返回的结果中各项的含义如下表所示:
在这里插入图片描述

CLUSTER FORGET:从集群中移除节点

当用户不需要某个节点时,通过执行以下命令将其移除:

CLUSTER FORGET node-id

这个命令接受节点的运行ID作为参数,并在成功执行之后返回OK作为结果。

CLUSTER MEET 命令添加节点消息不一样,CLUSTER FORGET 命令引发的节点移除消息并不会通过Gossip协议传播至集群中的其他节点:当用户向一个节点发送 CLUSTER FORGET 命令,让它去移除一个节点时,接收到命令的节点只是暂时屏蔽了用户指定的节点,但这个被屏蔽的节点对于集群中的其他节点仍然是可见的。因此,要让集群真正地移除一个节点,用户必须向集群中的所有节点都发送相同的 CLUSTER FORGET命令,并且这一动作必须在60s之内完成,否则被暂时屏蔽的节点就会因为Gossip 协议的作用被重新添加到集群中。

可以使用 Redis集群管理程序的 call 命令来批量执行该操作:

redis-cli --cluster call 127.0.0.1:30001 CLUSTER FORGET 262ab2212fe2fdc223211689bdcdaa265ff

CLUSTER REPLICATE:将节点变为从节点

CLUSTER REPLICATE 命令接受一个主节点ID作为参数,并将执行该命令的节点变成给定主节点的从节点:

CLUSTER REPLICATE <master-id>

用户给定的主节点必须位于集群中,此外,根据当前节点角色的不同,命令的执行时的情况也不同:

  • 如果当前节点是一个主节点,那么它必须是一个没有被指派任何槽的节点,并且它的数据库中也不能有任何数据,这样它才能转换成一个从节点。
  • 如果当前节点已经是一个从节点,那么它将清空数据库中已有的数据,并开始复制用户给定的节点。

注意:在集群模式下,从节点只能对主节点进行复制,而在主从复制模式下,从节点也可以作为其他节点的主节点。

CLUSTER REPLICAS:查看给定节点的所有从节点

CLUSTER REPLICAS 命令接受一个节点ID作为参数,然后返回该节点属下所有从节点的相关信息:

CLUSTER REPLICAS node-id

在Redis 5.0版本之前,使用 CLUSTER SLAVES 命令可以完成相同的工作。

CLUSTER FAILOVER:强制故障转移

用户可以通过向从节点发送以下命令,让它发起一次自身主节点的故障转移操作:

CLUSTER FAILOVER

因为接收到该命令的从节点会先将自身的数据库更新至与主节点完全一致,然后再执行后续的故障转移操作,所以这个过程不会丢失任何数据。

用户用户尝试向主节点发送该命令,则会返回一个错误:

-- 尝试向主节点发送CLUSTER FAILOVER命令
127.0.0.1:30005> CLUSTER FAILOVER
(error) ERR You should send CLUSTER FAILOVER to a replica

用户可以通过可选的 FORCE 选项和 TAKEOVER 选项来改变 CLUSTER FAILOVER 命令的行为:

CLUSTER FAILOVER [FORCE | TAKEOVER]

在给定了 FORCE 选项时,从节点将在不尝试与主节点进行握手的情况下,直接实施故障转移操作。这种做法可以让用户在主节点已经下线的情况下立即开始故障转移。

但是如果用户给定了 TAKEOVER 选项,那么从节点将在不询问集群中的其他节点意见的情况下,直接对主节点实施故障转移。

CLUSTER RESET:重置节点

可以通过在节点上执行 CLUSTER RESET 命令来重置该节点,以便在集群中复用该节点:

CLUSTER RESET [SOFT | HARD]

这个命令接受SOFTHARD 两个可选参数,用于指定重置操作的具体行为(软重置和应重置)。默认为 SOFT 选项。

CLUSTER RESET 命令在执行时,将对节点执行以下操作:

  • 遗忘该节点的所有槽,并清空节点内部的槽-节点映射表;
  • 如果执行该命令的节点是一个从节点,那么将它转换成一个主节点;
  • 如果执行的是硬重置,那么为节点创建一个新的运行ID;
  • 如果执行的是硬重置,那么将节点的纪元和配置纪元都设置为 0;
  • 通过集群节点配置文件的方式,将新的配置持久化到配置文件中;

槽管理命令

CLUSTER SLOTS:查看槽与节点之间的关联信息

执行以下命令可以查看各个槽与节点之间的关联信息:

CLUSTER SLOTS

命令会返回一个嵌套数组,数组中的每个项都记录了一个槽范围,以及处理者的相关信息,其中包括:

  • 槽范围的起始槽;
  • 槽范围的结束槽;
  • 负责处理这些槽的主节点信息;
  • 零个或任意多个主节点属下的从节点信息;

其中每一项节点信息都包含以下内容:

  • 节点的IP地址;
  • 节点的端口号
  • 节点的运行ID

CLUSTER ADDSLOTS:把槽指派给节点

通过在节点上执行以下命令,可以将给定的一个或任意多个槽指派给当前节点进行处理:

CLUSTER ADDSLOTS slot [slot ... ]

需要注意的是,CLUSTER ADDSLOTS 只能对尚未被指派的槽执行指派操作,如果用户给定的槽已经被指派,那么将返回一个错误:

127.0.0.1:30001> CLUSTER ADDSLOTS 0 1 2 3 4 5
(error) ERR Slot 0 is already busy

CLUSTER DELSLOTS:撤销对节点的槽指派

在使用 CLUSTER ADDSLOTS 命令将槽指派给节点负责之后,可以通过执行以下命令撤销对节点的槽指派:

CLUSTER DELSLOTS slot [slot ... ]

需要注意的是,在执行 CLUSTER DELSLOTS 命令时,指定的槽必须是已经被指派给当前节点的,否则将返回一个错误:

127.0.0.1:30001> CLUSTER DELSLOTS 0 1 2 3 4 5
(error) ERR Slot 0 is already unassigned

CLUSTER FLUSHSLOTS:撤销对节点的所有槽指派

通过在一个节点执行以下命令,可以撤销对该节点的所有槽指派,让它不再负责处理任何槽:

CLUSTER FLUSHSLOTS

需要注意的是,在执行 CLUSTER FLUSHSLOTS 命令之前,必须确保数据库为空,否则节点将拒绝执行该命令。

CLUSTER KEYSLOT:查看键所属的槽

通过给定键执行以下命令,可以指定该键所属的槽:

CLUSTER KEYSLOT key

CLUSTER COUNTKEYSINSLOT:查看槽包含的键数量

执行以下命令,可以查看给定槽包含的键数量:

CLUSTER COUNTKEYSINSLOT slot

在使用 CLUSTER COUNTKEYSINSLOT 命令时需要特别注意一点,该命令只会在执行该命令的节点中进行计数,如果给定的槽并不属于该节点处理,那么将找不到任何属于给定槽的键,将返回0作为结果。

CLUSTER GETKEYSINSLOT:获取槽包含的键

执行以下命令,获取指定槽包含的键:

CLUSTER GETKEYSINSLOT slot count

count 参数用于指定命令允许返回的最大键数量。与 CLUSTER COUNTKEYSINSLOT 命令一样,CLUSTER GETKEYSINSLOT 命令在尝试获取包含的键时也只会在执行该命令的节点中进行查找:如果执行命令的节点并不是负责处理给定槽的节点,那么命令将无法找到任何可以返回的键。

CLUSTER SETSLOT:改变槽的状态

CLUSTER SETSLOT 命令拥有4个子命令,它们可以改变给定槽节点中的状态,从而实现节点之间的槽迁移以及集群重分片:

CLUSTER SETSLOT slot IMPORTING source-node-id
CLUSTER SETSLOT slot MIGRATING destination-node-id
CLUSTER SETSLOT slot NODE node-id
CLUSTER SETSLOT slot STABLE

导入槽

通过在节点上执行 IMPORTING 子命令,用户可以让节点的指定槽进入 “导入中” (imporing)状态,处于该状态的槽允许从源节点中导入槽数据:

CLUSTER SETSLOT slot IMPORTING source-node-id

该命令在执行成功后返回OK。

迁移槽

通过在节点上执行 MIGRATING 子命令,用户可以让节点的指定槽进入 “迁移中”(migrating)状态,处于该状态的槽允许向目标节点转移槽数据:

CLUSTER SETSLOT slot MIGRATING destination-node-id

将槽指派给节点

在将槽数据从源节点迁移至目标节点之后,用户可以在集群的任一节点执行以下命令,正式将槽指派给目标节点负责:

CLUSTER SETSLOT slot NODE node-id

集群中的其中一个节点执行了 NODE 子命令之后,对给定的槽的新指派信息将被传播至整个集群,目标节点在接收到这一信息之后将移除给定槽的 "迁移中"状态。

移除槽的导入/迁移状态

通过执行以下命令,用户可以清除节点指定槽的 “导入中” 或 **“迁移中”**状态:

CLUSTER SETSLOT slot STABLE

该命令在成功执行之后将返回OK作为结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值