Redis3自带的ruby脚本和cluster命令的使用

Resharding the cluster

所谓的对集群数据进行分片,就是把实例节点的一些hash桶转移到其他实例节点。我们使用ruby脚本进行分片:

./redis-trib.rb reshard 127.0.0.1:7000

我们需要提供一个节点的ip跟端口用于定位redis集群,redis-trib.rb将会自动寻找集群中的其他节点,键入命令后,会提示我们要转移多少数据

How many slots do you want to move (from 1 to 16384)?

找出redis节点的实例ID的命令:

$ redis-cli -p 7000 -h 127.0.0.1cluster nodes | grep myself

将会输出

97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460

你将会被询问你需要将数据复制到那些节点上去,我们输入ALL
在结束分片之后,我们可以使用下面命令检测集群的情况:

./redis-trib.rb check 127.0.0.1:7000

Scripting a resharding operation

集群的重新分片无需在交互窗口中进行,我们可以使用下面的命令进行操作

./redis-trib.rb reshard –from 《node-id》 –to 《node-id》 –slots 《number of slots》 –yes 《host》:《port》

当前redi-trrb还没有任何方法对key的转移自动再平衡。

Adding a new node

增加实例服务器,就是增加一个主节点或者是从节点,并往其中迁入数据。
启动一个新的redis实例数据库,并使用redis-trib脚本将其加入集群,使用add-node命令,第一个参数是即将要加入的节点名字,第二个参数是集群中任意一个的redis实例的ip跟端口。

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

redis 127.0.0.1:7006> cluster nodes
3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385543178575 0 connected 5960-10921
3fc783611028b1707fd65345e763befb36454d73 127.0.0.1:7004 slave 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 0 1385543179583 0 connected
f093c80dde814da99c5cf72a7dd01590792b783b :0 myself,master - 0 0 0 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543178072 3 connected
a211e242fc6b22a9427fed61285e85892fa04e08 127.0.0.1:7003 slave 97a3a64667477371c4479320d683e4c8db5858b1 0 1385543178575 0 connected
97a3a64667477371c4479320d683e4c8db5858b1 127.0.0.1:7000 master - 0 1385543179080 0 connected 0-5959 10922-11422
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7005 master - 0 1385543177568 3 connected 11423-16383

如上,可以知道机器已经加入到集群中了,但是有两点必须知道的是,当前7006端口的redis实例上没有存放数据,也就是说没有存放任何slot(桶),而他不参与主从切换时候的选举

增加一个从服务器

使用redis-trib命令,但是命令没有指定加入节点要成为哪一个主实例的从服务器,所以redis-trib会随机选择一个主实例:

./redis-trib.rb add-node –slave 127.0.0.1:7006 127.0.0.1:7000

如果要指定哪一个实例数据库,需要指定master-id,使用如下命令:

./redis-trib.rb add-node –slave –master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
一种更加普遍的方法是先往集群加入一个master节点,成功加入后再使用cluster replicate方法将其作为一个某个主实例的从节点。
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

检测一个主实例下的从服务器

$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected

Remove Node

使用redis-trib,第一个参数是集群中任意一个服务器的ip跟端口,用于定位集群,第二个参数是你要删除node的nodeId

./redis-trib del-node 127.0.0.1:7000

你在删除一个数据之前必须确认该数据已经清空了,否则你要先把数据分片到其他redis实例上去

Redis cluster的命令

  • 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 返回 count 个 slot 槽中的键。

这些命令是集群所独有的。执行上述命令要先登录

遇到的问题

redis集群中的16384个桶如果没有被全部覆盖的话是不能接收客户端任务的,redis3中的16384个桶只能由redis的主实例节点所持有,从实例节点使用在命令行端使用read only命令后可以接收读命令,否则不执行读命令,读写命令都由主实例节点进行,加入redis集群的主实例节点必须分配桶,如果没有分配桶的话,新加入的主实例节点不工作,所以必须使用脚本或者redis3自带的命令进行桶的重新分配。

Redis3的redis-trib.rb脚本使用

Redis-trib.rb命令说明

