集群伸缩
-
伸缩原理
Redis集群提供了灵活的节点扩和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。其原理可抽象为槽和对应数据在不同节点之间灵活移动。
-
扩容集群
扩容是分布式存储最常见的需求,Redis集群扩容操作可分为如下步骤:
1)准备新节点。
2)加入集群。
3)迁移槽和数据。-
准备新节点
需要提前准备好新节点并运行在集群模式下,新节点建议跟集群内的节点配置保持一致,便于管理统一。启动后的新节点作为孤儿节点运行,并没有其他节点与之通信,
-
加入集群
新节点依然采用cluster meet命令计入到现有集群中。在集群中任意节点执行cluster meet命令让新节点计入进来。集群内新旧节点经过一段时间的ping/pong消息通信之后,所有节点会发现新节点并将它们的状态保存到本地。新节点刚开始都是主节点状态,但是由于没有负责的槽,所以不能接受任何读写操作。对于新节点的后续操作我们一般有两种选择:
为它迁移槽和数据实现扩容。
作为其他主节点的从节点负责故障转移。
redis-trib.rb工具也实现了为现有集群添加新节点的命令,还实现了直接添加了为从节点的支持,命令如下:
redis-trib.rb add-node new_host:new_port existing_host:existing_porting --slave --master-id <arg>
内部同样采用cluster meet命令实现加入集群功能。
-
迁移槽和数据
加入集群后需要为新节点迁移槽好相关数据,槽在迁移过程汇总集群可以正常提供读写服务,迁移过程是集群扩容最核心的环节,下面详细讲解。
-
槽迁移计划
槽是Redis集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定原有节点的那些槽需要迁移到新节点。迁移计划需要确保每个节点负责相似数量的槽,从而保证各节点的数据均匀。
-
迁移数据
数据迁移过程是逐个槽进行的,每个槽数据迁移流程说明:
1)对目标节点发送cluster setslot {slot} importing {sourceNodeId}命令,让目标节点准备导入槽的数据。
2)对源节点发送cluster setslot {slot} migrating {targetNodeId}命令,让源节点准备迁出槽的数据。
3)源节点循环执行cluster getkeysinslot {slot} {count}命令,获取count个属于槽(slot)的键。
4)在源节点上执行migrate {targetIp} {targetPort} "" 0 {timeout} keys {key...}命令,把获取的键通过流水线(pipeline)机制批量迁移到目标节点,批量迁移版本的migrate命令在Redis3.0.6以上版本提供,之前的migrate命令只能单个键迁移。对于大量key的场景,批量键迁移将极大降低节点之间网络IO次数。
5)重复执行步骤3)和步骤4)知道槽下所有的减脂数据迁移到目标节点。
6)向集群内所有主节点发送cluster setslot {slot} node {targetNodeId}命令,通知槽分配给目标节点。为了保证槽节点映射变更及时传播,需要遍历发送给所有主节点更新被迁移的槽指向新节点。
-
-
-
收缩集群
收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点。
流程说明:
1)首先需要确定下线节点是否有负责的槽,如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性。
2)当下线节点不在负责槽或者本身是从节点时,就可以通知集群内其他节点忘记下线节点,把所有的节点忘记该节点后可以正常关闭。
-
下线迁移槽
下线节点需要把自己负责的槽迁移到其他节点,原理与之前节点扩容的迁移槽过程一直。
-
忘记节点
由于集群内的节点不停地通过Gossip消息彼此交换节点状态,因此需要通过一种健壮的机制让集群内所有节点忘记下线的节点。也就是说让其他节点不再与要下线节点进行Gossip消息交换。Redis提供了cluster forget {downNodeId}命令实现该功能。
当节点接收到cluster forget {downNodeId}命令后,会把nodeId指定的节点加入到禁用列表中,在禁用列表内的节点不再发送Gossip消息。禁用列表有效期是60秒,超过60秒节点会再次参与消息交换。也就是说当第一次forget命令发出后,我们有60秒的时间让集群内的所有节点忘记下线节点。
当下线主节点具有从节点时需要把该节点指向到其他主节点,因此对于主从节点都下线的情况,建议先下线从节点再下线主节点,防止不必要的全量复制。
-
本节介绍了Redis集群伸缩的原理和操作方式,它是Redis集群化之后最重要的功能,熟练掌握集群伸缩技巧后,可以针对线上的数据规模和并发量做到从容应对。