Zeppelin 迁移扩容设计(二)—— 简单易用 - Qihoo360/zeppelin GitHub Wiki

需求背景

Zeppelin已有的版本中(0.4.0)中已有的迁移扩容方式比较复杂,需要通过AddSlave,RemoveSlave,SetMaster命令组合实现,使用非常不方便。现希望提供更直观易用的使用方式来完成集群迁移扩容等工作。

  1. 可以控制node节点加入、退出集群,目前所有Ping到 meta的节点都被认为加入,且不能退出。
  2. 简单直观的表级别扩容缩容方式
  3. 可控的表初始化状态

控制节点加入退出(优先级高,简单)

增加节点加入退出集群命令,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时严格按照指定的状态分配副本