设为首页 收藏本站
查看: 842|回复: 0

[经验分享] Redis 3.2.8 集群的命令、使用、维护

[复制链接]

尚未签到

发表于 2018-11-3 08:40:06 | 显示全部楼层 |阅读模式
  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
DSC0000.jpg


  这个命令过后,就会创建一个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来开刀吧。谁叫它在最后呢哈哈哈哈哈哈



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630061-1-1.html 上篇帖子: Django框架设置session存储在redis数据库中 下篇帖子: Ubuntu的web服务器搭建系列之JDK(JDK+Tomcat+MySQL+Nginx+Redis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表