QConf 灰度发布功能说明 - Qihoo360/QConf GitHub Wiki

说明

灰度发布功能允许用户

  • 设定一些机器使用新配置,另一些机器使用旧配置,这些配置是已经添加过的
  • 观察后全量使用新配置
  • 观察后回滚全部使用旧配置

组件支持

要使用灰度功能,需要Qconf agent及管理端接口的配合:

使用方式

以php版本接口为例

  • 使用管理端grayBegin接口,提供要执行灰度功能的节点键值列表及要使用新配置的机器列表,返回值获得标识当前灰度过程的唯一id
  • 以第一步中获得的唯一id为参数调用grayRollback或grayCommit,可进行灰度过程的回滚或全量提交
  • 注意:
    • 一次灰度发布过程在全量提交或回滚后结束
    • 同时进行中的多个灰度发布过程之间不能有机器的交集
    • 同时进行中的多个灰度发布过程之间不能有节点的交集

实现

思路

管理端提供可视化界面接受用户提供的灰度发布相关信息,并将必要的信息,包括节点名节点值等,通过Zookeeper上的指定节点传递给对应客户端agent,需要使用新值的客户端agent用该信息修改共享内存中的对应节点。

zookeeper节点结构

  • 业务节点,普通的存储用户配置的节点
  • 推送文件节点,如 /qconf/__qconf_notify/content/[id]_0,每次灰度发布操作生成一个全局唯一id。节点值为当次灰度发布的所有 业务节点与对应值。当内容超过1M时,需要多个节点存储,/qconf/__qconf_notify/content/count中记录当前推送文件节点个数。
  • 推送通知节点,如 /qconf/__qconf_notify/client/[机器名],每个机器对应一个通知节点,该节点在使用灰度功能时才建立,节点值是为所在灰度发布的推送文件节点id。

客户端

  • agent 启动注册watch推送通知节点,此时该节点可能还不存在。
  • 推送通知节点变化时,agent收到回调,并通过推送文件节点获得所有的灰度信息,包括
    • 节点名
    • idc
    • 节点值
  • agent用该值修改共享内存中对应业务节点内容
  • agent在共享内存维护force项,其中记录所有灰度状态中的节点
  • agent的共享内存扫描线程在其扫描过程中忽略所有force项中记录的节点
  • agent修改业务节点内容后,更新force项,包括:
    • 增加灰度节点
    • 删除灰度节点

限制

  • 一次灰度发布过程在全量提交或回滚后结束,同时进行中的多个灰度发布之间不能有机器的交集(会导致机器与节点多对多的关系,第一版在管理端禁止)
  • 同时进行中的多个灰度发布之间不能有节点的交集

推送文件节点格式

推送文件中需要包含的信息

  • 节点信息,包括节点名,idc,节点值
  • 是否有后续节点,该情况发生在推送文件大小超过1M

采用类似于qconf共享内存中的数据格式,如下:

  | idc len |   idc     |  path len |   path   | value len |    value  |      |
 ------------------------------------------------------------------------------
  |   2     | idc len   |    2      | path len |     4     | value len | byte |