福泉| 西丰| 安西| 防城港| 嘉义县| 小河| 涿鹿| 江苏| 喀什| 曾母暗沙| 大洼| 九台| 玛沁| 多伦| 红古| 辽中| 富川| 土默特左旗| 广丰| 新巴尔虎左旗| 淮南| 文昌| 仲巴| 阿拉尔| 寿宁| 介休| 新源| 津市| 武昌| 定结| 酒泉| 南昌市| 二连浩特| 西林| 太白| 汨罗| 大通| 武川| 河源| 金昌| 那坡| 土默特左旗| 巴东| 巴楚| 乡城| 平川| 绛县| 巴塘| 门源| 盐山| 东莞| 黄岩| 江夏| 和政| 杜集| 宜君| 纳雍| 大英| 墨玉| 永泰| 基隆| 龙胜| 六安| 江西| 丰南| 遵化| 利辛| 沙县| 普安| 和静| 泗水| 阜新市| 都安| 合作| 珙县| 习水| 九龙| 岳池| 罗定| 万载| 大埔| 西峡| 邢台| 西畴| 通许| 深泽| 雷波| 慈溪| 郯城| 汾阳| 平远| 新晃| 都昌| 黄山区| 枞阳| 拜城| 阳山| 石柱| 路桥| 鼎湖| 息县| 凉城| 通化市| 鄂伦春自治旗| 珊瑚岛| 黑水| 揭西| 甘德| 鱼台| 景宁| 阳曲| 揭阳| 施秉| 余庆| 察哈尔右翼前旗| 文山| 苏家屯| 察哈尔右翼后旗| 江夏| 禹城| 泸州| 永安| 费县| 丰城| 东沙岛| 武冈| 天祝| 聊城| 长春| 太仓| 富平| 庆阳| 英山| 奉节| 京山| 金湾| 富锦| 沂南| 牟定| 苍南| 景洪| 西畴| 镇江| 茌平| 澄海| 长安| 姚安| 万安| 龙胜| 比如| 南华| 邕宁| 滑县| 江陵| 加查| 江苏| 扶沟| 沅陵| 浦城| 沧州| 普兰| 云林| 杭州| 溧阳| 牟定| 美溪| 临川| 郏县| 城固| 新安| 拉孜| 达日| 南山| 新平| 颍上| 贵南| 防城区| 林芝县| 铜陵县| 昭苏| 千阳| 灌云| 南昌市| 霍邱| 千阳| 太和| 唐河| 民勤| 珲春| 扎兰屯| 大龙山镇| 徽州| 若羌| 府谷| 乐亭| 融水| 邵武| 顺昌| 南充| 蛟河| 岳阳县| 镶黄旗| 五家渠| 金佛山| 二连浩特| 大方| 阜南| 河池| 佛冈| 安塞| 舒兰| 和顺| 五营| 广州| 凌云| 嵊泗| 梧州| 偃师| 孝感| 瑞安| 环江| 资阳| 芜湖县| 忻城| 凤县| 荣成| 云阳| 迭部| 阜新市| 漯河| 麻栗坡| 萨嘎| 阜宁| 通江| 临汾| 新竹市| 汉寿| 晋江| 葫芦岛| 南涧| 福贡| 香河| 惠安| 西林| 长武| 兰州| 林州| 辽阳市| 香河| 武昌| 乐安| 达县| 施秉| 黄冈| 尼木| 镶黄旗| 建平| 蒙城| 湖南| 砀山| 宜秀| 华安| 花都| 湖北|

v8时时彩娱乐平台:

2018-12-12 15:02 来源:新浪中医

  v8时时彩娱乐平台:

  英国广播公司2018年,中国将迎来改革开放40年,经济议题最受瞩目。他还告诉记者,多年来吴英也始终没有认罪。

刘某又将上述信息出售给严某。翻开宪法序言,从站起来、富起来到强起来,中华民族伟大复兴的历程清晰可见。

  他希望全国各商协会和广大民营企业家,把握民营经济市场机遇,紧扣甘肃优势共赢发展。据悉,5000万用户档案占Facebook北美活跃用户的三分之一,其中差不多四分之一都可能是美国大选中的选民。

  1982年,国务院各部门从100个减为61个,人员编制从原来的万人减为3万人。根据我国税务部门相关规定,商贸企业申报出口退税时,应出具在境内购买货物取得的增值税发票。

