
此时新加入的节点 7004 并没有数据,并且也没有被分配 slot 也就是 目前 7004 是不可用的,现在要重新分配原集群的 slot
迁移多少个slots呢,16384/4=4096,那么就迁移4096个。
这里是选择接收方的 node id ,就是执行 cluster nodes 显示7004的字符串。
这里是选择slot的迁出方,我们这边选择的是 all ,也就是所有的节点,总共迁出4096个slot到7004.
中间会让你输入 yes
一顿 *** 作之后
我们看到 7004 已经有slot了 0-1364 5461-6826 10923-12287
输入 yes 之后主从复制就完成了。我们看一下节点没问题了。
redis 集群多了之后,发现现在的有些节点有些多余没用,或者达不到用那么多节点的情况,那么就可以进行 节点的移除, 5.0 版本由于不用 ruby 进行集群 *** 作了,所以方式跟5.0以前有很多不同的地方
我们由于刚刚添加了2个节点,现在把这2个节点删除,需要注意的是,假如你要下线节点7004,节点8004,请务必先下线从节点,并且把节点7004的slot的迁移到其他节点,如果先线下节点7004的话 会发产生故障切换,节点8004成主节点了。
查看一下,已经没有节点8004了
接着删除7004,这个是一个主节点,删除起来比较麻烦一点,因为主节点分配了slot槽, 所以这里我们必须先把 7004的slot槽放到其他的可用节点中去,然后再进行移除节点 *** 作才行,不然会出现数据丢失问题
由于节点7004有4096个slot,那么3个节点平均可以分配 4096/3=1365.3 ,不能有小数,那么我们可以分别分配 1365 , 1365 , 1366 给 7001 , 7002 , 7003 节点
这里输入 1365 和 接收者 7001 的 node id
这里输入你想从那个节点移走数据,我们选 7004 的 node id
其实是让你还可以选择源节点,但是我这里只要把7004 节点分到其它地方就行,如果没有再把其它主节点分摊的需要,此处输入 done即可,否则输入其它节点的ID,最后输入 done
是否按照计划分配,输入 yes
完成!!!
然后继续向另外2个节点分配slot
。。。。
我们最后查看
7004已经没有slot了,那么就可以删除了节点7004了
查看,完美!
执行在任意一个客户端下执行 cluster nodes 命令,可以看到7007 已经作为主节点添加到我们的集群中了,但是可以看到他没有分配哈希槽,没有分配哈希槽的话表示就没有存储数据的能力,所以我们需要将其他节点上的哈希槽分配到这个节点上。搭建集群工作需要以下三个步骤:
1)准备节点。
2)节点握手。
3)分配槽。
Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置cluster-enabled yes,让Redis运行在集群模式下。建议为集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把6个节点配置统一放在conf目录下,集群相关配置如下:
其他配置和单机模式一致即可,配置文件命名规则redis-{port}.conf,准备好配置后启动所有节点。
Cluster集群启动过程如下图:
每个节点目前只能识别出自己的节点信息,可以执行cluster nodes命令获取集群节点状
态。
节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步,由客户端发起命令:cluster meet{ip}{port}
cluster meet命令是一个异步命令,执行之后立刻返回。内部发起与目标节点进行握手通信,握手通信过程:
1)节点6379本地创建6380节点信息对象,并发送meet消息。
2)节点6380接受到meet消息后,保存6379节点信息并回复pong消息。
3)之后节点6379和6380彼此定期通过ping/pong消息进行正常的节点通
信。
分别执行meet命令让其他节点加入到集群中,
最后执行cluster nodes命令确认6个节点都彼此感知并组成集群。
节点建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据读写都被禁止,通过cluster info命令可以获取集群当前状态。
Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过cluster addslots命令为节点分配槽。这里利用bash特性批量设置槽(slots),命令如下:
执行cluster info查看集群状态,如下所示:
当前集群状态是OK,集群进入在线状态。所有的槽都已经分配给节点,执行cluster nodes命令可以看到节点和槽的分配关系:
集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据。使用cluster replicate{nodeId}命令让一个节点成为从节点。其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID,命令如下:
Redis集群模式下的主从复制使用了之前介绍的Redis复制流程,依然支持全量和部分复制。复制(replication)完成后,整个集群的结构如图:
集群搭建需要很多步骤当集群节点众多时,必然会加大搭建集群的复杂度和运维成本。因此Redis官方提供了redis-trib.rb工具方便我们快速搭建集群。
redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维 *** 作,使用之前需要安装Ruby依赖环境。
1、安装Ruby:
2、安装rubygem redis依赖:
3、安装redis-trib.rb:
4、安装完Ruby环境后,执行redis-trib.rb命令确认环境是否正确,输出如
下:
首先我们跟之前内容一样准备好节点配置并启动:
启动好6个节点之后,使用redis-trib.rb create命令完成节点握手和槽分配过程,命令如下:
--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
如果部署节点使用不同的IP地址,redis-trib.rb会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配 *** 作。
集群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作,命令如下:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)