所谓的对集群数据进行分片,就是把实例节点的一些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
集群的重新分片无需在交互窗口中进行,我们可以使用下面的命令进行操作
./redis-trib.rb reshard –from 《node-id》 –to 《node-id》 –slots 《number of slots》 –yes 《host》:《port》
当前redi-trrb还没有任何方法对key的转移自动再平衡。
增加实例服务器,就是增加一个主节点或者是从节点,并往其中迁入数据。
启动一个新的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
使用redis-trib,第一个参数是集群中任意一个服务器的ip跟端口,用于定位集群,第二个参数是你要删除node的nodeId
./redis-trib del-node 127.0.0.1:7000
你在删除一个数据之前必须确认该数据已经清空了,否则你要先把数据分片到其他redis实例上去
这些命令是集群所独有的。执行上述命令要先登录
redis集群中的16384个桶如果没有被全部覆盖的话是不能接收客户端任务的,redis3中的16384个桶只能由redis的主实例节点所持有,从实例节点使用在命令行端使用read only命令后可以接收读命令,否则不执行读命令,读写命令都由主实例节点进行,加入redis集群的主实例节点必须分配桶,如果没有分配桶的话,新加入的主实例节点不工作,所以必须使用脚本或者redis3自带的命令进行桶的重新分配。
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 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 |