一是要利用好国家加强现代农业建设的政策,夯实甘肃现代农业发展的基础;二是利用好国家支持农村民生建设的政策,加快农村地区民生的改善;三是利用好国家加强农村社会事业的政策,提升甘肃农村公共服务能力;四是利用好国家加强生态环境保护和建设的政策,推进甘肃生态文明建设;五是利用好国家支持贫困地区发展的特殊政策,加快农村贫困人口脱贫步伐。

  经过改革试点,北京市已完成六类监察对象摸排认定,监察对象范围扩大,数量大幅增加,实现了对所有行使公权力的公职人员监察全覆盖。

  实践证明,及时把党和人民创造的伟大成就和宝贵经验上升为国家宪法规定,实现党的主张、国家意志、人民意愿的有机统一,是我们党治国理政的一条成功经验。视觉中国《中国经济周刊》记者张燕︱全国两会现场报道责编:周琦近年来,非法集资案件频发。

  北京时间3月17日,Facebook宣布暂时封杀两家裙带机构,一个是其下属涉事机构数据分析公司剑桥分析,另一家是为全球官方机构提供数据分析和战略决策的战略沟通实验室。

  视觉中国《中国经济周刊》记者张燕︱全国两会现场报道责编:周琦近年来,非法集资案件频发。为者常成,行者常至,只要我们始终发扬伟大民族精神,只要我们始终有人民支持和参与,就没有攻克不了的难关,就没有克服不了的困难,就没有成就不了的伟业。

  中远恒信在此次峰会上认为新时代下产业转型趋势已经逐步向文娱、通讯、科技创新、人工智能等新型行业靠拢。

  习近平总书记指出,维护宪法权威,就是维护党和人民共同意志的权威。

  接受监督去年两次主动向市人大常委会做专题汇报监察法中专列对监察机关和监察人员的监督一章,要求监察机关接受本级人民代表大会及其常委会的监督,民主监督、社会监督、舆论监督。其中,移民管理局将负责协调拟订移民政策并组织实施,牵头协调三非外国人治理和非法移民遣返等;国家国际发展合作署将推进援外方式改革并编制具体对外援助计划等。

  

  v8时时彩娱乐平台:

 
责编:
首页 > 大数据 > 正文

Spark灰度发布在十万级节点上的实践

2018-12-12 10:32:23  来源:Spark

摘要:Spark 灰度发布在十万级节点上的实践本文介绍了顶级互联网公司数万节点下 Spark 的 CI 与 CD & CD 灰度发布实践。包含如何维护源代码,如何维护 Release 多版本,开发版与正式版,以及如何实现灰度发布,如何进行 hotfix 等。为了提高本文内容的可借鉴性,隐去了公司特有内容,只保留通用部分。
关键词: Spark
  Spark 灰度发布在十万级节点上的实践本文介绍了顶级互联网公司数万节点下 Spark 的 CI 与 CD & CD 灰度发布实践。包含如何维护源代码,如何维护 Release 多版本,开发版与正式版,以及如何实现灰度发布,如何进行 hotfix 等。为了提高本文内容的可借鉴性,隐去了公司特有内容,只保留通用部分。

  CI 介绍

  持续集成是指,及时地将最新开发的且经过测试的代码集成到主干分支中。

