超详细的redis-cli交互命令
Redis Cluster客户端实现
1、使⽤最频繁的 Java客户端Jedis最近添加了对Redis Cluster的⽀持,请参阅项⽬README中的Jedis Cluster部分。
2、redis-rb-cluster是我(@antirez)编写的Ruby实现,可作为其他语⾔的参考。它是原始redis-rb的简单包装,实现了最⼩语义以有效地与集群通信。
3、redis-cli从-c交换机启动时,该实⽤程序将实现基本的群集⽀持。
redis-cli
下⾯我们使⽤redis-cli来进⾏集群的交互
木上益志
使⽤客户端连接任意⼀个节点,使⽤-c表⽰以集群的⽅式登录,-p指定端⼝。使⽤exit退出客户端
redis-cli -c -p 7000
给redis设值,可以看到是分配到第6257个槽上,实例是7001实例
127.0.0.1:7000> t msg hello
-> Redirected to slot [6257] located at 127.0.0.1:7001
OK
127.0.0.1:7001>
查询集群状态
捉泥鳅音乐教案进⼊客户端后可以使⽤cluster info查询集群的状态
[root@localhost bin]# redis-cli -c -p 7000
127.0.0.1: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_ping_nt:243
cluster_stats_messages_pong_nt:235
cluster_stats_messages_nt:478
cluster_stats_messages_ping_received:230
cluster_stats_messages_pong_received:243
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:478
综治办是什么单位说明:不什么成语
cluster_state: ok状态表⽰集群可以正常接受查询请求。fail 状态表⽰,⾄少有⼀个哈希槽没有被绑定(说明有哈希槽没有被绑定到任意⼀个节点),或者在错误的状态(节点可以提供服务但是带有FAIL 标记),或者该节点⽆法联系到多数master节点。.
cluster_slots_assigned: 已分配到集群节点的哈希槽数量(不是没有被绑定的数量)。16384个哈希槽全部被分配到集群节点是集群正常运⾏的必要条件.
cluster_slots_ok: 哈希槽状态不是FAIL 和 PFAIL 的数量.
cluster_slots_pfail: 哈希槽状态是 PFAIL的数量。只要哈希槽状态没有被升级到FAIL状态,这些哈希槽仍然可以被正常处理。PFAIL状态表⽰我们当前不能和节点进⾏交互,但这种状态只是临时的错误状态。
cluster_slots_fail: 哈希槽状态是FAIL的数量。如果值不是0,那么集群节点将⽆法提供查询服务,除⾮cluster-require-full-coverage被设置为no .
cluster_known_nodes: 集群中节点数量,包括处于握⼿状态还没有成为集群正式成员的节点.
cluster_size: ⾄少包含⼀个哈希槽且能够提供服务的master节点数量.
cluster_current_epoch: 集群本地Current Epoch变量的值。这个值在节点故障转移过程时有⽤,它总是递增和唯⼀的。
cluster_my_epoch: 当前正在使⽤的节点的Config Epoch值. 这个是关联在本节点的版本值.
cluster_stats_messages_nt: 通过node-to-node⼆进制总线发送的消息数量.
cluster_stats_messages_received: 通过node-to-node⼆进制总线接收的消息数量.
集群的节点信息
使⽤cluster nodes可以查看集群的节点信息
127.0.0.1:7000> cluster nodes
0f972c205a469c25aad28790dfdc43989b5dcca3 127.0.0.1:7003@17003 slave 4e0062198602ae83f8981b1da12b37017ac7d1d0 015929890196864 con nected
b6b367d00e42026e0edc0e7725695a1dddc385ed 127.0.0.1:7000@17000 mylf,master -015929890170001 connected 0-5460
4e0062198602ae83f8981b1da12b37017ac7d1d0 127.0.0.1:7001@17001 master -015929890206932 connected 5461-10922
9195e10f b094bf4080b369bbe504dce8e29a3c52 127.0.0.1:7005@17005 slave b6b367d00e42026e0edc0e7725695a1dddc385ed 015929890200006 co nnected
61258728f35a1e91780aaed910240c9315c6a752 127.0.0.1:7004@17004 slave 163853328cae159d579405c3db5a769600e5c529 015929890200005 co nnected
163853328cae159d579405c3db5a769600e5c529 127.0.0.1:7002@17002 master -015929890190003 connected 10923-16383
每⾏的组成结构如下:
ip:port …
每项的含义如下:
id: 节点ID,是⼀个40字节的随机字符串,这个值在节点启动的时候创建,并且永远不会改变(除⾮使⽤CLUSTER RESET HARD命令)。
ip:port: 客户端与节点通信使⽤的地址.
flags: 逗号分割的标记位,可能的值有: mylf, master, slave, fail?, fail, handshake, noaddr, noflags
master: 如果节点是slave,并且已知master节点,则这⾥列出master节点ID,否则的话这⾥列出”-“。
ping-nt: 最近⼀次发送ping的时间,这个时间是⼀个unix毫秒时间戳,0代表没有发送过.
pong-recv: 最近⼀次收到pong的时间,使⽤unix时间戳表⽰.
config-epoch: 节点的epoch值(or of the current master if the node is a slave)。每当节点发⽣失败切换时,都会创建⼀个新的,独特的,递增的epoch。如果多个节点竞争同⼀个哈希槽时,epoch值更⾼的节点会抢夺到。
link-state: node-to-node集群总线使⽤的链接的状态,我们使⽤这个链接与集群中其他节点进⾏通信.值可以是 connected 和disconnected.
slot: 哈希槽值或者⼀个哈希槽范围. 从第9个参数开始,后⾯最多可能有16384个 数(limit never reached)。代表当前节点可以提供服务的所有哈希槽值。如果只是⼀个值,那就是只有⼀个槽会被使⽤。如果是⼀个范围,这个值表⽰为起始槽-结束槽,节点将处理包括起始槽和结束槽在内的所有哈希槽。
各flags的含义
mylf: 当前连接的节点.
master: 节点是master.
slave: 节点是slave.
fail?: 节点处于PFAIL 状态。 当前节点⽆法联系,但逻辑上是可达的 (⾮ FAIL 状态).
fail: 节点处于FAIL 状态. ⼤部分节点都⽆法与其取得联系将会将改节点由 PFAIL 状态升级⾄FAIL状态。
handshake: 还未取得信任的节点,当前正在与其进⾏握⼿.
noaddr: 没有地址的节点(No address known for this node).
noflags: 连个标记都没有(No flags at all).
redis-cli --cluster help
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #创建集群
--cluster-replicas <arg> #从节点个数
check host:port #检查集群
--cluster-arch-multiple-owners #检查是否有槽同时被分配给了多个节点
info host:port #查看集群状态
fix host:port #修复集群
--cluster-arch-multiple-owners #修复槽的重复分配问题
reshard host:port #指定集群的任意⼀节点进⾏迁移slot,重新分slots
--cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--fro m 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 <deN=wN> #指定集群节点的权重
--cluster-u-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 #在集群的所有节点执⾏相关命令
t-timeout host:port milliconds #设置cluster-node-timeout
import host:port #将外部redis数据导⼊集群
--cluster-from <arg> #将指定实例的数据导⼊到集群
--cluster-copy #migrate时指定copy
--cluster-replace #migrate时指定replace
help
① 创建集群主节点
redis-cli --cluster create 192.168.163.132:6379192.168.163.132:6380192.168.163.132:6381
② 创建集群主从节点
/redis-cli --cluster create 192.168.163.132:6379192.168.163.132:6380192.168.163.132:6381192.168.163.132:6382192.168.163.132:6383192.168.163 .132:6384--cluster-replicas 1
说明:–cluster-replicas 参数为数字,1表⽰每个主节点需要1个从节点。
通过该⽅式创建的带有从节点的机器不能够⾃⼰⼿动指定主节点,所以如果需要指定的话,需要⾃⼰⼿动指定,先使⽤①或③创建好主节点后,再通过④来处理。
③ 添加集群主节点
redis-cli --cluster add-node 192.168.91.128:7006192.168.91.128.1:7000
我使⽤add-node命令将新节点的地址指定为第⼀个参数,并将集群中随机存在的节点的地址指定为第⼆个参数。
进⼊⼀个redis交互窗⼝,输⼊ cluster nodes
查看集群情况,是否有新增节点
④ 添加集群从节点
可以通过两种⽅式添加集群从节点。
第⼀种:不指定主节点
redis-cli --cluster add-node 192.168.91.128:7006192.168.91.128:7000--cluster-slave
请注意,此处的命令⾏与我们⽤于添加新主服务器的命令⾏完全相同(只在后⾯说明添加的节点为从节点),因此我们并未指定要向其添加副本的主服务器。在这种情况下,发⽣的事情是redis-cli将新节点添加为副本较少的主节点中的随机主节点的副本。
第⼆种:指定主节点
redis-cli --cluster add-node 192.168.91.128:7006192.168.91.128:7000--cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
说明:把7006 节点加⼊到7000 节点的集群中,并且当做node_id为 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e的从节点。如果不指定 --cluster-master-id 会随机分配到任意⼀个主节点。
这样,我们将新副本分配给特定的主节点。
⑤ 删除节点
要删除从节点,只需使⽤del-noderedis-cli命令:
redis-cli --cluster del-node 192.168.91.128:7000 `<node-id>`
第⼀个参数只是集群中的⼀个随机节点,第⼆个参数是您要删除的节点的ID。
您也可以⽤相同的⽅法删除主节点,但是要删除主节点,它必须为空。如果主节点不为空,则需要先将数据从其重新分⽚到所有其他主节点。
说明:指定IP、端⼝和node_id 来删除⼀个节点,从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
注意:当被删除掉的节点重新起来之后不能⾃动加⼊集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。
如果想要再次加⼊集群,则需要先在该节点执⾏cluster ret,再⽤add-node进⾏添加,进⾏增量同步复制。
⑥ 检查集群
redis-cli --cluster check 192.168.163.132:6384
或者
曹一楠redis-cli --cluster check 192.168.163.132:6384--cluster-arch-multiple-owners
说明:任意连接⼀个集群节点,进⾏集群状态检查
⑦ 集群信息查看
redis-cli --cluster info 192.168.163.132:6384
说明:检查key、slots、从节点个数的分配情况
⑧ 修复集群
redis-cli --cluster fix 192.168.163.132:6384--cluster-arch-multiple-owners
说明:修复集群和槽的重复分配问题
⑨ 设置集群的超时时间
redis-cli --cluster t-timeout 192.168.163.132:638210000
说明:连接到集群的任意⼀节点来设置集群的超时时间参数cluster-node-timeout
分⽚操作
重新分⽚基本上意味着将哈希槽从⼀组节点移动到另⼀组节点,并且像群集创建⼀样,它是使⽤redis-cli实⽤程序完成的。
要开始重新分⽚,只需键⼊:
redis-cli --cluster reshard 192.168.91.128:7000
您只需要指定⼀个节点,redis-cli将⾃动找到其他节点。
然后会提⽰你您想要移动多少个插槽(从1到16384)?输⼊你想移动的插槽数量即可
How many slots do you want to move (from 1 to 16384)?
输⼊数量后,会提⽰你输⼊接收节点的ID
What is the receiving node ID?
然后,你将被询问要从哪些节点获取这些密钥。我只是键⼊all以从所有其他主节点获取⼀些哈希槽。
Plea enter all the source node IDs.
Type 'all' to u all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
西红柿酸奶
Source node #1: all
最后,还会让你确定是否要继续重新分⽚,输⼊yes即可
Do you want to proceed with the propod reshard plan (yes/no)? yes
开始分⽚,你可以看到哈希槽移动的信息
Moving slot 10969 from 192.168.91.128:7002 to 192.168.91.128:7000:
Moving slot 10970 from 192.168.91.128:7002 to 192.168.91.128:7000:血茶
还有⼀种重新分⽚的⽅式,就是编写重新分⽚操作脚本
重新分⽚可以⾃动执⾏,⽽⽆需以交互⽅式⼿动输⼊参数。可以使⽤如下命令⾏来实现:
redis-cli reshard <host>:<port>--cluster-from <node-id>--cluster-to <node-id>--cluster-slots <number of slots>--cluster-yes
from为移动的哈希槽原来所在的节点ID,to为哈希槽移动后的节点ID
例:
redis-cli reshard 192.168.91.128:7000--cluster-from b6b367d00e42026e0edc0e7725695a1dddc385ed --cluster-to 4e0062198602ae83f8981b1da12b3701 7ac7d1d0 --cluster-slots 100--cluster-yes
平衡集群中各个节点的slot数量
redis-cli --cluster rebalance 192.168.91.128:7000