每天发布1000次变更 - Netflix 的微服务实践和经验_JFrog捷蛙中国的博客-程序员宅基地

技术标签: Netflix  DevOps  Docker  JFrog  

Netflix 背景

Netflix 是欧美地区最大的网络视频提供商,超过了 Youtube。全球每天有超过190个国家,一亿多会员在 Netflix 上观看1.2亿小时的电影,电视剧和纪录片等等。Netflix 也制作了像纸牌屋这样的广受欢迎的电视剧。

 

 

为了支持大流量,高并发的访问,Netflix 网站架构经过了一些列的重构。上图是08年之前 Netflix 的网站架构,可以看到这是一个非常传统的架构。为什么要实现微服务的转型?因为 Netflix 有足够痛的经历,Netflix 在2008年曾经遭遇过一次4天的服务宕机,原因是他们生产环境的数据库挂掉了,并且经过4天才得以修复。

 

 

这是2008年 Netflix 给受影响用户所发送的道歉邮件。所有的用户都收不到他们订购的 DVD。难以想象4天的宕机,业务停滞,为整个开发团队带来多大的压力。

 

痛定思痛,Netflix 决定转型微服务架构,来实现高可用,动态扩容,来应该越来越多的用户访问。Netflix 用了7年时间完成了这个转型,目前,Netflix 的云平台上运行了500个微服务,每天会有100-1000的变更部署到线上环境。线上环境部署在亚马逊3个 Region,9个可用区,为全球用户提供稳定的网络视频服务。来看看 Netflix 实现微服务的原则和经验总结。

Netflix 微服务开发原则

原则1:购买 VS 自己开发

当 Netflix 需要一个功能时,如果有现有的方案可以购买,(当然这里的'购买'不仅仅是购买第三方的服务,也包括开源软件的使用,和贡献。)他们会选择不去开发这个功能。

 

只有在市面或开源社区里没有解决方案时,他们才会考虑自己开发这个功能。这样做的目的,是快速的实现需求,提供服务,而不是将大把的研发资源投入在重复造车轮上。

 

原则2:实现真正无状态服务

不依赖 Sticky Session,你的服务是否是真正的无状态?通过破坏性测试(Chaos Monkey)来验证。

 

由于 Netflix 无法在测试环境完全模拟出真实的线上环境,导致很多微服务的可用性问题在测试环境测试没法发现,但是在线上环境缺频繁发现微服务并不是完全高可用,于是 Netflix 决定在线上环境进行破坏性测试。

 

Chaos Monkey 的作用是识别云环境中的服务,然后随机的对他们进行关闭,对系统实施破坏。可采取的破坏性措施包括:关闭特定服务接口,关闭特定缓存服务,关闭特定DB服务,增加网络丢包率,增大网络延迟等。通过这样的测试来确定自身的微服务是不是真正做到无状态。

 

运行破坏性测试的时机一般是特定的时间点和特定的时间段。Netflix 每周一,五凌晨3点会在生产环境上进行自动化的破坏性测试,来确保他们的服务在生产环境上是真正无状态的。注意,他们是在生产环境上做破坏性测试,因为你永远无法模拟和生产环境一模一样的环境。这样的测试场景能够保证线上碰到问题,能够从容应对。

 

原则3:向上扩展 VS 水平扩展

如果一味的去为机器提高性能,增加 CPU,内存,终将会有一天会遇到瓶颈。如果系统支持水平扩展,那么你扩容的空间是很难达到瓶颈的,特别是在云环境,你可以更容易的获得足够的计算资源。

 

原则4:弹性伸缩的冗余和隔离

任何东西都应该有超过一个的冗余备份,来避免单点失败。在你的集群里,是否能够支持关掉任何一个节点,且你的集群还能正常运行?如果不能,就说明存在单点失败。一旦发生服务异常,要将服务影响到的范围做隔离。

 

实践:数据 - 从关系数据库迁移到 Cassandra

 