命令 参数 说明 demo
create –replicas[number]host1:port…hostN:portN Create命令直接自动生成redis配置,包括redis机器间的meet操作,以及16384桶的分配。number 指定从实例节点个数,repicas参数必须带上host:port等等为redis集群所有实例 ./redis-trib.rb create –replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
check host:port 该集群任意一个机器的端口跟ip ./redis-trib.rb check 127.0.0.1:7000
info host:port 该集群任意个机器的端口跟ip /redis-trib.rb info 127.0.0.1:7000
fix host:port –timeout 该集群任意个机器的端口跟ip ./redis-trib.rb fix 127.0.0.1:7000或者./redis-trib.rb fix –timeout 15 127.0.0.1:7000
reshard host:port –from –to –slots –yes –timeout –pipeline 该命令用于对集群中的桶进行重新分片,该命令存在提示,需要分片那个机器的桶,分配到那个实例去,该命令用于机器调整。 ./redis-trib.rb reshard 127.0.0.1:7000
rebalance host:port –weight –auto-weights –use-empty-masters –timeout –simulate –pipeline –threshold 对集群中每个实例的桶进行调整 ./redis-trib.rb rebalance 127.0.0.1:7000
add-node newhost:newport existhost:existport slave master-id newhost:newport 新加入的ip跟端口,集群任意一个端口跟ip; /redis-trib.rb add-node 127.0.0.1:7003 127.0.0.1:7000或者./redis-trib.rb add-node –slave –master-id dc49104012c89154d47cbdcf9bb2fa54906fb1ae 127.0.0.1:7003 127.0.0.1:7000
del-node host:port node_id 集群中任意一个端口要移除的节点node_id如果要移除的节点的node_id的分配有slots时候,无法成功。需要移除slots后才能成功移除,并且删除节点后会停止该实例 ./redis-trib.rb del-node 127.0.0.1:7000 646d18e2cbc1219d2ac457ec09e3c574ada98dd7
set-timeout host:port time(ms) /redis-trib.rb set-timeout 127.0.0.1:7000 1500
call ./redis-trib.rb call host:port command ./redis-trib.rb call 127.0.0.1:7001 dbsize
import –from importHost:importPort host:port 前一个是存放数据的节点,后一个是接收数据的节点,存放数据的节点不能是集群节点 ./redis-trib.rb import –from 127.0.0.1:7001 127.0.0.1:7000

Redis-trib.rb命令及输出

命令 输出
./redis-trib.rb create –replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 用于构建redis集群
./redis-trib.rb check 127.0.0.1:7000 检查redis集群是否正常
./redis-trib.rb reshard 127.0.0.1:7000 重新分配slot,可手工选择
./redis-trib.rb rebalance 127.0.0.1:7000 自动重新平衡key的分布
./redis-trib.rb add-node 127.0.0.1:7003 127.0.0.1:7000 增加节点,前者已有集群任意的实例ip跟端口,后者为即将加入的新实例
./redis-trib.rb add-node –slave –master-id dc49104012c89154d47cbdcf9bb2fa54906fb1ae 127.0.0.1:7003 127.0.0.1:7000 用于增加redis实例

Redis命令行的cluster命令

命令 参数 输出
cluster addslots slot1,slot2…slotN 为当前登陆的服务器分配桶,1-16384
cluster delslots slot1,slot2..slotN cluster delslots slot1,slot2..slotN
CLUSTER SETSLOT slot MIGRATING node-id 将给定节点 node 中的槽 slot 迁移出节点
CLUSTER SETSLOT slot IMPORTING node 用于将给定槽 slot 导入到节点 node
CLUSTER SETSLOT slot STABLE node-id 用于取消迁移的状态
CLUSTER SETSLOT slot NODE node-id 用于完成迁移,迁入迁出都需要使用才能完成
cluster count-failure-report node_id
cluster count keysinslot slot 当前服务器的slot的数量
cluster failover[force|takeover] 该命令只能用于从服务器,使从服务器宕机
cluster forget node_id Remove节点
cluster info
cluster nodes 展示节点信息
cluster replicate node_id 把当前作为node_id的从节点,把主节点必须为empty且没有分配slots
cluster reset [hard|soft]
cluster reset [hard|soft] 强制要求cluster保存集群信息
cluster slots 展示集群中桶的分配信息
cluster keyslot key 该key的crc16值%16383

你可能感兴趣的:(redis,缓存)