您的位置:首页 > 数据库 > Redis

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

2016-07-17 15:17 561 查看

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
<node-id>


你在删除一个数据之前必须确认该数据已经清空了,否则你要先把数据分片到其他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:portNCreate命令直接自动生成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
checkhost:port该集群任意一个机器的端口跟ip./redis-trib.rb check 127.0.0.1:7000
infohost:port该集群任意个机器的端口跟ip/redis-trib.rb info 127.0.0.1:7000
fixhost:port –timeout该集群任意个机器的端口跟ip./redis-trib.rb fix 127.0.0.1:7000或者./redis-trib.rb fix –timeout 15 127.0.0.1:7000
reshardhost:port –from –to –slots –yes –timeout –pipeline该命令用于对集群中的桶进行重新分片,该命令存在提示,需要分片那个机器的桶,分配到那个实例去,该命令用于机器调整。./redis-trib.rb reshard 127.0.0.1:7000
rebalancehost:port –weight –auto-weights –use-empty-masters –timeout –simulate –pipeline –threshold对集群中每个实例的桶进行调整./redis-trib.rb rebalance 127.0.0.1:7000
add-nodenewhost:newport existhost:existport slave master-idnewhost: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-nodehost:port node_id集群中任意一个端口要移除的节点node_id如果要移除的节点的node_id的分配有slots时候,无法成功。需要移除slots后才能成功移除,并且删除节点后会停止该实例./redis-trib.rb del-node 127.0.0.1:7000 646d18e2cbc1219d2ac457ec09e3c574ada98dd7
set-timeouthost: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..slotNcluster 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_idRemove节点
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 集群