Netflix 的开发者为 Cassandra 数据库贡献了很多源代码,其中一个功能就是做跨 Region 的异步数据一致性处理。

 

实践:Netflix 如何定义优先级

 

如何定义任务的优先级?对于这个问题每个团队都会有不同的的选择。在 Netflix,优先级最高的任务,是创新,可靠性是排第二位的,这样保证员工有足够大的空间进行创新,让产品能够快速的迭代。

 

实践:端到端的负责

 

每个团队自行负责产品的设计,架构,开发,构建,部署,运维,支持。团队各自发布自己的模块,团队间模块解耦,升级时向下版本兼容,互不影响。

 

 

当每个团队都独自管理自己的服务时,你会发现公司的组织结构变成的上图所示的样子。每个团队更加的灵活,发布的速度更快,尝试新技术的意愿也更加强烈。

 

实践:区分关注焦点

 

为了让所有业务团队能够独立的交付他们的服务,Netflix 内部有 SRE 团队,为所有业务开发团队提供基础工具链的支撑。SRE 团队关注的问题是基础设施,中间件的提供和运维,包括性能,可靠性,扩展性,安全漏洞,监控等等;业务部门关注的是功能,页面交行等等。让每个团队关注不同的问题,这样的好处是保证团队不会重复去解决相同的问题。

经验总结

微服务是组织结构的变化

当你的组织决定接受全部的变化,那就意味着,你不再需要测试团队,运维团队。这很困难,大部分人不愿意接受变动,这是人员的问题,会被情绪干扰。之前 Netflix 有测试,DBA,运维的团队,现在每个团队自己负责这些任务,SRE 团队负责底层的基础架构和中间件的支持。

 

微服务的落地需要时间

进行微服务落地的这个阶段你会经历:

  • 维护两套系统。

  • 支持两种技术栈。

  • 多主节点数据同步。

     

使用缓存保护数据库

 

Netflix 基于 MemCache 开发了 EVCache。目的在于让更多的缓存被命中。如果没有命中,请求会访问到数据库,这时需要将缓存里补上这条记录。

 

重视运维可视化

在每个服务器上需要看多少监控报表?Netflix 每秒生成2千万监控数据,这些是人工完全无法去观察的,所以需要从这些数据里过滤哪些是异常数据。日志也有同样的需求,需要具备从大量数据中消除噪音的能力,并且将这些数据可视化出来,有了可视化的数据,你才能够对流程进行改进。

 

服务故障处理

首先确认故障的级别是核心业务故障还是非核心业务故障。同时你需要让服务以最快的速度回滚。Netflix 孵化并开源了一个工具叫做 Hystrix。这个工具的作用是帮助分布式服务中增加延迟容错和故障回滚的逻辑。在服务发生故障时,帮助你隔离故障服务的访问接口,提供回滚机制,确保故障不会大面积扩散。

 

进行 Region 级别的破坏性测试。Netflix 举行了一个"ChaosCon"的活动,活动测试目标是将美国西岸数据中心的所有线上服务器进行 Chaos Monkey 测试。有40个工程师参与了在线的抢修恢复,花了4个小时,全部修复了问题。随后又举办了第二次"ChaosCon"活动,这次只有20个工程师,花了两个小时解决了全部问题。到了今天,所有修复的方案都变成了脚本,自动化的修复线上的故障。

 

破坏性测试不仅仅能够测出系统处理故障的能力,而且能够度量团队是否有足够多的人了解整个系统,当问题发生了,是否能够快速找到正确的人解决问题。

 

 

从上图可以看到这是"ChaosCon"测试的实时流量监控。左上角是美国西岸的数据中心,将该中心服务大面积停掉之后,Netflix 会监控到服务的故障区,开始隔离故障区域,通过 DNS 服务迁移用户访问流量到东岸数据中心,直到西岸的服务恢复。

 

"ChaosCon"测试会影响到用户体验,Netflix 每个月会做一次 Region 级别的测试。如果你的目标是真正的高可用,那么你也需要做类似的实践,从这些事故中总结经验教训。

 