\
Continuous Integration

  持续集成的优点

  快速发现错误 每次更新都及时集成到主干分支中,并进行测试,可以快速发现错误,方便定位错误

  避免子分支大幅偏离主干分支 主干在不断更新,如果不经常集成,会产生后期集成难度变大,甚至难以集成,并造成不同开发人员间不必要的重复开发

  为快速迭代提供保障 持续集成为后文介绍的持续发布与持续部署提供了保证

  Spark CI 实践

  目前主流的代码管理工具有,Github、Gitlab等。本文所介绍的内容中,所有代码均托管于私有的 Gitlab 中。

  鉴于 Jenkins 几乎是 CI 事实上的标准,本文介绍的 Spark CI CD & CD 实践均基于 Jenkins 与 Gitlab。

  Spark 源码保存在 spark-src.git 库中。

  由于已有部署系统支持 Git,因此可将集成后的 distribution 保存到 Gitlab 的发布库(spark-bin.git)中。

  每次开发人员提交代码后,均通过 Gitlab 发起一个 Merge Requet (相当于 Gitlab 的 Pull Request)

  每当有 MR 被创建,或者被更新,Gitlab 通过 Webhook 通知 Jenkins 基于该 MR 最新代码进行 build。该 build 过程包含了

  编译 Spark 所有 module

  执行 Spark 所有单元测试

  执行性能测试

  检查测试结果。如果有任意测试用例失败,或者性能测试结果明显差于上一次测试,则 Jenkins 构建失败

  Jenkins 将 build 结果通知 Gitlab,只有 Jenkins 构建成功,Gitlab 的 MR 页面才允许 Merge。否则 Gitlab 不允许 Merge

  另外,还需人工进行 Code Review。只有两个以上的 Reviewer 通过,才能进行最终 Merge

  所有测试与 Reivew 通过后,通过 Gitlab Merge 功能自动将代码 Fast forward Merge 到目标分支中

  该流程保证了

  所有合并进目标分支中的代码都经过了单元测试(白盒测试)与性能测试(黑盒测试)

  每次发起 MR 后都会及时自动发起测试,方便及时发现问题

  所有代码更新都能及时合并进目标分支

  Spark CD 持续交付

  CD 持续交付介绍


  持续交付是指,及时地将软件的新版本,交付给质量保障团队或者用户,以供评审。持续交付可看作是持续集成的下一步。它强调的是,不管怎么更新,软件都是可随时交付的。

  这一阶段的评审,一般是将上文集成后的软件部署到尽可能贴近生产环境的 Staging 环境中,并使用贴近真实场景的用法(或者流量)进行测试。

