技术交流28群

服务热线

135-6963-3175

微信服务号

redis-cli命令操作 更新时间 2020-5-15 浏览952次

redis命令

redis-cli

redis-trib.rb是在redis3.x版本时所用的一种部署redis集群的工具,redis-cli是redis4.x及更高版本所支持创建集群的工具,在redis3.x版本时redis-cli只是一个客户端连接管理工具。Redis Cluster 在5.0之后取消了ruby脚本 redis-trib.rb的支持(手动命令行添加集群的方式不变),集合到redis-cli里,避免了再安装ruby的相关环境。直接使用redis-clit的参数--cluster 来取代。

redis-cli也比redis-trib.rb多了一个可以认证集群密码的功能,后者创建的集群不能对有密码的集群节点进行很好的管理,所以后来官方直接废弃了这个工具。

用redis-trib.rb创建集群之前需要配置ruby环境,新版本的redis-cli可以直接创建集群环境而不用配置ruby环境。

redis-cli -h 192.168.1.101 -p 6379
用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <主机ip>,默认是127.0.0.1
-p <端口>,默认是6379
-a <密码>,如果redis加锁,需要传递密码
--help,显示帮助信息

redlis-cli连接后:

cluster nodes

可通过该命令查看集群的节点信息

192.168.1.101:7000> cluster nodes
0f972c205a469c25aad28790dfdc43989b5dcca3 127.0.0.1:7003@17003 slave 4e0062198602ae83f8981b1da12b37017ac7d1d0 0 1592989019686 4 connected
b6b367d00e42026e0edc0e7725695a1dddc385ed 127.0.0.1:7000@17000 myself,master - 0 1592989017000 1 connected 0-5460
4e0062198602ae83f8981b1da12b37017ac7d1d0 127.0.0.1:7001@17001 master - 0 1592989020693 2 connected 5461-10922
9195e10fb094bf4080b369bbe504dce8e29a3c52 127.0.0.1:7005@17005 slave b6b367d00e42026e0edc0e7725695a1dddc385ed 0 1592989020000 6 connected
61258728f35a1e91780aaed910240c9315c6a752 127.0.0.1:7004@17004 slave 163853328cae159d579405c3db5a769600e5c529 0 1592989020000 5 connected
163853328cae159d579405c3db5a769600e5c529 127.0.0.1:7002@17002 master - 0 1592989019000 3 connected 10923-16383

redis-cli创建集群

redis-cli跟redis-trib.rb创建集群的方法几乎一样,只不过在创建集群的时候需要指定 --cluster这个选项,对于有密码的redis集群,可以指定 -a选项来管理redis集群。

(1)在创建集群时候指定replicas数量,如果数量为1,那么每个Master都会分配一个Slave,但是这样操作是不能指定哪个Master跟哪个Slave绑定的。

/opt/redis/bin/redis-cli --cluster create --cluster-replicas 1 192.168.1.101:6379 192.168.1.102:6379 192.168.1.103:6379 
192.168.1.104:6379 192.168.1.105:6379 192.168.1.106:6379 192.168.1.107:6379 192.168.1.108:6379 -a '123456'

(2)创建4Master,4Slave的集群,先创建4个Master的全Master集群,在添加Slave实例

/opt/redis/bin/redis-cli --cluster create 192.168.1.101:6379 1192.168.1.102:6379 192.168.1.103:6379 192.168.1.104:6379 -a '123456'

(3)添加Slave实例

# 依次添加4个Slave即可,下边是添加一个Slave的命名

/opt/redis/bin/redis-cli --cluster add-node 192.168.1.105:6379 192.168.1.101:6379 --cluster-slave --cluster-master-id 9000a261858463dea8c607acc3104485aff9d5bc -a '123456'

(4)查看集群状态(随意指定一台节点即可查看集群所有节点状态)

/opt/redis/bin/redis-cli --cluster check 192.168.1.101:6379 -a '123456'

(5)迁移Slot跟之前redis-trib.rb是相同的操作


附:

redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN   #创建集群
                 --cluster-replicas <arg>      #从节点个数
  check          host:port                     #检查集群
                 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
  info           host:port                     #查看集群状态
  fix            host:port                     #修复集群
                 --cluster-search-multiple-owners #修复槽的重复分配问题
  reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                 --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                 --cluster-yes                 #指定迁移时的确认输入
                 --cluster-timeout <arg>       #设置migrate命令的超时时间
                 --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                 --cluster-replace             #是否直接replace到目标节点
  rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                 --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                 --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                 --cluster-timeout <arg>                        #设置migrate命令的超时时间
                 --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                 --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                 --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                 --cluster-replace                              #是否直接replace到目标节点
  add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                 --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                 --cluster-master-id <arg>                      #给新节点指定主节点
  del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
  call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
  set-timeout    host:port milliseconds                         #设置cluster-node-timeout
  import         host:port                                      #将外部redis数据导入集群
                 --cluster-from <arg>                           #将指定实例的数据导入到集群
                 --cluster-copy                                 #migrate时指定copy
                 --cluster-replace                              #migrate时指定replace
  help

cluster slots命令说明

执行结果如下

4 #start slots
5460 #end slots
5.5.5.102 #ip
29001 #port
eb7dfedad330c2421ed04321ca24c33ebcadb1a9
5.5.5.101
29001
6ecf0faaedafcf2e4b14c221721d3b279f2c5748
1
3
5.5.5.101
29003
7c79008aac1a2b1aa3f64e9d3747146f766386bd
5.5.5.103
29003
a3f384efcd3e38642b5fb68507fde01a5117704f
10923
16383
5.5.5.101
29003
7c79008aac1a2b1aa3f64e9d3747146f766386bd
5.5.5.103
29003
a3f384efcd3e38642b5fb68507fde01a5117704f
0
0
5.5.5.103
29002
a76debe07f1b481a4ac634d3bfaac782c0cb2024
5.5.5.102
29002
2da5169ef3cf069a5088eb4c84363e2bea34fbba
5461
10922
5.5.5.103
29002
a76debe07f1b481a4ac634d3bfaac782c0cb2024
5.5.5.102
29002
2da5169ef3cf069a5088eb4c84363e2bea34fbba

脚本slots.sh

redis-cli -h $1 -p $2 -c cluster slots | xargs -n8 | awk '{print $3":"$4" "$1"-"$2}' > tmp_slot_range
awk '{a[$1]++}END{for(i in a)print i}' tmp_slot_range | sort -nk2 -t ":" > ip_port
 
for i in `cat ip_port`
do
  slots=($(awk '/'$i'/{print $2}' tmp_slot_range))
  len=${#slots[@]}
  printf "$i-> "
  for(( j=0;j<=len-1;j++))
  do
    printf "${slots[j]} "
  done
  echo
done


print $3":"$4" "$1"-"$2为输出格式

ip:port startslot-endslot

脚本说明:

第1行获取到结果如下:

5.5.5.102:29001 4-5460
5.5.5.101:29003 1-3
5.5.5.101:29003 10923-16383
5.5.5.103:29002 0-0
5.5.5.103:29002 5461-10922

第2行获取的结果如下:

5.5.5.102:29001
5.5.5.103:29002
5.5.5.101:29003

第4-14行获取第2行的结果的每一行对应的slot范围

测试结果

[redis@lxd-vm1 ~]$ sh slots.sh 5.5.5.101 29001
5.5.5.102:29001-> 4-5460
5.5.5.103:29002-> 0-0 5461-10922
5.5.5.101:29003-> 1-3 10923-16383
[redis@lxd-vm1 ~]$

这里再优化一下输出的结果,将单个slot的情况,如0-0 输出为0

redis迁移slots获取脚本slots.sh:

redis-cli -h $1 -p $2 -c cluster slots | xargs -n8 |  awk '{print $3":"$4" "$1"-"$2}' > tmp_slot_range
awk '{a[$1]++}END{for(i in a)print i}' tmp_slot_range | sort -nk2 -t ":" > ip_port
 
for i in `cat ip_port`
do
    slots=($(awk '/'$i'/{print $2}' tmp_slot_range))
    len=${#slots[@]}
    printf "$i-> "
    for(( j=0;j<=len-1;j++))
    do
        s1=$(echo ${slots[j]} | awk -F[-] '{print $1}')
        s2=$(echo ${slots[j]} | awk -F[-] '{print $2}')
        if [[ $s1 -eq $s2 ]];then
            printf "$s1 "
        else
            printf "${slots[j]} "
        fi
    done
    echo
done
[redis@lxd-vm1 ~]$ sh slots.sh 5.5.5.101 29001
5.5.5.102:29001-> 4-5460
5.5.5.103:29002-> 0 5461-10922
5.5.5.101:29003-> 1-3 10923-16383
[redis@lxd-vm1 ~]$