容器化

 

容器化可以大大提高开发者的体验,增加开发者的满意度。在 Netflix 实现容器化的时候,社区还没有成熟的容器管理的平台,所以他们自己开发的一套容器管理平台,在这个平台的研发过程中,也孵化出了大量的开源项目。幸运的是,目前容器化管理平台已经有了很多的方案,例如谷歌的 Kubernetes,Apache 的 Mesos,Rancher,Docker 公司的 Swarm 等等,可以去评估,使用,不要去重复造轮子。

 

Netflix 通过深刻的转型,从传统架构的 Java 应用转型成为最超前的微服务架构,并且通过破坏性测试验证了微服务在线上环境的高可用性,为高并发请求提供了强大的支撑。同时,内部团队也开发模式也得到了改进,基础工具链团队提供工具支撑,解决所有开发团队的通用问题,业务团队只需关注业务功能的实现和创新,这样做不仅提升了客户满意度,也大大提高的开发者的满意度。

 

下载JFrog Artifactory 开源版(代替 Nexus):

http://www.jfrogchina.com/open-source/

 

下载JFrog Artifactory 企业版(免费试用):

https://www.jfrog.com/artifactory/free-trial/?lang=zh-hans#High-Availability

 

参考资料:

Chaos Monkey 理论:http://principlesofchaos.org/

Chaos Monkey 源码:https://netflix.github.io/chaosmonkey/

Hystrix 源码:https://github.com/Netflix/Hystrix

 

关于JFrog

世界领先DevOps平台

公司成立于2008年,在美国、以色列、法国、西班牙,以及中国北京市拥有超过200名员工。JFrog 拥有3000多个付费客户,其中知名公司包括如腾讯、谷歌、思科、Netflix、亚马逊、苹果等。连续两年,JFrog 被德勤评选为50家发展最快的技术公司之一,并被评为硅谷增长最快的私营企业之一。

 

联系我们:010-64700538

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangqingjiewa/article/details/96427405

智能推荐

Enabling range-based for loops for custom types_IAMZWH的博客-程序员宅基地