\
Continuous Delivery

  持续发布的优点

  快速发布 有了持续集成与持续发布,可快速将最新功能发布出来,也可快速修复已知 bug

  快速迭代 由于发布及时,可以快速判断产品是否符合产品经理的预期或者是否能满足用户的需求

  Spark CD 持续发布实践

  这里有提供三种方案,供读者参考。推荐方案三

  方案一:单分支

  正常流程


  如下图所示,基于单分支的 Spark 持续交付方案如下

  所有开发都在 spark-src.git/dev(即 spark-src.git 的 dev branch) 上进行

  每周一将当前最新代码打包,放进 spark-bin.git/dev 的 spark-${ build # }(如图中第 2 周的 spark-72)文件夹内

  spark-prod 指向当前 spark-dev 指向的文件夹(如图中的 spark-71 )

  spark-dev 指向 spark-${ build # }(如图中的 spark-72)

  自动将 spark-bin.git 最新内容上线到 Staging 环境,并使用 spark-dev 进行测试

  spark-prod 比 spark-dev 晚一周(一个 release 周期),这一周用于 Staging 环境中测试

\
Continuous Delivery Solution 1

  注:

  蓝色圆形是正常 commit

  垂直虚线是发布时间点,week 1、week 2、week 3、week 4

  最上方黑色粗横线是源码时间线

  下方黄色粗横线是 release 时间线

  绿色方框是每周生成的 release,带 build #

  蓝色方框是开发版本的 symbolic

  橘色方框是线上版本的 symbolic

  bug fix

  在 Staging 环境中发现 spark-dev 的 bug 时,修复及集成和交付方案如下

  如果在 Staging 环境中发现了 spark-dev 的 bug,且必须要修复(如不修复,会带到下次的 spark-prod 的 release 中),则提交一个 commit,并且 commit message 包含 bugfix 字样(如图中黑色圆形 commit 9 所示)

  该 bugfix 被 Merge 后,Jenkins 得到通知

  Jenkins 发现该 commit 是 bugfix,立即启动构建,生成spark-${ build # }(如图中的 spark-73)

  spark-dev 指向 spark-${ build # } (如图中的 spark-73 )

\
Continuous Delivery Solution 1 bug fix

  hot fix

  生产环境中发现 bug 时修复及交付方案如下

  如果发现线上版本(即 spark-prod)有问题,须及时修复,则提交一个 commit,并且 commit message 包含 hotfix 字样 (如图中红色圆形 commit 9 所示)

  该 hotfix 被 Merge 后,Jenkins 得到通知

  Jenkins 发现该 commit 是 hotfix,立即启动构建,生成 spark-${ build # }(如图中的 spark-73)

  spark-dev 与 spark-prod 均指向 spark-${ build # } (如图中的 spark-73 )

\
Continuous Delivery Solution 1 hotfix

  Pros.

  spark-src.git 与 spark-bin.git 都只有一个分支,维护方便

  spark-prod 落后于 spark-dev 一周(一个 release),意味着 spark-prod 都成功通过了一周的 Staging 环境测试

  Cons.

  使用 spark-prod 与 spark-dev 两个 symbolic,如果要做灰度发布,需要用户修改相应路径,成本较高

  hotfix 时,引入了过去一周多(最多两周)未经 Staging 环境中通过 spark-dev 测试的 commit,增加了不确定性,也违背了所有非 hotfix commit 都经过了一个发布周期测试的原则

  方案二:两分支

  正常流程

  如下图所示,基于两分支的 Spark 持续交付方案如下

  spark-src.git 与 spark-bin.git 均包含两个分支,即 dev branch 与 prod branch

  所有正常开发都在 spark-src.git/dev 上进行

  每周一(如果是 weekly release)从 spark-src.git/dev 打包出一个 release 放进 spark-bin.git/dev 的 spark-${ build # } 文件夹内(如图中第 2 周上方的的 spark-2 )。它包含了之前所有的提交(commit 1、2、3、4)

  spark-bin.git/dev 的 spark 作为 symbolic 指向 spark-${ build # } 文件夹内(如图中第 2 周上方的的 spark-2)

  spark-src.git/prod 通过 fast-forward merge 将 spark-src.git/dev 一周前最后一个 commit 及之前的所有 commit 都 merge 过来(如图中第 2 周需将 commit 1 merge 过来)

  将 spark-src.git/prod 打包出一个 release 放进 spark-bin.git/prod 的 spark-${ build # } 文件夹内(如图中第 2 周下方的的 spark-1 )

  spark-bin.git/prod 的 spark 作为 symbolic 指向 spark-${ build # }

\
Continuous Delivery Solution 2

  bug fix

  在 Staging 环境中发现了 dev 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/dev上提交一个 commit (如图中黑色的 commit 9),且 commit message 包含 bugfix 字样

  Jenkins 发现该 commit 为 bugfix 后,立即构建,从 spark-src.git/dev 打包生成一个 release 并放进 spark-bin.git/dev 的 spark-${ build # } 文件夹内(如图中第二周与第三周之间上方的的 spark-3 )

  spark-bin.git/dev 中的 spark 作为 symbolic 指向 spark-${ build # }

\
Continuous Delivery Solution 2 bugfix

  hot fix

  在生产环境中发现了 prod 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/dev 上提交一个 commit(如图中红色的 commit 9),且 commit message 包含 hotfix 字样

  Jenkins 发现该 commit 为 hotfix 后,立即将 spark-src.git/dev 打包生成 release 并 commit 到 spark-bin.git/dev 的 spark-${ build # } (如图中上方的 spark-3 )文件夹内。 spark 作为 symbolic 指向该 spark-${ build # }

  通过 cherry-pick 将 commit 9 double commit 到 spark-src.git/prod(如无冲突,则该流程全自动完成,无需人工参与。如发生冲突,通过告警系统通知开发人员手工解决冲突后提交)

  将 spark-src.git/prod 打包生成 release 并 commit 到 spark-bin.git/prod 的 spark-${ build # } (如图中下方的 spark-3 )文件夹内。spark作为 symbolic 指向该spark-${ build # }

\
Continuous Delivery Solution 2 hotfix

  Pros.

  无论是 dev 版还是 prod 版,路径都是 spark。切换版对用户透明,无迁移成本

  方便灰度发布

  hotfix 不会引入未经测试的 commit,稳定性更有保障

  prod 版落后于 dev 版一周(一个 release 周期),即 prod 经过了一个 release 周期的测试,稳定性强

  Cons.

  hot fix 时,使用 cherry-pick,但 spark-src.git/dev(包含 commit 1、2、3、4、5) 与 spark-src.git/prod(包含 commit 1) 的 base 不一样,有发生冲突的风险。一旦发生冲突,便需人工介入

  hot fix 后再从 spark-src.git/dev 合并 commit 到 spark-src.git/prod 时需要使用 rebase 而不能直接 fast-forward merge。而该 rebase 可能再次发生冲突

  bug fix 修复的是当前 spark-bin.git/dev的 bug,即图中的 commit 1、2、3、4 后的 bug,而 bug fix commit 即 commit 9 的 base 是 commit 5,存在一定程度的不一致

  bug fix 后,第 3 周时,最新的 spark-bin.git/dev 包含了 bug fix,而最新的 spark-bin.git/prod 未包含该 bugfix (它只包含了 commit 2、3、4 而不包含 commit 5、9)。只有到第 4 周,spark-bin.git/prod 才包含该 bugfix。也即 Staging 环境中发现的 bug,需要在一周多(最多两周)才能在 prod 环境中被修复。换言之,Staging 环境中检测出的 bug,仍然会继续出现在下一个生产环境的 release 中

  spark-src.git/dev 与 spark-src.git/prod 中包含的 commit 数一致(因为只允许 fast-forward merge),内容也最终一致。但是 commit 顺序不一致,且各 commit 内容也可能不一致。如果维护不当,容易造成两个分支差别越来越大,不易合并

  方案三:多分支

  正常流程


  如下图所示,基于多分支的 Spark 持续交付方案如下

  正常开发在 spark-src.git/master 上进行

  每周一通过 fast-forward merge 将 spark-src.git/master 最新代码合并到 spark-src.git/dev。如下图中,第 2 周将 commit 4 及之前所有 commit 合并到 spark-src.git/dev

  将 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如下图中第 2 周的 spark-2) 文件夹内。spark 作为 symbolic,指向该 spark-${ build # }

  每周一通过 fast-forward merge 将 spark-src.git/master 一周前最后一个 commit 合并到 spark-src.git/prod。如第 3 周合并 commit 4 及之前的 commit

  上一步中,如果 commit 4 后紧临有一个或多个 bugfix commit,均需合并到 spark-src.git/prod 中,因为它们是对 commit 4 进行的 bug fix。后文介绍的 bug fix 流程保证,如果对 commit 4 后发布版本有多个 bug fix,那这多个 bug fix commit 紧密相连,中间不会被正常 commit 分开

  将 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如下图中第 2 周的 spark-2) 文件夹内。spark 作为 symbolic,指向该 spark-${ build # }

\
Continuous Delivery Solution 3

  bug fix

  在 Staging 环境中发现了 dev 版本的 bug 时,修复及集成和交付方案如下

  如下图中,第 2 周与第 3 周之间在 Staging 环境中发现 dev 版本的 bug,在 spark-src.git/dev(包含 commit 1、2、3、4) 上提交一个 commit(如图中黑色的 commit 9),且 commit message 中包含 bugfix 字样

  Jenkins 发现该 bugfix 的 commit 后立即执行构建,将 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如图中的 spark-3) 文件夹内,spark 作为 symbolic,指向该 spark-${ build # }

  通过 git checkout master 切换到 spark-src.git/master ,再通过 git rebase dev 将 bugfix 的 commit rebase 到 spark-src.git/master,如果 rebase 发生冲突,通过告警通知开发人员人工介入处理冲突

  在一个 release 周期内,如发现多个 dev 版本的 bug,都可按上述方式进行 bug fix,且这几个 bug fix 的 commit 在 spark-src.git/dev上顺序相连。因此它们被 rebase 到 spark-src.git/master 后仍然顺序相连

\
Continuous Delivery Solution 3 bugfix

  hot fix

  在生产环境中发现了 prod 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/prod 中提交一个 commit,且其 commit message 中包含 hotfix 字样

  Jenkins 发现该 commit 为 hotfix,立即执行构建,将 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如图中的 spark-3) 文件夹内,spark 作为 symbolic,指向该 spark-${ build # }

  通过 git checkout master 切换到 spark-src.git/master,再通过 git rebase prod 将 hotfix rebase 到 spark-src.git/master

  在一个 release 周期内,如发现多个 prod 版本的 bug,都可按上述方式进行 hot fix

\
Continuous Delivery Solution 3 hotfix

  灰度发布

  本文介绍的实践中,不考虑多个版本(经实践检验,多个版本维护成本太高,且一般无必要),只考虑一个 prod 版本,一个 dev 版本

  上文介绍的持续发布中,可将 spark-bin.git/dev 部署至需要使用最新版的环境中(不一定是 Staging 环境,可以是部分生产环境)从而实现 dev 版的部署。将 spark-bin.git/prod部署至需要使用稳定版的 prod 环境中

  回滚机制

  本文介绍的方法中,所有 release 都放到 spark-${ build \# } 中,由 spark 这一 symbolic 选择指向具体哪个 release。因此回滚方式比较直观

  对于同一个大版本(dev 或者 prod)的回滚,只需将 spark 指向 build # 较小的 release 即可

  如果是将部分环境中的 prod 版迁至 dev 版(或者 dev 版改为 prod 版)后,需要回滚,只需将 dev 改回 prod 版(或者将 prod 版改回 dev 版)即可

  Pros.

  正常开发在 spark-src.git/master 上进行,Staging 环境的 bug fix 在 spark-src.git/dev 上进行,生产环境的 hot fix 在 spark-src.git/prod 上进行,清晰明了

  bug fix 提交时的 code base 与 Staging 环境使用版本的 code 完全一致,从而可保证 bug fix 的正确性

  bug fix 合并回 spark-src.git/master 时使用 rebase,从而保证了 spark-src.git/dev 与 spark-src.git/master 所有 commit 的顺序与内容的一致性,进而保证了这两个 branch 的一致性

  hot fix 提交时的 code base 与 生产环境使用版本的 code 完全一致,从而可保证 hot fix 的正确性

  hot fix 合并回 spark-src.git/master 时使用 rebase,从而保证了 spark-src.git/dev 与 spark-src.git/master 所有 commit 的顺序性及内容的一致性,进而保证了这两个 branch 的一致性

  开发人员只需要专注于新 feature 的开发,bug fix 的提交,与 hot fix 的提交。所有的版本维护工作全部自动完成。只有当 bug fix 或 hot fix rebase 回 spark-src.git/master 发生冲突时才需人工介入

  spark-bin.git/dev 与 spark-bin.git/prod 将开发版本与生产版本分开,方便独立部署。而其路径统一,方便版本切换与灰度发布

  Cons.

  在本地 spark-src.git/master 提交时,须先 rebase 远程分支,而不应直接使用 merge。在本方案中,这不仅是最佳实践,还是硬性要求

  虽然 bug fix 与 hot fix commit 都通过 rebase 进入 spark-src.git/master。但发生冲突时,需要相应修改 spark-src.git/master上后续 commit。如上图中,提交红色 commit 9 这一 hot fix 后,在 rebase 回 spark-src.git/master 时,如有冲突,可能需要修改 commit 2 或者 commit 3、4、5。该修改会造成本地解决完冲突后的版本与远程版本冲突,需要强制 push 回远程分支。该操作存在一定风险

  Spark CD 持续部署

  持续部署是指,软件通过评审后,自动部署到生产环境中

\
Continuous Deploy

  上述 Spark 持续发布实践的介绍都只到 "将 *** 提交到 spark-bin.git" 结束。可使用基于 git 的部署(为了性能和扩展性,一般不直接在待部署机器上使用 git pull --rebase,而是使用自研的上线方案,此处不展开)将该 release 上线到 Staging 环境或生产环境

  该自动上线过程即是 Spark 持续部署的最后一环
第二十七届CIO班招生
北达软第一期EXIN隐私与数据保护基础认证培训
法国布雷斯特商学院MBA班招生
法国布雷斯特商学院硕士班招生
责编:zhangxuefeng
白竹园 蓝烟铁路 重华居委会 瓦房子镇 火车站开发区
祯旺乡 流顺乡 北杨洼村 石家庄经济技术开发区虚拟乡 黑妞城