说明:
Redis集群搭建完成之后,对于后续的操作和使用中进程需要对进群中的服务节点Node进行新增、删除、修改之类的操作,以下记录了在具体环境中对Node的处理:
创建集群的操作可以通过使用位于Redis安装文件夹内的redis-trib.rb来完成,redis-trib.rb是使用ruby开发的Redis集群管理程序,具有创建集群,检查集群的上线情况和槽指派情况、对集群进行重新分片、向集群添加新节点或者从集群中移除节点等功能;
redis-trib.rb参数:
[root@node01src]$ ./redis-trib.rb
Usage:redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
fix host:port
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
add-node new_host:new_portexisting_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
help (show this help)
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
可以看到.使用addnode 命令来添加节点,第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口.
我们可以看到新的节点已经添加到集群中:
新节点现在已经连接上了集群,成为集群的一份子,并且可以对客户端的命令请求进行转向了,但是和其他主节点相比,新节点还有两点区别:
· 新节点没有包含任何数据,因为它没有包含任何哈希槽.
· 尽管新节点没有包含任何哈希槽,但它仍然是一个主节点,所以在集群需要将某个从节点升级为新的主节点时,这个新节点不会被选中。.
接下来,只要使用redis-trib 程序,将集群中的某些哈希桶移动到新节点里面,新节点就会成为真正的主节点了。
有两种方法添加从节点,可以像添加主节点一样使用redis-trib 命令,也可以像下面的例子一样使用 --slave选项:
./redis-trib.rb add-node --slave 127.0.0.1:7006127.0.0.1:7000
此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。
你可以通过下面的命令指定主节点:
./redis-trib.rb add-node --slave --master-id3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
也可以使用CLUSTERREPLICATE 命令添加.这个命令也可以改变一个从节点的主节点。
例如,要给主节点127.0.0.1:7005添加一个从节点,该节点哈希槽的范围1423-16383, 节点 ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我们需要链接新的节点(已经是空的主节点)并执行命令:
redis 127.0.0.1:7006> cluster replicate3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
我们新的从节点有了一些哈希槽,其他的节点也知道(过几秒后会更新他们自己的配置),可以使用如下命令确认:
$ redis-cli -p 7000 cluster nodes | grep slave | grep3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
./redis-cli -h 172.168.63.202 -p 7000 cluster nodes |grep slave | grep e0d02d64b9c14db140daef9b4d2489bbde25fe42
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected
节点 3c3a0c...有两个从节点,7002 (已经存在的) 和 7006 (新添加的).
只要使用redis-tribdel-node 命令即可:
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。
使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上.
替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据.
在Redis集群中会存在改变一个从节点的主节点的情况,需要执行如下命令 :
cluster replicate <new-master-node-id>
在特定的场景下,不需要系统管理员的协助下,自动将一个从节点从当前的主节点切换到另一个主节的自动重新配置的过程叫做复制迁移(从节点迁移),从节点的迁移能够提高整个Redis集群的可用性.
重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面,和创建集群一样,重新分片也可以使用 redis-trib 程序来执行。执行以下命令可以开始一次重新分片操作:
./redis-trib.rb reshard 127.0.0.1:7000
需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。
目前redis-trib 只能在管理员的协助下完成重新分片的工作,要让 redis-trib 自动将哈希槽从一个节点移动到另一个节点,目前来说还做不到
How many slots do you want to move (from 1 to 16384)?
输入:100
尝试从将100个槽重新分片,除了移动的哈希槽数量之外, redis-trib 还需要知道重新分片的目标,也即是,负责接收这 1000 个哈希槽的节点。
What is the receivingnode ID?
输入:e0d02d64b9c14db140daef9b4d2489bbde25fe42
我得目标节点是 e0d02d64b9c14db140daef9b4d2489bbde25fe42.
现在需要指定从哪写节点来移动keys到目标借调我输入的是all ,这样就会从其他每个master上取一些哈希槽。
Do you want to proceedwith the proposed reshard plan (yes/no)?
输入:yes
最后确认后你将会看到每个redis-trib移动的槽的信息,每个key的移动的信息也会打印出来
在重新分片的过程中,你得例子程序是不会受到影响的,你可以停止或者重新启动多次。
在重新分片结束后你可以通过如下命令检查集群状态:
172.168.63.204:7001> cluster slots