一、redis-trib.rb 搭建集群

redis-trib.rb 是采用 Ruby 实现的 Redis 集群管理工具。内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用 之前需要安装 Ruby 依赖环境。下面介绍搭建集群的详细步骤。
内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装 Ruby 依赖环境,相关扩展这个我在 dockerfile 文件当中已经写了指令,查看下理解意思就可以了。
启动好6个节点之后,使用 redis-trib.rb create 命令完成节点握手和槽分配过程

redis-trib.rb create --replicas 1 139.159.141.107:6381  139.159.141.107:6382  139.159.141.107:6383 139.159.141.107:6384 139.159.141.107:6385 139.159.141.107:6386

--replicas 参数指定集群中每个主节点配备几个从节点,这里设置为1, redis-trib.rb 会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列 表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,并且会生成报告

创建集群
create  host1:port1 ... hostN:portN   --replicas <arg> #带上该参数表示是否有从,arg表示从的数量

检查集群 check host:port

查看集群信息 info host:port

修复集群 fix   host:port  -timeout <arg>  

在线迁移slot
reshard  host:port  #个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口                 
 --from <arg>     #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接 传递
--from all,  这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入                  
--to <arg>       #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户 输入。                  
--slots <arg>    #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。                  --yes            #设置该参数,可以在打印执行reshard计划的时候,提示用户输入yes确认后再执行reshard                  
--timeout <arg>  #设置migrate命令的超时时间。                  
--pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。

平衡集群节点slot数量

rebalance host:port                  
        --weight <arg>                  
        --auto-weights                 
        --use-empty-masters                  
        --timeout <arg>                  
        --simulate                  
        --pipeline <arg>                  
        --threshold <arg> 

#将新节点加入集群 
    add-node  new_host:new_port existing_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
#将外部redis数据导入集群
     import  host:port                 
             --from <arg>                  
             --copy                  
             --replace

redis tag能力 redis-trib_redis tag能力

redis tag能力 redis-trib_redis tag能力_02

redis tag能力 redis-trib_redis tag能力_03

redis tag能力 redis-trib_数据_04

二、Redis-cluster原理

在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障等状态信息,Redis 集群采用 Gossip(流言)协议, Gossip 协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播
1) 集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加10000。    

2)每个节点在固定周期内通过特定规则选择几个节点发送 ping 消息。  

3)接收到 ping 消息的节点用 pong 消息作为响应。  
集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致 的状态。 当节点出故障、新节点加入、主从角色变化、槽信息变更等事件发生时,通过不断的 ping/pong 消息通信,经过一段时间后所有的节点都会知道整个集群全部 节点的最新状态,从而达到集群状态同步的目的。

三、集群伸缩原理

redis tag能力 redis-trib_数据_05

我们都指导,这样的每一个节点上面都分配了我们的16384槽中的几个,以及对应槽下面的数据。所以我们在伸缩节点的时候,实质上也是对于哈希槽和槽对应数据的一个调整。

首先我们先来看一下经典集群搭建的分布图:

redis tag能力 redis-trib_Redis_06

三个主节点分别维护自己负责的槽和对应的数据,如果希望加入1个节点实现集群扩容时,需要通过相关命令把一部分槽和数据迁移给新节点:

redis tag能力 redis-trib_redis tag能力_07

        Redis集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容:

总结:集群伸缩就是槽和数据在节点之间移动。
Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。

四、集群扩容操作

扩容是分布式存储最常见的需求,Redis 集群扩容操作可分为如下步骤:

前提准备,目前集群中一共有6台机器,端口号分别是6381、6382、6383、6384、6385、6386

1)准备新节点

准备两个新节点,端口号为6387和6388,配置和以前集群配置一样,并启动这个两个节点。

2)加入集群

redis tag能力 redis-trib_redis tag能力_08

redis tag能力 redis-trib_redis tag能力_09

集群内新旧节点经过一段时间的ping/pong消息通信之后,所有节点会发 现新节点并将它们的状态保存到本地。这个时间按照我们集群的约定时间来确定。

        新节点刚开始都是主节点状态,但是由于没有负责的槽,所以不能接受任何读写操作。对于新节点的后续操作我们一般有两种选择:

  • 为它迁移槽和数据实现扩容。
  • 作为其他主节点的从节点负责故障转移。

    redis-trib.rb工具也实现了为现有集群添加新节点的命令,还实现了直接添加为从节点的支持,命令如下:

redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave     --master-id <arg>

进入集群内任意节点,使用cluster meeet命令即可使新节点加入到集群当中或者使用redis-trib.rb add-node ip地址:新节点端口  ip地址:原节点端口。

