Redis——常用命令

 

一、集群管理

  • 启动集群:
# 逐个节点启动
{redisDir}/bin/redis-server {redisDir}/conf/redis_7000.conf
{redisDir}/bin/redis-server {redisDir}/conf/redis_7001.conf
{redisDir}/bin/redis-server {redisDir}/conf/redis_7002.conf

# 批量启动节点(写入批处理文件中):
[root@manager-node bin]# cat cluster_start.sh 
{redisDir}/redis-server {redisDir}/conf/redis_7000.conf
{redisDir}/redis-server {redisDir}/conf/redis_7001.conf
{redisDir}/redis-server {redisDir}/conf/redis_7002.conf
  • 关闭集群:
# 逐个节点关闭
{redisDir}/bin/redis-cli -h 192.168.10.81 -p 7000 shutdown
{redisDir}/bin/redis-cli -h 192.168.10.81 -p 7001 shutdown
{redisDir}/bin/redis-cli -h 192.168.10.81 -p 7002 shutdown
或者
ps -ef|grep redis-server
kill {pid}

# 批量关闭节点
pgrep redis-server | xargs -exec kill -9
  • 查看集群信息:
cluster info

结果说明:

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  #已知节点的集群中的总数,包括在节点 握手的状态可能不是目前该集群的成员。
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

每一条结构说明:

<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] [连接状态] [槽点]
  • 加入集群

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

cluster meet <ip> <port> 
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 <node_id> 
192.168.0.2:7000> cluster forget 70795a3a7b93b7d059124e171cd46ba1683d6b7d
OK

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

  • 副本信息:
info replication

Master:

Slave:

  • 将当前节点设置为 node_id 指定的节点的从节点
cluster replicate <master_nodeId>    # 在相应的从节点上执行
  • 添加节点

当集群的压力比较大时,可以通过动态的扩容提高集群的写读并发能力

# 添加主节点
redis-cli --cluster add-node ip3:7007 ip1:7001

使用add-node添加集群节点,第一个地址参数为要添加的redis实例地址,第二个参数为集群中任意一个实例地址,节点会默认被添加为主节点,请注意这个时候添加的主节点与其他的master相比具有两个特点

  • 它没有数据,因为它没有分配哈希槽
  • 因为它是没有分配插槽的设备,所以当从节点想成为主节点时,它不参与选举过程

添加成功的标识:

# 添加从节点
redis-cli --cluster add-node ip3:7007 ip1:7001 --cluster-slave

上述会把ip3:7007实例作为集群的从节点加入到集群中,会挑选拥有从服务器数量最少的主服务器,然后把新加入的节点作为该主服务器的从节点。

  • 重新整理集群

当使用上述方式添加完主节点之后,添加进入的节点为空,并没有分配任何槽,此时我们需要执行reshard操作,为新添加的主节点分配插槽,已达到分担集群压力,提高并发能力的目的。

    •  1:开启重新分片(reshard)操作
redis-cli -h ip1 -p 7001 --cluster reshard ip1:7001
    • 2:指定需要重新reshard的slots的个数

    •  3:指定接收这些slots的插槽的目的节点id

    •  4:指定分配这些slots的插槽的源节点id,输入done为结束符
Source node #1:ca33b3d7a60f8df7b74473f86c11f84df609fa45
Source node #2:done
  • 删除节点

当系统负载压力比较小的时候,为了避免耗费资源,可以选择动态的删除节点,命令如下所示:

redis-cli -h ip1 -p 7001 --cluster del-node ip1:7001 node-id

使用上述方式删除节点的时候,当删除节点为从节点的时候可以直接删除,当删除节点为主节点的时候,则必须主节点不为空,即需要把主节点的插槽及插槽中的数据分配给其他的主节点。

  • 槽(slot)
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 saveconfig

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

  • 删除槽(slot)

移除当前节点的一个或多个槽点。只能删除自己的节点,删除别人的没用。因为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个槽点全部分配才会成功。所以。就失败了。
那如何挽救呢?那就顺便看下面的增加糟的这个命令吧。
  • 增加槽(slot)

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

cluster addslots

用法是:

cluster addslots slots1 slotes2 slots3

示例:

那,我就用这个命令将上面删掉的3个槽点再加到7003上看看:
127.0.0.1:7003> cluster addslots 16381 16382 16383
OK

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

 

二、重建集群

  • 1、停止每个节点的服务
# 逐个节点关闭
{redisDir}/bin/redis-cli -h 10.0.102.51 -p 7000 shutdown
{redisDir}/bin/redis-cli -h 10.0.102.51 -p 7001 shutdown
{redisDir}/bin/redis-cli -h 10.0.102.51 -p 7002 shutdown
  • 2、删除数据

删除每个节点data目录下aof、rdb、nodes.conf本地备份文件,删除每个节点log目录下的日志文件

  • 3、清空当前数据库(这一步可以省略) 
./redis-cli -c -p 7000 -h 10.0.102.51 flushdb
./redis-cli -c -p 7001 -h 10.0.102.51 flushdb
./redis-cli -c -p 7002 -h 10.0.102.51 flushdb
  • 4、启动每个节点服务
# 逐个节点启动
{redisDir}/bin/redis-server {redisDir}/conf/redis_7000.conf
{redisDir}/bin/redis-server {redisDir}/conf/redis_7001.conf
{redisDir}/bin/redis-server {redisDir}/conf/redis_7002.conf
  • 5、重新执行创建集群命令
