|
Redis 3.0.5 集群的命令、使用、维护
前言
cluster命令
cluster info
cluster nodes
cluster meet
cluster forget
cluster replicate
cluster saveconfig
cluster delslots
cluster addslots
cluster flushslots
cluster setslot node
cluster setslot migrating
cluster setslot importing
cluster setslot stable
cluster keyslot
cluster countkeysinslot
cluster getkeysinslot
cluster slaves
前言
上一篇中,对redis cluster的有了较为深入的实践,并且一整套都实践了,redis cluster 确实挺好用,随着版本的更新,它会越来越成熟和稳定,一定是未来的方向。
这一篇对后续的一些尾巴来学习下,包括 CLUSTER * 一系列命令,以及容灾性的数据迁移,以及在php的使用。
cluster命令
redis 有很多命令,同意,加入到cluster后,也有一些列的命令,现在一一来看下 (http://redis.io/commands/cluster-addslots):
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
//节点
CLUSTER MEET 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
CLUSTER ADDSLOTS [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点。
CLUSTER SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
//键
CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。
//新增
CLUSTER SLAVES node-id 返回一个master节点的slaves 列表
我们来一个一个的实践一下。
我按照上一篇的理论实践知识的基础上,再次搭建了一个集群,这次运行了8个端口,用实际的ip代替127.0.0.1:
[root@test src]# ./redis-trib.rb create --replicas 1 192.168.0.2:7000 192.168.0.2:7001 192.168.0.2:7002 192.168.068.0.2:7004 192.168.0.2:7005
这个命令过后,就会创建一个redis cluster 集群,包括3个Master和3个slave。
OK,现在我们来一一试一下上述的CLUSTER *命令。
cluster info
这个命令是显示当前连接的集群的各种信息。
root@test src]# redis-cli -h 192.168.0.2 -c -p 7000
192.168.0.2:7000> 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_sent:171642
cluster_stats_messages_received:97456
cluster_state #集群的状态。ok表示集群是成功的,如果至少有一个solt坏了,就将处于error状态。
cluster_slots_assigned #有多少槽点被分配了,如果是16384,表示全部槽点已被分配。
cluster_slots_ok #多少槽点状态是OK的, 16384 表示都是好的。
cluster_slots_pfail #多少槽点处于暂时疑似下线[PFAIL]状态,这些槽点疑似出现故障,但并不表示是有问题,也会继续提供服务。
cluster_slots_fail #多少槽点处于暂时下线[FAIL]状态,这些槽点已经出现故障,下线了。等待修复解决。
cluster_known_nodes #已知节点的集群中的总数,包括在节点 握手的状态可能不是目前该集群的成员。这里总公有9个。
cluster_size #(The number of master nodes serving at least one hash slot in the cluster) 简单说就是集群中主节点[Master]的数量。
cluster_current_epoch #本地当前时期变量。这是使用,以创造独特的不断增加的版本号过程中失败接管。{不懂}
cluster_my_epoch #这是分配给该节点的当前配置版本。{不懂}
cluster_stats_messages_sent #通过群集节点到节点的二进制总线发送的消息数。
cluster_stats_messages_received #通过群集节点到节点的二进制总线上接收报文的数量。
cluster nodes
获取集群上的所有的节点信息。一般这个命令用的比较多。
192.168.0.2:7000> CLUSTER NODES
838a9a05fdb6ee052f7d99b0f9d2501f69d9f26c 192.168.0.2:7003 slave e4b4c16d0299e1a912422487dbc8a46e75a90715 0 1513828646ed
235df400d70b4a857cd1b486fdc47fafa37ce2c6 192.168.0.2:7001 master - 0 1513828645849 2 connected 5461-10922
e4b4c16d0299e1a912422487dbc8a46e75a90715 192.168.0.2:7000 myself,master - 0 0 1 connected 0-5460
19b9315d5d8aa0268e6fb60b27c8f55c3bb53692 192.168.0.2:7004 slave 235df400d70b4a857cd1b486fdc47fafa37ce2c6 0 1513828644ed
5e8c15a993a90189a599f865790225dd16295a20 192.168.0.2:7005 slave 1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882 0 1513828645ed
1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882 192.168.0.2:7002 master - 0 1513828645347 3 connected 10923-16383
先看下每一条的结构:
...
[节点id] [ip:端口] [标志(master、myself、salve)] [(- 或者主节id)] [ping发送的毫秒UNIX时间,0表示没有ping] [pong接收的unix毫秒时间戳] [配置-epoch] [连接状态] [槽点]
cluster meet
将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子
我们一般会用
[root@test src]# ./redis-trib.rb add-node 192.168.0.2:7006 192.168.0.2:7000
这种方式将一个节点加入队列。这是不需要连接redis-cli客户端。
其实,也可以用cluster meet命令,使用方法:
cluster meet `
我们来实践下,新建一个7009新节点,然后试着用这个命令加入到集群中来:
192.168.0.2:7000> cluster meet 192.168.0.2 7006
OK
192.168.0.2:7000> cluster nodes
....
70795a3a7b93b7d059124e171cd46ba1683d6b7d 192.168.0.2:7006 master - 0 1446198910590 0 connected
现在7009已经成功加入到来集群当中,同样,还没有分配槽点给它。槽点分配在下面的命令中再仔细说。
cluster forget
从集群中移除一个节点。这个功能:
redis-trib del-node 192.168.0.2:7006
类似。同样,删除从节点,可以直接删除。删除主节点,要是有slot的话需要先迁移。
我们就来删除上一步加的这个192.168.0.2:7006,他是一个master 节点,但是里面还没分配slot,所以,我们删除试一下:
使用方法为:
cluster forget
开始:
192.168.0.2:7000> cluster forget 70795a3a7b93b7d059124e171cd46ba1683d6b7d
OK
提示OK了,说明已经成功了。
再看下node 列表:
192.168.0.2:7000> cluster nodes
838a9a05fdb6ee052f7d99b0f9d2501f69d9f26c 192.168.0.2:7003 slave e4b4c16d0299e1a912422487dbc8a46e75a90715 0 1513828646ed
235df400d70b4a857cd1b486fdc47fafa37ce2c6 192.168.0.2:7001 master - 0 1513828645849 2 connected 5461-10922
e4b4c16d0299e1a912422487dbc8a46e75a90715 192.168.0.2:7000 myself,master - 0 0 1 connected 0-5460
19b9315d5d8aa0268e6fb60b27c8f55c3bb53692 192.168.0.2:7004 slave 235df400d70b4a857cd1b486fdc47fafa37ce2c6 0 1513828644ed
5e8c15a993a90189a599f865790225dd16295a20 192.168.0.2:7005 slave 1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882 0 1513828645ed
1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882 192.168.0.2:7002 master - 0 1513828645347 3 connected 10923-16383
嗯。节点被移除了。
但是,其实是没有真正移除!不知道为啥。
[root@test src]$ ./redis-trib.rb check 192.168.33.13:7009
Connecting to node 192.168.33.13:7009: OK
Connecting to node 192.168.33.13:7004: OK
Connecting to node 192.168.33.13:7007: OK
Connecting to node 192.168.33.13:7000: OK
Connecting to node 192.168.33.13:7008: OK
Connecting to node 192.168.33.13:7006: OK
Connecting to node 192.168.33.13:7003: OK
Connecting to node 192.168.33.13:7005: OK
Connecting to node 192.168.33.13:7001: OK
Connecting to node 192.168.33.13:7002: OK
进程也还在。
[root@test src]# ps -ef|grep redis
root 3017 1 0 Nov23 ? 00:04:24 redis-server *:7009 [cluster]
而且也还能连上:
[root@test src]# redis-cli -p 7009 -c
127.0.0.1:7009> cluster nodes
70795a3a7b93b7d059124e171cd46ba1683d6b7d 192.168.33.13:7009 myself,master - 0 0 0 connected
日了狗了!!!!为啥啊。不管啦。继续。
cluster replicate
将当前节点设置为 node_id 指定的节点的从节点。
既然刚才没把7009删掉,那就用这个命令把它设置成7003的从节点吧。
使用方法为:
cluster replicate
先用7009连接
[root@test src]# redis-cli -p 7009 -c
127.0.0.1:7009> cluster replicate 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce
OK
OK了,说明成功了,我们再看下:
127.0.0.1:7009> cluster nodes
...
b3917e10123230f2f5b0e2c948a7eeda7f88ccf7 192.168.33.13:7009 myself,slave 35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 0 0 0 connected
357bea5151b32a971c1f7a5788271106195f99a 192.168.33.13:7003 master - 0 1448525721782 4 connected 12288-16383
OK,说明设置成功了,那我推出cli用redis-trib看下:
[root@test src]# redis-trib.rb check 192.168.33.13:7000
>>> Performing Cluster Check (using node 192.168.0.2:7000)
M: e4b4c16d0299e1a912422487dbc8a46e75a90715 192.168.0.2:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 838a9a05fdb6ee052f7d99b0f9d2501f69d9f26c 192.168.0.2:7003
slots: (0 slots) slave
replicates e4b4c16d0299e1a912422487dbc8a46e75a90715
S: 1c66d8cd8557bbae5c1cc1a50c5680372d65704d 192.168.0.2:7005
slots: (0 slots) slave
replicates 1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882
M: 19b9315d5d8aa0268e6fb60b27c8f55c3bb53692 192.168.0.2:7004
slots:5461-10922 (5462 slots) master
0 additional replica(s)
M: 1cd42aa05b3a6ce3bcc7c8455ba5cfe3147bb882 192.168.0.2:7002
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.
成功了!
cluster saveconfig
将节点的配置文件保存到硬盘里面.
试一下:
127.0.0.1:7009> cluster saveconfig
OK
ok说明成功了,它会覆盖配置文件夹里的nodes.conf文件。这样做是为了某种情况下nodes文件丢失,这样就会生成一个最新的节点配置文件。
为了说明是新生成的,我们可以先删除掉7009目录下的nodes.conf文件:
[root@web3 7009]# ll
total 52
-rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
-rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
-rw-r--r-- 1 root root 1269 Nov 26 08:50 nodes.conf
-rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
[root@web3 7009]# rm -rf nodes.conf
[root@web3 7009]# ll
total 42
-rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
-rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
-rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
[root@web3 7009]# redis-cli -p 7009 -c
127.0.0.1:7009> cluster saveconfig
OK
127.0.0.1:7009> exit
[root@web3 7009]# ll
total 52
-rw-r--r-- 1 root root 0 Nov 26 08:14 appendonly.aof
-rw-r--r-- 1 root root 18 Nov 26 08:14 dump.rdb
-rw-r--r-- 1 root root 1269 Nov 26 08:51 nodes.conf
-rw-r--r-- 1 root root 41550 Oct 30 03:40 redis.conf
[root@web3 7009]#
cluster delslots
移除当前节点的一个或多个槽点。只能删除自己的节点,删除别人的没用。
因为master才会有槽点,所以,也是只能在master 节点上操作,在slave 操作也没用。
用法是:
cluster delslots slots1 slotes2 slots3
我们看一下槽点的分配情况:
[root@web3 7009]# redis-cli -p 7009 -c cluster nodes| grep master
3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 master - 0 1448529511113 1 connected 0-4095
404cf1ecf54d4df46d5faaec4103cfdf67888ad2 192.168.33.13:7001 master - 0 1448529511113 2 connected 4096-8191
6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448529509101 3 connected 8192-12287
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1448529510609 4 connected 12288-16383
4台master,那就把16381 16382 16383 3个槽点给删掉。
开始:
[root@web3 7009]# redis-cli -p 7003
127.0.0.1:7003> cluster delslots 16381 16382 16383
OK
127.0.0.1:7003> cluster nodes
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16380
看,7003的缺失少了3个节点。我们在看下cluster info
127.0.0.1:7003> cluster info
cluster_state:fail
cluster_slots_assigned:16381
cluster_slots_ok:16381
只有16381个,确实少了4个。但是,注意:cluster_state:fail,集群失败了!!!
为什么呢?为什么删除了3个槽点就失败了呢。因为集群就是要满足所有的16364个槽点全部分配才会成功。所以。就失败了。
数据读取自然也会失败:
127.0.0.1:7003> get name
(error) CLUSTERDOWN The cluster is down
我们用redis-trib检查一下,就知道了:
[root@web3 7009]# redis-trib.rb check 192.168.33.13:7000
...
...
[ERR] Nodes don't agree about configuration!
>> Check for open slots...
>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.
那如何挽救呢?那就顺便看下下面的这个命令吧。
cluster addslots
将一个或多个槽(slot)指派(assign)给当前节点。
用法是:
cluster addslots slots1 slotes2 slots3
那,我就用这个命令将上面删掉的3个槽点再加到7003上看看:
127.0.0.1:7003> cluster addslots 16381 16382 16383
OK
127.0.0.1:7003>
OK了,看下是不是真的成功了:
127.0.0.1:7003> cluster nodes
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16383
确实回来了,再看下集群状态,启动了没?
127.0.0.1:7003> cluster info
cluster_state:ok
数据读取也正常了:
127.0.0.1:7003> get name
-> Redirected to slot [5798] located at 192.168.33.13:7001
"123"
192.168.33.13:7001>
cluster flushslots
移除当前节点的所有槽点,让当前节点变成一个没有指派任何槽的节点。
我们还是拿7003来开刀吧。谁叫它在最后呢哈哈哈哈哈哈
|
|