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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

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 <\slot> node <\node_id>
cluster setslot <\slot> migrating <\destination-node-id>
cluster setslot <\slot> importing <\node_id>
cluster setslot <\slot> stable
cluster keyslot <\key>
cluster countkeysinslot <\slot>
cluster getkeysinslot <\slot> <\count>
cluster slaves <\node-id>
前言

上一篇中,对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:

[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 3.2.8 集群的命令、使用、维护

这个命令过后,就会创建一个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: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 所指定的节点添加到集群当中,让它成为集群的一份子

我们一般会用

[root@test src]# ./redis-trib.rb add-node 192.168.0.2:7006 192.168.0.2:7000

这种方式将一个节点加入队列。这是不需要连接redis-cli客户端。
其实,也可以用cluster meet命令,使用方法:

cluster meet <ip> <port>`
我们来实践下,新建一个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 <node-id>
类似。同样,删除从节点,可以直接删除。删除主节点,要是有slot的话需要先迁移。

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

使用方法为:

cluster forget <node_id>

开始:

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 <master_nodeId>
先用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来开刀吧。谁叫它在最后呢哈哈哈哈哈哈

本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/2052944如需转载请自行联系原作者

qianghong000


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
相关文章
|
11天前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
|
4月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
5月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
176 5
|
16天前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
2月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
|
4月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
308 17
|
4月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
788 16
|
4月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
100 14
|
4月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
149 6
|
5月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构