QConf 灰度发布功能说明 - Qihoo360/QConf GitHub Wiki
说明
灰度发布功能允许用户
- 设定一些机器使用新配置,另一些机器使用旧配置,这些配置是已经添加过的
- 观察后全量使用新配置
- 观察后回滚全部使用旧配置
组件支持
要使用灰度功能,需要Qconf agent及管理端接口的配合:
- 目前的最新版agent已经支持灰度发布功能
- c 版manager端接口使用
- php 版manager端接口使用
使用方式
以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 |