Zeppelin 迁移扩容设计(二)—— 简单易用 - Qihoo360/zeppelin GitHub Wiki
需求背景
Zeppelin已有的版本中(0.4.0)中已有的迁移扩容方式比较复杂,需要通过AddSlave,RemoveSlave,SetMaster命令组合实现,使用非常不方便。现希望提供更直观易用的使用方式来完成集群迁移扩容等工作。
- 可以控制node节点加入、退出集群,目前所有Ping到 meta的节点都被认为加入,且不能退出。
- 简单直观的表级别扩容缩容方式
- 可控的表初始化状态
控制节点加入退出(优先级高,简单)
增加节点加入退出集群命令,Meta只接受集群集群内节点的心跳,退出集群后,Meta删除该节点的心跳及存活记录。
简单直观表级别扩容缩容方式(优先级高,困难)
扩容缩容是从一个元信息状态到另一个元信息状态的变化,变化的是各个Partition的主从副本所在节点,所以给定一个元信息的epoch和一组变化值DIFF便可以得到目标状态。
对外接口 Expand(Shrink)命令指定对某个Table加入或删除一或多个节点,指定:
- table名
- 一组要增加或删除的节点的ip port。
接口实现:
- 从Meta拉去最新的元信息,记录当前元信息epoch
- 通过获得的元信息及加入的节点数,计算合适的迁移路径,生成一组MoveSlave,MoveMaster操作集合,称为DIFF
- 向Meta发送Migrate命令,包括
- 预期当前epoch
- DIFF信息
Meta支持Migrate命令:
- 检查当前epoch与Migrate预期epoch是否一致,不一致直接返回错误
- 执行每条DIFF,尽量合并变化减少epoch变动
- MoveSlave => AddSlave + WaitOffset + DeleteSlave
- MoveMaster => AddSlave + WaitOffset + SetMaster + DeleteSlave
- 其中AddSlave和DeleteSlave是已有命令,WaitOffset指通知Node阻写或缓写,不断检查当前该Partition在涉及节点的数据偏移量,追齐后执行下一步操作
难点:
- Meta执行DIFF过程中,每条DIFF都会有三个以上的阶段,这些中间状态需要持久化,以便在Meta切主后继续执行
- 这个过程中如果有Node节点状态变化,需要相应处理:
- 源节点由Up变为Down:不影响
- 目的节点由Up变Down:是否要暂停WaitOffset,SetMaster,DeleteSlave
- DIFF执行过程中对后续的DIFF是阻止还是合并
可控的表初始化状态(优先级低,中等)
当前,新建表时,根据已有节点自动考虑机器负载分配Partition副本。某些需求下我们需要控制具体的分配,如克隆集群。
扩展Create Table命令
- 可以指定Table的Partition数,及每个Partition的副本落在那些机器
- Meta执行Create Table时严格按照指定的状态分配副本