前文中我们介绍过了Redis的三种集群方案,没有了解过的同学可以自行前往。今天要介绍的Redis的亲儿子Cluster相关的命令。
最早可用版本:3.0.0
时间复杂度:O(N),N是参数中hash的slot总数
这个命令是用来将指定的slot分配给接收命令的机器。如果执行成功,该机器就拥有这些slot,并会在集群中进行广播。
需要注意的是:
这个命令的应用场景有两种:
如果一个节点为自己分配了一个slot集合,它会将这个信息在心跳包的header里传播出去。然而其他节点只有在他们的slot没有被其他节点绑定或者没有作为新节点传播时才会接收这个信息。
这意味着这个命令应该仅通过redis集群应用管理客户端,例如redis-trib。如果这个命令使用了错误的上下文会导致集群处于错误的状态或者导致数据丢失,因此这个命令需要谨慎使用。
最早可用版本:3.0.0
时间复杂度:O(N),N是故障报告的数量
这个命令返回指定节点的故障报告。故障报告是Redis Cluster用来将节点从PFAIL状态转换到FAIL状态的方式。
更多的细节:
该节点返回当前节点的故障报告数,该计数值不包括当前节点。
最早可用版本:3.0.0
时间复杂度:O(1)
这个命令返回指定Redis集群的slot的key的数量。该命令只查询连接节点的本地数据集,如果指定的slot被分配在别的节点上,就会返回0。
最早可用版本:3.0.0
时间复杂度:O(N),N是slot参数的数量
在Redis Cluster中,每个节点都会知道哪些主节点正在负责哪些slot。
DELSLOTS命令使一个特定的节点忘记主节点负责的hash slot。在这之后,这些hash slot就被认为是未绑定状态的。需要注意的是:
最早可用版本:3.0.0
时间复杂度:O(1)
用法:CLUSTER FAILOVER [FORCE|TAKEOVER]
该命令只能在集群slave节点执行,让slave节点进行一次人工的故障切换。
人工故障切换时一种常规操作,而不是真的出了故障。当我们希望当前的master和它的slave进行一次安全的主备切换时,流程如下:
该命令有两个选项:FORCE和TAKEOVER,下面我们来解释一下这两个选项的作用。
FORCE选项:slave节点不会和master做协商,直接从上述第4步开始进行故障切换
TAKEOVER选项:忽略集群一致验证的人工故障切换。有时会出现集群中master节点不够的情况,此时我们就需要使用TAKEOVER选项将slave批量切换为master节点。
TAKEOVER选项实现了FORCE选项的所有功能,当一个slave节点收到CLUSTER FAILOVER TAKEOVER命令时会有如下操作:
最早可用版本:3.0.0
时间复杂度:O(1)
这个命令用于移除指定node-id的node。如果一个node属于某个集群,那么集群中其他节点都会知道它的存在,因此CLUSTER FORGET命令会发送给集群中剩下的所有节点。
然而这个命令并不是简单的把node从node表中删除,它还禁止这个节点再次被添加进集群。
假设我们有4个节点:A、B、C、D,此时我们删除D,如果不把D加入禁用列表,就会发生以下情况:
这样我们的删除命令就无效了,除非我们在各个节点没有互相发送心跳包的时候同时给他们发送CLUSTER FORGET命令。但这显然不合理,所以我们实际上应该这样做:
在一些特殊情况下,这个命令会无法执行并返回一个错误。
最早可用版本:3.0.0
时间复杂度:O(log(N)),N是请求的key的数量
用法:CLUSTER GETKEYSINSLOT slot count
这个命令返回连接节点指定的slot里key的列表。key的最大数量由count指定。所以这个API可以用作key的批处理。这个命令的主要用途是在做rehash的过程中,把slot从一个节点移动到另外一个节点。
最早可用版本:3.0.0
时间复杂度:O(1)
提供Redis集群的相关信息。
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:2
cluster_stats_messages_sent:1483972
cluster_stats_messages_received:1483968
最早可用版本:3.0.0
时间复杂度:O(N),N是key的字节数
返回一个整数,用于标识指定键所散列到的slot。这个命令主要是用于调试和测试。因为它通过一个API来暴露Redis底层hash算法的实现。
最早可用版本:3.0.0
时间复杂度:O(1)
CLUSTER MEET命令用来连接不同Redis节点,以进入工作集群。
有一点基本的共识是节点之间互相都是不信任的,并且被认为是未知节点。以避免因为系统管理错误或者网络地址被修改而导致多个集群的节点混合成一个。
因此,为了使给定的节点能接收另一个节点到Redis Cluster中,有两种方法:
Redis Cluster是一个完整的网络,在创建网络时,并不需要给所有节点发送CLUSTER MEET命令,只要发送了足够的命令,保证每个节点都有已知节点,其他的事情就交给gossip来处理了。
最早可用版本:3.0.0
时间复杂度:O(N),N是集群中的节点数
该命令提供了当前连接节点所属集群的配置信息。信息格式和Redis集群在磁盘上存储使用的序列化格式完全一样。
通常,如果你想知道hash slot与节点的关联关系,你应该使用CLUSTER SLOTS命令。CLUSTER NODES主要用于管理任务,调试和配置监控。redis-trib也会使用该命令管理集群。
命令的结构如下:
<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>
最早可用版本:5.0.0
时间复杂度:O(1)
该命令会列出主节点的从节点列表。输出格式与CLUSTER NODES格式相同。
若特定节点状态未知,或在接收命令节点不是主节点,则命令失败。
最早可用版本:3.0.0
时间复杂度:O(1)
该命令重新配置一个节点成为指定master的从节点。如果收到命令的节点是empty master,那么该节点的角色将由master转换为slave。
一旦一个节点变成另一个master的slave,不需要将这一变化告知集群内的其他节点,心跳消息会把最新配置同步给其他节点。
一个从节点接收这个命令需要满足以下条件:
如果收到命令的节点不是slave而是master,只有在如下情况下,命令才会执行成功:
最早可用版本:3.0.0
时间复杂度:O(N),N是已知节点的数量
根据reset类型(hard或soft)重置一个集群的节点。当主节点hold住一个或多个key时,这个命令无法执行,必须先使用FLUSHALL命令删除所有的key。该命令的影响是:
最早可用版本:3.0.0
时间复杂度:O(1)
强制保存配置nodes.conf到磁盘。该命令主要用于nodes.conf文件丢失或删除时重新生成文件。
最早可用版本:3.0.0
时间复杂度:O(1)
该命令为一个全新的节点设置config epoch,只在以下情况有效:
人工修改一个节点的config epoch是不安全的,但是当epoch产生冲突时,自动解决又非常慢,这时可以使用这个命令进行人工干预。
最早可用版本:3.0.0
时间复杂度:O(1)
用法:CLUSTER SETSLOTslot IMPORTING|MIGRATING|STABLE|NODE [node-id]
CLUSTER SETSLOT根据子命令修改节点的hash slot状态:
该命令通常在rehash时使用,将源节点的hash slot置为migrating状态,目标节点的hash slot置为importing状态。
该命令将slot设置为migrating状态,接下来要处理的key如果存在,命令正常执行。如果不存在,则节点发出ASK重定向,让客户端去请求destination-node节点。对于批量key处理,如果只有部分节点存在,则返回TRYAGAIN错误。
这是MIGRATING的反操作,接下来涉及该slot的命令都被拒绝,并产生一个MOVED重定向,除非命令跟着一个ASK重定向。
最早可用版本:3.0.0
时间复杂度:O(1)
该命令会列出指定master节点的所有slave节点,格式和CLUSTER NODES相同。当指定节点未知或不是master时,命令返回一个错误。
最早可用版本:3.0.0
时间复杂度:O(N),N是slot的总数
该命令返回slot和Redis实例的映射关系。这个命令对客户端很有用,在执行命令时,客户端会根据这个命令返回的信息去连接正确的节点执行命令。
每个节点的信息结构如下:
最早可用版本:3.0.0
时间复杂度:O(1)
开启与Redis Cluster从节点连接的读请求
通常从节点将重定向客户端到认证过的主节点,以获取在指定命令中所涉及的slot,然而客户端可以通过READONLY命令将从节点设置为只读模式。
READONLY告诉Redis Cluster从节点愿意读取可能过时的数据。
当连接处于只读模式,只有操作涉及到该从节点的主节点不服务的键时,集群将会发送一个重定向给客户端,这可能是因为:
最早可用版本:3.0.0
时间复杂度:O(1)
禁止与Redis Cluster从节点连接的读请求。
默认情况下禁止Redis Cluster从节点的读请求,但是可以使用READONLY去在每一个连接的基础上改变这个行为,READWRITE命令将连接的只读模式重置为读写模式。