C++11标准对语言引入了许多优秀的、有用的改进。我已经介绍了auto关键字,现在我再来说一下基于范围的for循环。怎样使用?怎样在你自己的类中使用?1. 基于范围的for循环的基本语法现在,几乎每一个语言都能有一个非常方便的实现for循环的方法。C++也有类似的概念;你可以为你的for循环,添加一个container,他就会自动迭代。我们看下面的例子:vector<int> vec;vec.push_back(10);vec.push_back(20);for (int i :

IP首部检验和的计算和举例_weixin_30267697的博客-程序员宅基地

IP首部校验和  首部校验和(16位)字段只检验数据报的首部,不检验数据部分。这里不采用CRC检验码而采用简单的计算方法。  发送端  首先将检验和置零,求首部数据的补码和(包含检验和),因为为零,所以无影响,再对所求结果求反码放入检验和就完成啦  PS:补码和其实就是带循环进位的加法,如果有进位就不断累加最后多处来的再加到末位上即可  接收端  对首部数据再做一...

oracle ogg java_『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南_bellebiself的博客-程序员宅基地

上一文章 《__Win7 配置OGG(Oracle GoldenGate).docx》定下了 两个目标:目标1:给安装的Oracle_11g 创建 两个用户 admin 和 root 。admin 对应了 ADMIN 结构,创建了一个 TB_ TEST表。root 对应了 ROOT 结构,也创建一个 TB_ TEST (表结构一摸一样)。当 admin.TBTEST 中的表数据 变化时,root....

android onSaveInstance方法项目中的实践_weixin_34081595的博客-程序员宅基地

onSaveInstance先做大概了解 onSaveInstance(Bundle outState)方法用于内存回收时,持久化数据用。大多数app会直接改成内存回收后,直接重启app,这样也是有好处的:免去再次打开时,先闪屏再加载数据。 体验不太好。开发也便利,不需要记录状态,直接重启app,简单便捷有优点必然就有缺点:有些界面需要记录状态并在再次打开时恢复当时的状态,明显,...

ajax请求实例源码,jquery ajax 请求小技巧实例分析_weixin_39761573的博客-程序员宅基地

本文实例讲述了jquery ajax 请求小技巧。分享给大家供大家参考,具体如下:jquery 是一个非常好用的js框架,它为我们提供了很多工具。启动异步请求就是很好用的一个工具官方推荐的ajax 请求格式$.ajax({url:"http://xxxxxxxxxxxxxxxxx/",//你的域名dataType:"json", //对服务器返回的结果进行该数据格式处理 我这里写...

随便推点

未启动的应用无法监听到系统广播_张小贝_的博客-程序员宅基地

Q:在 3.1 版本以后,新安装而从未启动过的app不能收到系统的广播(启动完成,网络状态变化之类的);解决方案:1. 将app做成系统应用,直接安装在 system/app 目录下2. 通过第三方应用,发送带 FLAG_INCLUDE_STOPPED_PACKAGES 的广播给stop状态的自己下文转载自 http://www.cnblogs.com/fa

webpackjsonp 还原_「技术」H-FLOW全自动加氢反应仪在硝基还原反应中的应用_weixin_39636540的博客-程序员宅基地

1、实验背景胺类化合物是一类重要的化工产品和有机合成中间体,它被广泛应用于医药、农药、染料等领域。通过将硝基进行还原得到氨基是胺类化合物生产的主要方法。相较于铁粉还原和硫化碱还原等传统还原方法,催化加氢具有能耗低和污染少的优点,是一种适用面广和还原效率高的硝基还原方法。催化加氢进行硝基还原通常是在反应釜内进行,每次反应都要完成H2置换和试压,催化剂需要回收过滤,不仅导致设备的利用率低,还需要繁琐的...

php fetchassoc 跨表,php – 了解fetch_assoc()_威貓的博客-程序员宅基地

让我们试着理解你的代码及其工作原理:$results = $connectToDb->fetch("SELECT * FROM customer");变量$results有一个由查询返回的行集合.集合的大小可以是0到n.$resultsArray = $results->fetch_assoc();该行从集合中获取第一个元素.如果集合为空,则返回NULL.while($row = $r...

mysql 千万级关联查询_MySQL百万级、千万级数据多表关联SQL语句调优_创新工场的博客-程序员宅基地

本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级、千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果)。希望读者能够理解SQL的执行过程,并根据过程优化,走上自己的"成金之路"需要优化的查询:使用explain出现了Using temporary;有分页时出现了Using filesort则表示使用不了索引,需要根据下面...

jdk还有mysql 的安装配置_weixin_45333084的博客-程序员宅基地

mac安装配置jdk+mysql欢迎使用Markdown编辑器jdk 的mbg包是在官网下载OS的1.8版本,直接百度mysql是安装最新的版本,自动进去的时候网页就会根据你当前系统的版本推荐给你哪个版本安装jdk1。点击下载的jdk mbg包,里面有安装程序,傻瓜式安装,默认他给的安装路径就行了,记不住路径没关系,直接在mac上搜索你下载的哪个jdk全名就可以找到2. 安装好之后输入 java -version 3.接下来就是配置jdk环境打开终端输入 vi .bash_profil

Servlet 编程基础_JiangZW187的博客-程序员宅基地_servlet编程

Servlet 编程基础Servlet 是连接 Web 服务器与服务端 Java 程序的协议,是一种通信规范。这个规范是以一套接口的形式体现的。Servlet 规范中包含一套接口。而 Servlet 接口仅仅是其中之一。微观地讲,Servlet 是 Servlet 接口实现类的一个实例对象,是运行在服务器上的一段 Java小程序,即 Server Applet,也就是 Servlet 这个单词的来历。Servlet 的主要功能是根据客户端提交的请求,调用服务器端相关 Java 代码,完成对请求的

推荐文章

热门文章

相关标签