redis tag能力 redis-trib_redis_10

3)迁移槽和数据

加入集群后需要为新节点迁移槽和相关数据,槽在迁移过程中集群可以正常提供读写服务,迁移过程是集群扩容最核心的环节,下面详细讲解。
槽是 Redis 集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定原有节点的哪些槽需要迁移到新节点。迁移计划需要确保每个节点负责相似数 量的槽,从而保证各节点的数据均匀,比如之前是三个节点,现在是四个节点,把节点槽分布在四个节点上

redis tag能力 redis-trib_redis_11

 槽迁移计划确定后开始逐个把槽内数据从源节点迁移到目标节点

流程说明:

1)对目标节点发送导入命令,让目标节点准备导入槽的数据。

2)对源节点发送导出命令,让源节点准备迁出槽的数据。

3)源节点循环执行迁移命令,将槽跟数据迁移到目标节点。

redis tag能力 redis-trib_数据_12


redis tag能力 redis-trib_redis_13

redis-trib 提供了槽重分片功能,命令如下:
redis-trib.rb reshard host:port

     --from <arg>

     --to <arg>

     --slots <arg>

     --yes

     --timeout <arg>

     --pipeline <arg>
参数说明:

·--host:   port:必传参数,集群内任意节点地址,用来获取整个集群信息。

·--from:   制定源节点的 id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。

·--to:  需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。

·--slots:  需要迁移槽的总数量,在迁移过程中提示用户输入。

·--yes:       当打印出 reshard 执行计划时,是否需要用户输入yes确认后再执行 reshard。

·--timeout:   控制每次 migrate 操作的超时时间,默认为60000毫秒。

·--pipeline:  控制每次批量迁移键的数量,默认为10。

  • 迁移操作

redis-trib.rb reshard 139.159.141.107:6381
打印出集群每个节点信息后,reshard 命令需要确认迁移的槽数量,这里我们根据节点个数输入对应的值:

redis tag能力 redis-trib_数据_14

输入的节点 ID 作为目标节点,目标节点只能指定一个:
What is the receiving node ID xxxx

redis tag能力 redis-trib_redis_15

之后输入源节点的 ID,这里分别输入相应的节点 ID 最后 用 done 表示结束:

redis tag能力 redis-trib_redis tag能力_16


数据迁移之前会打印出所有的槽从源节点到目标节点的计划,确认计划无误后输入 yes 执行迁移工作

redis-trib 工具会打印出每个槽迁移的进度:

redis tag能力 redis-trib_redis tag能力_17

查看节点的信息cluster-node

redis tag能力 redis-trib_数据_18

输入 redis-trib.rb rebalance ip:port .

 

redis tag能力 redis-trib_Redis_19

五、集群收缩

 收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点。

redis tag能力 redis-trib_redis tag能力_20

redis tag能力 redis-trib_redis tag能力_21

流程说明:

  • 首先需要确定下线节点是否有负责的槽,如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性。
  • 当下线节点不再负责槽或者本身是从节点时,就可以通知集群内其他节点忘记下线节点,当所有的节点忘记该节点后可以正常关闭。

1)下线迁移槽

下线节点需要把自己负责的槽迁移到其他节点,原理与之前节点扩容的迁移槽过程一致,但是过程收缩正好和扩容迁移方向相反,下线节点变为源节点,其他主 节点变为目标节点,源节点需要把自身负责的4096个槽均匀地迁移到其他主节点上。

使用 redis-trib.rb reshard 命令完成槽迁移。由于每次执行 reshard 命令只能有一个目标节点,因此需要执行3次 reshard 命令

准备导出

redis tag能力 redis-trib_Redis_22

指定目标节点
直到6397迁移干净,不放在任何节点

redis tag能力 redis-trib_数据_23

2)忘记节点
由于集群内的节点不停地通过 Gossip 消息彼此交换节点状态,因此需要通过一种健壮的机制让集群内所有节点忘记下线的节点。也就是说让其他节点不再与 要下线节点进行 Gossip 消息交换。 Redis 提供了 cluster forget{downNodeId} 命令实现该功能,会把这个节点信息放入黑名单,但是60s之后会恢复。

redis tag能力 redis-trib_redis_24


生产环境当中使用 redis-trib.rb del-node {host:port}{downNodeId} 命令进行相关操作

redis tag能力 redis-trib_redis_25

注意: redis-trib rebalance 命令选择
适用于节点的槽不平衡的状态,有槽的节点
1、默认节点加入,要先做节点槽的迁移  
2、节点已经迁移了所有的槽信息,并且已经从集群删除后,才可以使用平衡