[关闭]
@phper 2015-12-21T15:14:34.000000Z 字数 15877 阅读 17757

Redis 3.0.5 集群的命令、使用、维护

redis


前言

上一篇中,对redis cluster的有了较为深入的实践,并且一整套都实践了,redis cluster 确实挺好用,随着版本的更新,它会越来越成熟和稳定,一定是未来的方向。

这一篇对后续的一些尾巴来学习下,包括 CLUSTER * 一系列命令,以及容灾性的数据迁移,以及在php的使用。

cluster命令

redis 有很多命令,同意,加入到cluster后,也有一些列的命令,现在一一来看下 (http://redis.io/commands/cluster-addslots):

  • CLUSTER INFO 打印集群的信息
  • CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
    //节点
  • CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
  • CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
  • CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
  • CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
  • CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
  • CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
  • CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
  • CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点。
  • CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
  • CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
  • CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
    //键
  • CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
  • CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
  • CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
    //新增
  • CLUSTER SLAVES node-id 返回一个master节点的slaves 列表

我们来一个一个的实践一下。

我按照上一篇的理论实践知识的基础上,再次搭建了一个集群,这次运行了8个端口,用实际的ip代替127.0.0.1:

  1. redis-trib.rb create --replicas 1 192.168.33.13:7000 192.168.33.13:7001 192.168.33.13:7002 192.168.33.13:7003 192.168.33.13:7004 192.168.33.13:7005 192.168.33.13:7006 192.168.33.13:7007 192.168.33.13:7008

这个命令过后,就会创建一个redis cluster 集群,包括4个Master5个slave。OK,现在我们来一一试一下上述的CLUSTER *命令。

cluster info

这个命令是显示当前连接的集群的各种信息。

  1. [root@web3 7008]# redis-cli -c -p 7000
  2. 127.0.0.1:7000> cluster info
  3. cluster_state:ok
  4. cluster_slots_assigned:16384
  5. cluster_slots_ok:16384
  6. cluster_slots_pfail:0
  7. cluster_slots_fail:0
  8. cluster_known_nodes:9
  9. cluster_size:4
  10. cluster_current_epoch:9
  11. cluster_my_epoch:1
  12. cluster_stats_messages_sent:41417
  13. cluster_stats_messages_received:41417

cluster nodes

获取集群上的所有的节点信息。一般这个命令用的比较多。

  1. 127.0.0.1:7008> cluster nodes
  2. 8916fb224bbae3dc0291ca47e066dca0a62fba19 192.168.33.13:7004 slave 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 0 1446115185933 5 connected
  3. 404cf1ecf54d4df46d5faaec4103cfdf67888ad2 192.168.33.13:7001 master - 0 1446115184929 2 connected 4096-8191
  4. a035546046a607487436cf354c187b1712edf39b 192.168.33.13:7006 slave 6f5cd78ee644c1df9756fc11b3595403f51216cc 0 1446115184929 7 connected
  5. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1446115185432 3 connected 8192-12287
  6. f325d80e770ce319e4490818a49bad033cce942c 192.168.33.13:7008 myself,slave 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 0 0 9 connected
  7. e357bea5151b32a971c1f7a5788271106195f99a 192.168.33.13:7005 slave 404cf1ecf54d4df46d5faaec4103cfdf67888ad2 0 1446115186435 6 connected
  8. 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 master - 0 1446115184426 1 connected 0-4095
  9. 6650a95b874cacf399f174cb7a1b3802fc9bcef9 192.168.33.13:7007 slave 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 0 1446115184426 8 connected
  10. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1446115184426 4 connected 12288-16383

先看下每一条的结构:

<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

[节点id] [ip:端口] [标志(master、myself、salve)] [(- 或者主节id)] [ping发送的毫秒UNIX时间,0表示没有ping] [pong接收的unix毫秒时间戳] [配置-epoch] [连接状态] [槽点]

cluster meet

将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子

我们一般会用redis-trib.rb add-node 192.168.33.13:7009 192.168.33.13:7000 这种方式将一个节点加入队列。这是不需要连接redis-cli客户端。

其实,也可以用cluster meet命令,使用方法:

cluster meet <ip> <port>

我们来实践下,新建一个7009新节点,然后试着用这个命令加入到集群中来:

  1. 127.0.0.1:7000> cluster meet 192.168.33.13 7009
  2. OK
  3. 127.0.0.1:7000> cluster nodes
  4. ....
  5. 70795a3a7b93b7d059124e171cd46ba1683d6b7d 192.168.33.13:7009 master - 0 1446198910590 0 connected

现在7009已经成功加入到来集群当中,同样,还没有分配槽点给它。槽点分配在下面的命令中再仔细说。

cluster forget

从集群中移除一个节点。这个功能:

redis-trib del-node 192.168.33.13:7009 `<node-id>`

类似。同样,删除从节点,可以直接删除。删除主节点,要是有slot的话需要先迁移。

我们就来删除上一步加的这个192.168.33.13 7009,他是一个master 节点,但是里面还没分配slot,所以,我们删除试一下:

使用方法为:

 cluster forget <node_id>

开始:

  1. 127.0.0.1:7000> cluster forget 70795a3a7b93b7d059124e171cd46ba1683d6b7d
  2. OK

提示OK了,说明已经成功了。

再看下node 列表:

  1. 127.0.0.1:7000> cluster nodes
  2. a035546046a607487436cf354c187b1712edf39b 192.168.33.13:7006 slave 6f5cd78ee644c1df9756fc11b3595403f51216cc 0 1448519211988 7 connected
  3. f325d80e770ce319e4490818a49bad033cce942c 192.168.33.13:7008 slave 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 0 1448519212994 9 connected
  4. e357bea5151b32a971c1f7a5788271106195f99a 192.168.33.13:7005 slave 404cf1ecf54d4df46d5faaec4103cfdf67888ad2 0 1448519213499 6 connected
  5. 8916fb224bbae3dc0291ca47e066dca0a62fba19 192.168.33.13:7004 slave 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 0 1448519212994 5 connected
  6. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1448519211485 4 connected 12288-16383
  7. 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 myself,master - 0 0 1 connected 0-4095
  8. 6650a95b874cacf399f174cb7a1b3802fc9bcef9 192.168.33.13:7007 slave 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 0 1448519212493 8 connected
  9. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448519213499 3 connected 8192-12287
  10. 404cf1ecf54d4df46d5faaec4103cfdf67888ad2 192.168.33.13:7001 master - 0 1448519213499 2 connected 4096-8191

嗯。节点被移除了。

但是,其实是没有真正移除!不知道为啥。

  1. [vagrant@web3 7009]$ redis-trib.rb check 192.168.33.13:7009
  2. Connecting to node 192.168.33.13:7009: OK
  3. Connecting to node 192.168.33.13:7004: OK
  4. Connecting to node 192.168.33.13:7007: OK
  5. Connecting to node 192.168.33.13:7000: OK
  6. Connecting to node 192.168.33.13:7008: OK
  7. Connecting to node 192.168.33.13:7006: OK
  8. Connecting to node 192.168.33.13:7003: OK
  9. Connecting to node 192.168.33.13:7005: OK
  10. Connecting to node 192.168.33.13:7001: OK
  11. Connecting to node 192.168.33.13:7002: OK

进程也还在。

  1. [vagrant@web3 7009]$ ps -ef|grep redis
  2. root 3017 1 0 Nov23 ? 00:04:24 redis-server *:7009 [cluster]

而且也还能连上:

  1. [vagrant@web3 7009]$ redis-cli -p 7009 -c
  2. 127.0.0.1:7009> cluster nodes
  3. 70795a3a7b93b7d059124e171cd46ba1683d6b7d 192.168.33.13:7009 myself,master - 0 0 0 connected

日了狗了!!!!为啥啊。不管啦。继续。

cluster replicate

当前节点设置为 node_id 指定的节点的从节点

既然刚才没把7009删掉,那就用这个命令把它设置成7003的从节点吧。

使用方法为:

 cluster replicate <master_nodeId>

先用7009连接

  1. [root@web3 7009]# redis-cli -p 7009 -c
  2. 127.0.0.1:7009> cluster replicate 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce
  3. OK

OK了,说明成功了,我们再看下:

  1. 127.0.0.1:7009> cluster nodes
  2. ...
  3. b3917e10123230f2f5b0e2c948a7eeda7f88ccf7 192.168.33.13:7009 myself,slave 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 0 0 0 connected
  4. 357bea5151b32a971c1f7a5788271106195f99a 192.168.33.13:7003 master - 0 1448525721782 4 connected 12288-16383

OK,说明设置成功了,那我推出cliredis-trib看下:

  1. [root@web3 7009]# redis-trib.rb check 192.168.33.13:7000
  2. Connecting to node 192.168.33.13:7009: OK
  3. M: 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003
  4. slots:12288-16383 (4096 slots) master
  5. 2 additional replica(s)
  6. S: 6650a95b874cacf399f174cb7a1b3802fc9bcef9 192.168.33.13:7007
  7. slots: (0 slots) slave
  8. replicates 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce
  9. S: b3917e10123230f2f5b0e2c948a7eeda7f88ccf7 192.168.33.13:7009
  10. slots: (0 slots) slave
  11. replicates 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce

成功了!

cluster saveconfig

将节点的配置文件保存到硬盘里面.

试一下:

  1. 127.0.0.1:7009> cluster saveconfig
  2. OK

ok说明成功了,它会覆盖配置文件夹里的nodes.conf文件。这样做是为了某种情况下nodes文件丢失,这样就会生成一个最新的节点配置文件。

为了说明是新生成的,我们可以先删除掉7009目录下的nodes.conf文件:

  1. [root@web3 7009]# ll
  2. total 52
  3. -rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
  4. -rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
  5. -rw-r--r-- 1 root root 1269 Nov 26 08:50 nodes.conf
  6. -rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
  7. [root@web3 7009]# rm -rf nodes.conf
  8. [root@web3 7009]# ll
  9. total 42
  10. -rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
  11. -rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
  12. -rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
  13. [root@web3 7009]# redis-cli -p 7009 -c
  14. 127.0.0.1:7009> cluster saveconfig
  15. OK
  16. 127.0.0.1:7009> exit
  17. [root@web3 7009]# ll
  18. total 52
  19. -rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
  20. -rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
  21. -rw-r--r-- 1 root root 1269 Nov 26 08:51 nodes.conf
  22. -rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
  23. [root@web3 7009]#

cluster delslots

移除当前节点的一个或多个槽点。只能删除自己的节点,删除别人的没用。

因为master才会有槽点,所以,也是只能在master 节点上操作,在slave 操作也没用。

用法是:

cluster delslots slots1 slotes2 slots3

我们看一下槽点的分配情况:

  1. [root@web3 7009]# redis-cli -p 7009 -c cluster nodes| grep master
  2. 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 master - 0 1448529511113 1 connected 0-4095
  3. 404cf1ecf54d4df46d5faaec4103cfdf67888ad2 192.168.33.13:7001 master - 0 1448529511113 2 connected 4096-8191
  4. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448529509101 3 connected 8192-12287
  5. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1448529510609 4 connected 12288-16383

4台master,那就把16381 16382 16383 3个槽点给删掉。

开始:

  1. [root@web3 7009]# redis-cli -p 7003
  2. 127.0.0.1:7003> cluster delslots 16381 16382 16383
  3. OK
  4. 127.0.0.1:7003> cluster nodes
  5. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16380

看,7003的缺失少了3个节点。我们在看下cluster info

  1. 127.0.0.1:7003> cluster info
  2. cluster_state:fail
  3. cluster_slots_assigned:16381
  4. cluster_slots_ok:16381

只有16381个,确实少了4个。但是,注意:cluster_state:fail,集群失败了!!!

为什么呢?为什么删除了3个槽点就失败了呢。因为集群就是要满足所有的16364个槽点全部分配才会成功。所以。就失败了。

数据读取自然也会失败:

  1. 127.0.0.1:7003> get name
  2. (error) CLUSTERDOWN The cluster is down

我们用redis-trib检查一下,就知道了:

  1. [root@web3 7009]# redis-trib.rb check 192.168.33.13:7000
  2. ...
  3. ...
  4. [ERR] Nodes don't agree about configuration!
  5. >>> Check for open slots...
  6. >>> Check slots coverage...
  7. [ERR] Not all 16384 slots are covered by nodes.

那如何挽救呢?那就顺便看下下面的这个命令吧。

cluster addslots

将一个或多个槽(slot)指派(assign)给当前节点

用法是:

cluster addslots slots1 slotes2 slots3

那,我就用这个命令将上面删掉的3个槽点再加到7003上看看:

  1. 127.0.0.1:7003> cluster addslots 16381 16382 16383
  2. OK
  3. 127.0.0.1:7003>

OK了,看下是不是真的成功了:

  1. 127.0.0.1:7003> cluster nodes
  2. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16383

确实回来了,再看下集群状态,启动了没?

  1. 127.0.0.1:7003> cluster info
  2. cluster_state:ok

数据读取也正常了:

  1. 127.0.0.1:7003> get name
  2. -> Redirected to slot [5798] located at 192.168.33.13:7001
  3. "123"
  4. 192.168.33.13:7001>

cluster flushslots

移除当前节点所有槽点,让当前节点变成一个没有指派任何槽的节点。

我们还是拿7003来开刀吧。谁叫它在最后呢哈哈哈哈哈哈😄

  1. [root@web3 ~]# redis-cli -p 7003 -c
  2. 127.0.0.1:7003> cluster flushslots
  3. OK

ok了,理论上7003上的槽点应该都被移除了,它被悬空了,那么集群也应该失效了吧。看看:

  1. 127.0.0.1:7003> cluster info
  2. cluster_state:fail
  3. cluster_slots_assigned:12288
  4. cluster_slots_ok:12288

果然,移除了7003的所有4006个槽点,而且集群也失败了。用redis-trib看看。

  1. [root@web3 ~]# redis-trib.rb check 192.168.33.13:7000
  2. M: 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003
  3. slots: (0 slots) master
  4. 2 additional replica(s)
  5. [ERR] Nodes don't agree about configuration!
  6. >>> Check for open slots...
  7. >>> Check slots coverage...
  8. [ERR] Not all 16384 slots are covered by nodes.

可怜的7003上,已经没有任何slot了。

cluster setslot <\slot> node <\node_id>

将slot 指派给 node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。

刚才7003的全部slot已经空出来了,那用这个命令试一下转移。

开始搞,把12288-16384 这中间的几个节点移动到7002上去。

  1. 127.0.0.1:7003> cluster setslot 16383 node 6f5cd78ee644c1df9756fc11b3595403f51216cc
  2. OK
  3. 127.0.0.1:7003> cluster setslot 16382 node 6f5cd78ee644c1df9756fc11b3595403f51216cc
  4. OK

妈的,这个命令只能一个一个的移动,太变态了!!!

那看看。刚才移动的几个好了没?

  1. 127.0.0.1:7003> cluster nodes
  2. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448611602575 3 connected 8192-12287 16382-16383

果然,这2个slot被移动过来了。那,再移动下,把 16382 丢给 7000看看:

  1. 127.0.0.1:7003> cluster setslot 16382 node 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da
  2. OK

看看好了没?

  1. 127.0.0.1:7003> cluster nodes
  2. 3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 master - 0 1448611827539 1 connected 0-4095 16382

嗯,已经移动过来了。

cluster setslot <\slot> migrating <\destination-node-id>

本节点的槽 slot 迁移到 node_id 指定的节点中

试一下 16382 ,把她给移会去。可怜。。。

  1. [root@web3 7000]# redis-cli -p 7002 -c
  2. 127.0.0.1:7002> cluster setslot 16383 migrating 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce
  3. (error) ERR I'm not the owner of hash slot 16383

居然出错了!!!为啥啊。说 16383 不是 7002的槽点,无法移动。我了个叉,怎么会不是呢?

我看下:

  1. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 myself,master - 0 0 3 connected 8192-12287
  2. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1448619265700 4 connected 12288-16383

我了个擦的。确实不是啊。我明明已经把7003的槽点全部置空了啊,为什么这里还有啊。日了狗啊。

进 7003看看呢?

  1. [root@web3 7000]# redis-cli -p 7003 -c

看看:

  1. 127.0.0.1:7003> cluster nodes
  2. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected
  3. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448619384580 3 connected 8192-12287 16383

哔了狗了,居然2边的信息不一样!!!我擦。这尼玛。

我退出去check看看。

  1. [root@web3 7000]# redis-trib.rb check 192.168.33.13:7000

看看结果:

  1. M: 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003
  2. slots: (0 slots) master
  3. 2 additional replica(s)
  4. M: 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002
  5. slots:8192-12287 (4096 slots) master
  6. 1 additional replica(s)

我日了,16383 和 16382 用上面的setslot <slot> node <node_id>根本没移动过去,这尼玛。无语了。。。不管了吧。继续下面的命令学习吧。

cluster setslot <\slot> importing <\node_id>

从 node_id 指定的节点中导入 slot 到本节点。

上面的命令居然失效了,日了狗,现在看下这个命令呢?

  1. 127.0.0.1:7003> cluster setslot 16383 importing 6f5cd78ee644c1df9756fc11b3595403f51216cc
  2. OK
  3. 127.0.0.1:7003>

将 7002 上的 18383转移到 7003上来,居然成功了。好吧。😓

  1. 127.0.0.1:7003> cluster nodes
  2. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected [16383-<-6f5cd78ee644c1df9756fc11b3595403f51216cc]
  3. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448621921706 3 connected 8192-12287 16383

居然显示成这样的,屌屌屌。然而,16383还在 7002上。哎。无法理解。

check 下:

  1. [root@web3 7000]# redis-trib.rb check 192.168.33.13:7000
  2. ...
  3. M: 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003
  4. slots: (0 slots) master
  5. 2 additional replica(s)
  6. ...
  7. >>> Check for open slots...
  8. [WARNING] Node 192.168.33.13:7003 has slots in importing state (16383).
  9. [WARNING] The following slots are open: 16383
  10. >>> Check slots coverage...
  11. [ERR] Not all 16384 slots are covered by nodes.

它提示集群失败,说正在导入!什么鬼啊。完全搞不懂。跳过吧,看下一个命令:

cluster setslot <\slot> stable

取消 slot 的导入(import)或者迁移(migrate)。

这个命令屌啊,还可以反悔啊。赶紧试一试:

  1. 127.0.0.1:7003> cluster setslot 16383 stable
  2. OK

看下回去了没?

  1. 127.0.0.1:7003> cluster nodes
  2. 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected
  3. 6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448623146511 3 connected 8192-12287 16383

果然回去了,赞赞赞。再 check 下:

  1. [ERR] Nodes don't agree about configuration!
  2. >>> Check for open slots...
  3. >>> Check slots coverage...
  4. [ERR] Not all 16384 slots are covered by nodes.

刚才那个错误消息了。好吧。继续学习其它命令吧。

cluster keyslot <\key>

计算键 key 应该被放置在哪个槽上。这个是个蛮不错的功能。有时候很想找一个key在哪个节点。看下能不能用。

  1. 127.0.0.1:7000> cluster keyslot name
  2. (integer) 5798
  3. 127.0.0.1:7000> get name
  4. -> Redirected to slot [5798] located at 192.168.33.13:7001
  5. "123"
  6. 192.168.33.13:7001>

这个很简单,就是一个运算,之前也讲过: CRC16('name')%16384 = 5798

cluster countkeysinslot <\slot>

计算一个slot 包含多少个key。这也是一个很使用的小功能。

试一下:

  1. 192.168.33.13:7001> cluster countkeysinslot 5798
  2. (integer) 1

由于是测试,所以,slot里数据很少,这里显示1个,估计就是上面的name

cluster getkeysinslot <\slot> <\count>

返回 一个 slot 中 count 个 key 的集合。 也是一个蛮实用的功能。

试一下:

  1. 127.0.0.1:7000> cluster getkeysinslot 5798 1
  2. (empty list or set)

那设置几个值吧:

  1. 192.168.33.13:7000> set name1 yangyi
  2. -> Redirected to slot [12933] located at 192.168.33.13:7003
  3. OK
  4. 192.168.33.13:7003> set name2 yangyi
  5. -> Redirected to slot [742] located at 192.168.33.13:7000
  6. OK
  7. 192.168.33.13:7000> set name3 yangyi
  8. -> Redirected to slot [4807] located at 192.168.33.13:7001
  9. OK
  10. 192.168.33.13:7001> set name4 yangyi
  11. -> Redirected to slot [8736] located at 192.168.33.13:7002
  12. OK
  13. 192.168.33.13:7002> set name5 yangyi
  14. -> Redirected to slot [12801] located at 192.168.33.13:7003
  15. OK
  16. 192.168.33.13:7003> set name6 yangyi
  17. -> Redirected to slot [610] located at 192.168.33.13:7000
  18. OK
  19. 192.168.33.13:7000> set name7 yangyi
  20. -> Redirected to slot [4675] located at 192.168.33.13:7001
  21. OK
  22. 192.168.33.13:7001>

好。我们再取一下:

  1. 192.168.33.13:7001> cluster getkeysinslot 4675 1
  2. 1) "name7"

cluster slaves <\node-id>

返回一个master节点的slaves 列表

  1. 192.168.33.13:7001> cluster slaves 7b39b81b5ba94a9f4d96931dd0879cc13dab6f07
  2. 1) "f8c7a3113497d8d828bdb05fec4041b382e5fd0a 192.168.33.13:7005 slave 7b39b81b5ba94a9f4d96931dd0879cc13dab6f07 0 1450671948824 6 connected"

cluster nodes命令查看的结果是一样的。

至此,所有的命令都学完了,大致看了下,这些命令有些都很有问题,有些是鸡肋功能,不靠谱,尽量少用吧。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注