./redis-cli --cluster create 10.0.102.51:7000 10.0.102.52:7000 10.0.102.53:7000 10.0.102.51:7001 10.0.102.52:7001 10.0.102.53:7001 10.0.102.51:7002 10.0.102.52:7002 10.0.102.53:7002 10.0.102.51:7003 10.0.102.52:7003 10.0.102.53:7003 --cluster-replicas 1

注:以上创建集群的命令,在其中一个节点上执行即可。

  • 6、登录集群查看节点信息

登陆其中一个节点,执行以下命令查看:

./redis-cli -c -p 7000 -h 10.0.102.51
10.0.102.51: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:12
cluster_size:6
cluster_current_epoch:12
cluster_my_epoch:1
cluster_stats_messages_ping_sent:370903
cluster_stats_messages_pong_sent:371514
cluster_stats_messages_publish_sent:9570
cluster_stats_messages_sent:751987
cluster_stats_messages_ping_received:371503
cluster_stats_messages_pong_received:370900
cluster_stats_messages_meet_received:11
cluster_stats_messages_publish_received:6551
cluster_stats_messages_received:748965

10.0.102.51:7000> cluster nodes 242bd7bab3869af03cae3bc8ca77ca0a7575f0e7 10.0.102.52:7001@17001 master - 0 1628671953591 5 connected 10923-13652 85ec3c81e7b213d7e1554b1fa18ba84ed2c7503b 10.0.102.52:7002@17002 slave 9b52daaa90ab1cc9132d8db625f8a1f697e4b657 0 1628671953000 1 connected 76d9f356a2d9721d6d7d901d756471d5d93d1eed 10.0.102.53:7003@17003 slave 242bd7bab3869af03cae3bc8ca77ca0a7575f0e7 0 1628671953091 5 connected de2aaebd660f01e1b54f4b94220ad5a5ea7e1b0b 10.0.102.53:7002@17002 slave b62cc30408d60a6ec29357e3ac8e5e2c51cd7415 0 1628671954593 2 connected 6b8e6dfdfc2d9dfd657c2c858ef3fc44781c34f8 10.0.102.51:7003@17003 slave 633710ef9f9269bad592e12cde5d0d24858f8d99 0 1628671953591 3 connected b62cc30408d60a6ec29357e3ac8e5e2c51cd7415 10.0.102.52:7000@17000 master - 0 1628671953000 2 connected 2731-5460 ea06a2c9f72d17fad10d6ccc6b03af94a51511b5 10.0.102.53:7001@17001 master - 0 1628671954092 6 connected 13653-16383 9b52daaa90ab1cc9132d8db625f8a1f697e4b657 10.0.102.51:7000@17000 myself,master - 0 1628671952000 1 connected 0-2730 633710ef9f9269bad592e12cde5d0d24858f8d99 10.0.102.53:7000@17000 master - 0 1628671953591 3 connected 5461-8191 554ce97679c311741a84d75d540b34dc1c87d9d5 10.0.102.51:7002@17002 slave ea06a2c9f72d17fad10d6ccc6b03af94a51511b5 0 1628671953000 6 connected 1c59253e898313d31e4fd6af983cd597b7a2584a 10.0.102.51:7001@17001 master - 0 1628671954000 4 connected 8192-10922 b75a7c5e5d77b5b8b287d537429fc71ce3ba3625 10.0.102.52:7003@17003 slave 1c59253e898313d31e4fd6af983cd597b7a2584a 0 1628671954592 4 connected

 

三、集群节点损坏修复

问题现象

启动集群后,有些节点没启动成功,检查log文件显示如下信息:

Unrecoverable error: corrupted cluster config file.

这种情况,因为集群cluster-config-file文件损坏引起,导致该节点无法启动。

修复方案

  1. 首先在各个node上移除该出错节点
  2. 删除该cluster-config-file文件
  3. 重新启动该节点
  4. 将该节点加入集群
  5. 指定该节点的master,将该节点以slave加入集群(本次修复未执行,集群自动恢复正常)

实施步骤

  • 一、首先在各个node上移除该出错节点

执行以下脚本,将fail节点移除出集群,该操作仅移除一个机器中的无用节点信息,如果是多个机器,请在相应的节点上执行多次

./redis-cli -c -h 7000 -p 10.0.102.51 cluster forget $nodeid
  • 二、停止出错节点服务
ps -ef|grep redis-server
kill -9 pid
  • 三、删除该cluster-config-file文件
mv nodes-7000.conf nodes-7000.conf.bak
  • 四、启动该节点
{redisDir}/bin/redis-server {redisDir}/conf/redis_7000.conf
  • 五、将该节点加入集群

在集群任意instance 执行以下命令

CLUSTER MEET <ip> <port>   //将ip和port所指定的节点添加到集群当中,让它成为集群的一份子
  • 六、指定该节点的master,将该节点以slave加入集群

在此次修复场景中未进行第五步,集群自动分配成为不均衡节点的slave

如果集群未自动分配,在需要加入集群的实例上执行,指定为某一个master的slave

CLUSTER REPLICATE <node_id> //将当前节点设置为 node_id 指定的节点的从节点。

 

四、其它

  • 查看内存使用情况
info memory

  • 检查集群状态
redis-cli --cluster check 172.16.0.89:7000

  • 修复集群状态
redis-cli --cluster fix 127.0.0.1:6379

 

 

posted on 2021-01-12 10:59  曹伟雄  阅读(647)  评论(0编辑  收藏  举报

导航