first commit

This commit is contained in:
张乾
2024-10-16 10:26:46 +08:00
parent 4d66554867
commit b67b8755e1
84 changed files with 15156 additions and 0 deletions

View File

@ -0,0 +1,54 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
00 开篇词 带给你不一样的运维思考
你好,我是赵成,来自蘑菇街。
大概在9月份的时候我接到了极客时间团队的邀请看是否可以做一个运维专栏当时第一反应是略感兴奋这还真是个意外的邀请。但是接来下我的反应就是诚惶诚恐因为我自己写公众号也有一段时间了深知持续高质量输出这个事情的挑战之大特别是在输出专业文章上更是如此所以当时一直拿不定主意。
我写公众号文章,很大程度是因为之前有过很多次公开演讲和分享,后来发现演讲所面向的受众和时间有限,分享的内容无论是在沉淀、传播以及深度上,都会受到很大的限制。总之,讲得不过瘾,索性就把一些我觉得还值得更深入探讨的话题和内容完完整整地写出来。
后来,在上海跟极客时间团队见面之后,他们给了我一些建议,因为之前的文章更多是针对一个个观点延伸出去写作,而专栏文章可以尝试更系统地输出,能够把一个运维体系讲透。这个建议从一定程度上打开了我写专栏的思路,后来我把内容规划了一下,感觉还是可以输出一些更有价值的内容,就启动了这个专栏的策划。
谈谈运维的价值
我们在大学的软件工程中就学过从软件生命周期的角度看软件开发阶段只占整个生命周期的20%~30%左右,软件运行维护阶段是最长尾的,这条规律放在当前这个时代同样适用。
在软件生命周期中,我们可以很清晰地划分出“开发阶段”和“运维阶段”,这个分界点就从开发完成代码开发,测试验收通过后,交付到运维手上的软件包开始,自此之后的阶段就是软件的运行维护阶段了。
一个公司对于开发的诉求应该是全力实现业务需求并将需求尽快发布上线以实现商业上的收益。但是在一个公司里除了专注于业务需求的开发和测试角色外还会有另外一大类开发比如我们常见的中间件开发、稳定性开发、工具开发、监控开发、IaaS或PaaS平台开发甚至专注于底层基础架构的内核开发、网络开发、协议开发等等。
这里请你跟我一起仔细思考下,我们会发现除了业务开发和测试外,前面所提到的那些技术岗位都是为软件生命周期中的运行维护阶段服务的,这些角色的作用就是提升研发效率和稳定性,进而降低成本。虽然他们并没有全部被定义为运维岗位,但是本质上他们是跟业务软件的运行维护阶段直接相关的。
所以,从运维的范畴上来讲,我认为,一个研发团队内,除去业务需求实现层面的事情,其它都是运维的范畴,这个范畴内的事情本质上都是在为软件生命周期中的运行维护阶段服务。
我之前在外部分享,一直表达的一个观点就是,运维能力是整体技术架构能力的体现,运维层面爆发的问题或故障,一定是整体技术架构中存在问题,割裂两者,单纯地看技术架构或运维都是毫无意义的。
但是,我们在绝大多数情况下,忽略了这个隐藏在软件生命周期中真正的运维范畴,而是简单直接地从软件生命周期分段的角度,生硬地给开发和运维划定了一条界限。
也正是这样一个简单直接的界限划定,让我们将运维仅仅局限在了服务器维护、网络设备配置、软件安装维护这些最末端的职责上,而我们又期望运维这个角色能够掌控全局,不要在这个阶段出现任何问题。这就很像临渴而掘井,是不现实的。
很显然,我认为,运维思路上的转变,远比单纯提升运维技术更有价值,而运维真正的价值应该跟研发团队保持一致,真正聚焦到效率、稳定和成本上来。
而这也正是我们很多公司和团队,当前所遇到的最大的痛点和问题。所以,在我的专栏里,我会针对这些痛点和问题分享一些我的思考。
专栏内容
我的专栏内容,会聚焦在分布式软件架构下的应用运维这个领域,更多的是我对运维的一些架构思考,主要有以下四个部分。
应用运维体系建设。这是我们做运维的基础,我会分享从标准化和应用生命周期开始,如何一步步建立运维技术体系和组织架构,以及整个过程中的沟通协作等方面;分享我们应该如何树立正确的运维建设思路。
效率和稳定性等方面的最佳实践。这些是运维价值的体现,我会围绕持续交付和稳定性建设两个方面,分享如何打造不需要任何运维参与的端到端交付过程,如何在实践中锤炼出稳定性保障体系。
云计算方面的思考和实践。云计算技术的蓬勃发展为我们的业务和技术提供了更多的可能性利用好云这个平台将会是运维升级转型的必备要求。我会分享在混合云、云存储、静态化以及CDN上的实践经验以及这些实践所带来的在成本和体验上的巨大收益。
个人成长与趋势热点分析。这一部分更多的会是我个人的一些思考,包括运维技术发展趋势、团队管理、个人成长、热门事件解析、观点碰撞等。
希望在这个专栏里,能够跟你有更多的互动和交流,希望我们在观点碰撞中共同进步。
最后,开卷有益,期望能够带给你不一样的运维思考。

View File

@ -0,0 +1,107 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
01 为什么Netflix没有运维岗位
众所周知Netflix是业界微服务架构的最佳实践者其基于公有云上的微服务架构设计、持续交付、监控、稳定性保障都为业界提供了大量可遵从的原则和实践经验。
Netflix超前提出某些理念并付诸实践以至于在国内众多互联网公司的技术架构上也可以看到似曾相识的影子。当然殊途同归也好经验借鉴也罢这都不影响Netflix业界最佳实践者的地位。
同样在运维这个细分领域Netflix仍然是最佳实践的典范。所以专栏的开始就让我们一起看看世界顶级的互联网公司是如何定义运维以及如何开展运维工作的。
Netflix运维现状
准确一点说Netflix是没有运维岗位的和运维对应的岗位其实是我们熟知的SRESite Reliability Engineer。但我们知道SRE≠运维SRE理念的核心是用软件工程的方法重新设计和定义运维工作。
也就是要改变之前靠人去做运维的方式,转而通过工具体系、团队协作、组织机制和文化氛围等方式去改变,同时将之前处于研发体系最末端的运维,拉回到与开发肩并肩的同一起跑线上。
但是Netflix的神奇和强大之处在于连Google都非常重视和大力发展的SRE岗位在Netflix却没有几个。按照Netflix一位技术主管Katharina Probst在今年9月份更新的博客中所描述在1亿用户每天1.2亿播放时长、万级微服务实例的业务体量下SRE人数竟然不超过10个他们称这样的角色为Core SRE。描述具体如下
100+ Million members. 125+ Million hours watched per day. Hundreds of
microservices. Hundreds of thousands of instances. Less than 10 Core
SREs.
不可否认Netflix拥有强大的技术实力和全球最优秀的工程师团队。按照SRE的理念完全可以打造出这一系列的工具产品来取代运维和SRE的工作。但是能够做到如此极致就不得不让人惊叹和好奇Netflix到底是怎么做到的
为什么Netflix会做得如此极致
这确实是一个很有意思的问题带着这样的疑问阅读了大量的Netflix技术文章和公开的演讲内容之后我想这个问题可以从Netflix的技术架构、组织架构、企业文化等几个方面来看。
1.海量业务规模下的技术架构和挑战
前面我也提到Netflix在业务高速发展以及超大规模业务体量的驱动下引入了更为灵活的微服务架构而且已经成为业界的最佳实践典范。
引入微服务架构后,软件架构的细化拆分和灵活多变,大大提升了开发人员的开发效率,继而也就提升了业务需求的响应和迭代速度,我想这也正是微服务思想在业界能够被广泛接受和采用的根本原因。
但是这也并不是说没有一点代价和成本,随之而来的便是架构复杂度大大增加,而且这种复杂度已经远远超出人的认知能力,也就是我们已经无法靠人力去掌控了,这也就为后续的交付和线上运维带来了极大的难度和挑战。
这时,微服务架构下的运维就必须要靠软件工程思路去打造工具支撑体系来支持了,也就是要求微服务架构既要能够支持业务功能,还要能够提供和暴露更多的在后期交付和线上运维阶段所需的基础维护能力。
简单举几个例子比如服务上下线、路由策略调整、并发数动态调整、功能开关、访问ACL控制、异常熔断和旁路、调用关系和服务质量日志输出等等要在这些能力之上去建设我们的运维工具和服务平台。
讲到这里,我们可以看到,微服务架构模式下,运维已经成为整体技术架构体系中必不可少的一部分,而且与微服务架构相关的体系是紧密相连不可拆分的。
我们现在看到很多跟SRE相关的文章或内容对于SRE产生原因的解释大多是说为了缓解开发和运维之间的矛盾树立共同的目标让双方能够更好地协作配合。这样理解也没有太大的问题但是我认为不够充分或者说以上这些只能算是结果但不是背后的根本原因。
我理解的这背后最根本的原因是,微服务架构复杂度到了一定程度,已经远远超出单纯的开发和单纯的运维职责范畴,也远远超出了单纯人力的认知掌控范围,所以必须寻求在此架构之上的更为有效和统一的技术解决方案来解决复杂度认知的问题。进而,在这一套统一的技术解决方案之上,开发和运维产生了新的职责分工和协作方式。
目前业界火热的DevOps理念及衍生出来的一系列话题我们可以仔细思考一下其实也是同样的背景和逻辑。DevOps想要解决的开发和运维之间日益严重的矛盾究其根本还是微服务架构背后带来的技术复杂度在不断提升的问题。
Netflix带给我们的启示一微服务架构模式下我们必须换一个思路来重新定义和思考运维运维一定要与微服务架构本身紧密结合起来。
2.更加合理的组织架构和先进的工具体系及理念
我上面提到,在微服务架构模式下,运维已经成为整体技术架构和体系中不可分割的一部分,两者脱节就会带来后续一系列的严重问题。
从这一点上不得不说Netflix的前瞻性和技术架构能力还是很强的。因为早在2012年甚至更早之前Netflix就已经意识到了这个问题。在组织架构上将中间件、SRE、DBA、交付和自动化工具、基础架构等团队都放在统一的云平台工程Cloud and Platform Engineering这个大团队下在产品层面统一规划和建设从而能够最大程度地发挥组织能力避免了开发和运维的脱节。
当然这个团队不仅没让大家失望还给我们带来了太多惊喜。业界大名鼎鼎的NetflixOSS开源产品体系里绝大部分的产品都是这个团队贡献的。
比如持续交付系统Spinnaker稳定性保障工具体系Chaos Engineering这里面最著名的就是那只不安分的猴子也正是这套稳定性理念和产品最大程度地保障了Netflix系统的稳定运行被Spring Cloud引入并得以更广泛传播的Common Runtime Service&Libraries而且大家选用Spring Cloud基本就是冲着Spring Cloud Netflix这个子项目去的。当然还有很多其它优秀的开源产品这里我就不一一介绍了。
Netflix带给我们的启示二合理的组织架构是保障技术架构落地的必要条件用技术手段来解决运维过程中遇到的效率和稳定问题才是根本解决方案。
3.自由与责任并存的企业文化
上面讲了这么多看上去好像就是SRE常见的理念和套路只不过Netflix在开源和分享上更加开放和透明让我们有机会更多地了解到一些细节。但是为什么Netflix会做的如此极致呢好像我们一直没有回答到这个问题那这里就不得不提Netflix的企业文化了。
Netflix的企业文化是 Freedom & Responsibility也就是自由和责任并存高度自由的同时也需要员工具备更强的责任心和Owner意识。
体现在技术团队中就是You Build ItYou Run It。工程师可以随时向生产环境提交代码或者发布新的服务但是同时你作为Owner要对你发布的代码和线上服务的稳定运行负责。
在这种文化的驱使下技术团队自然会考虑从开发设计阶段到交付和线上运维阶段的端到端整体解决方案而不会是开发就只管需求开发后期交付和维护应该是一个叫运维的角色去考虑。No文化使然在Netflix是绝对不允许这种情况存在的你是开发你就是Owner你就要端到端负责。
所以短短两个英文单词Freedom & Responsibility却从源头上就决定了团队和员工的做事方式。
Netflix带给我们的启示三Owner意识很重要正确的做事方式需要引导这就是优秀和极致的距离。
总结
通过上面的分析我们可以看到Netflix在其技术架构、组织架构和企业文化等方面的独到之处造就了其优秀的技术理念和最佳实践。从运维的角度来说无论是SRE也好还是DevOps也罢都被Netflix发挥到了极致。
当然Netflix能做到这一点是需要非常强大的技术实力和人才储备的。当前我们虽然没法直接套用但是这并不妨碍我们在某些经验和思路上去借鉴和学习。
比如,现在很多公司在采用了微服务架构后,就没有充分考虑到后续基于微服务架构的运维问题。而且在运维团队设置上,仍然是脱离整个技术团队,更不用说将其与中间件和架构设计等团队整合拉通去建设,自然也就谈不上在产品层面的合理规划和建设了。
因此导致的问题就是运维效率低下,完全靠人工,线上故障频发,但是处理效率又极低,开发和运维都处于非常痛苦的状态之中,运维团队和成员也会遭遇到转型和成长的障碍。
以上这些问题都很棘手,亟待解决。
通过今天的分享我们了解了Netflix的技术团队运作模式和思路不知道给你带来了哪些启示呢
如果今天的内容对你有帮助,也请你分享给身边的朋友。
欢迎你留言与我一起讨论。

View File

@ -0,0 +1,118 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
02 微服务架构时代,运维体系建设为什么要以应用为核心?
今天我来讲一下微服务架构模式下的一个核心概念:应用。
我会从这几个方面来讲:应用的起源、应用模型和应用关系模型建模以及为什么要这样做。最终希望,在微服务的架构模式下,我们的运维视角一定转到应用这个核心概念上来,一切要从应用的角度来分析和看待问题。
应用的起源
我们知道,微服务架构一般都是从单体架构或分层架构演进过来的。软件架构服务化的过程,就是我们根据业务模型进行细化的过程,在这个过程中切分出一个个具备不同职责的业务逻辑模块,然后每个微服务模块都会提供相对应业务逻辑的服务化接口。
如果解释得简单点就一个字如下图从一个单体工程拆分出N个独立模块。
这些模块可以独立部署和运行,并提供对应的业务能力。拆分后的模块数量与业务体量和复杂度相关,少则几个、十几个,多则几十、几百个,所以为了统一概念,我们通常称这些模块为应用。
为了确保每个应用的唯一性我们给每个应用定义一个唯一的标识符如上图的APP-1、APP-2等这个唯一标识符我们称之为应用名。
接下来,这个定义为应用的概念,将成为我们后续一系列微服务架构管理的核心概念。
应用模型及关系模型的建立
上面我们定义出来的一个个应用都是从业务角度入手进行拆分细化出来的业务逻辑单元。它虽然可以独立部署和运行但是每一个应用都只具备相对单一的业务职能。如果要完成整体的业务流程和目标就需要和周边其它的服务化应用交互。同时这个过程中还需要依赖各种与业务无直接关系、相对独立的基础设施和组件比如机器资源、域名、DB、缓存、消息队列等等。
所以,除了应用这个实体之外,还会存在其他各类基础组件实体。同时,在应用运行过程中,还需要不断地与它们产生和建立各种各样复杂的关联关系,这也为我们后续的运维带来很多困难。
那接下来,我们要做的就是应用模型以及各种关系模型的梳理和建立,因为只有模型和关系梳理清楚了,才能为我们后面一系列的运维自动化、持续交付以及稳定性保障打下一个良好的基础。
1.应用业务模型
应用业务模型也就是每个应用对外提供的业务服务能力并以API的方式暴露给外部如下图商品的应用业务模型示例
这个业务模型通常都是业务架构师在进行业务需求分析和拆解时进行设计,更多的是聚焦在业务逻辑上,所以从运维的角度,我们一般不会关注太多。
而接下来的几部分,将是运维要重点关注的内容。
2.应用管理模型
应用管理模型也就是应用自身的各种属性如应用名、应用功能信息、责任人、Git地址、部署结构代码路径、日志路径以及各类配置文件路径等、启停方式、健康检测方式等等。这其中应用名是应用的唯一标识我们用AppName来表示。
这里我们可以把应用想象成一个人,通常一个人会具备身份证号码、姓名、性别、家庭住址、联系方式等等属性,这里身份证号码,就是一个人的唯一标识。
3.应用运行时所依赖的基础设施和组件
资源层面应用运行所必需的资源载体有物理机、虚拟机或容器等如果对外提供HTTP服务就需要虚IP和DNS域名服务
基础组件这一部分其实就是我们所说的中间件体系比如应用运行过程中必然要存储和访问数据这就需要有数据库和数据库中间件想要更快地访问数据同时减轻DB的访问压力就需要缓存应用之间如果需要数据交互或同步就需要消息队列如果进行文件存储和访问就需要存储系统等等。
从这里我们可以挖掘出一条规律,那就是这些基础设施和组件都是为上层的一个个业务应用所服务的。也正是因为业务和应用上的需求,才开启了它们各自的生命周期。如果脱离了这些业务应用,它们自己并没有单纯存在的意义。所以,从始至终基础设施和组件都跟应用这个概念保持着紧密的联系。
理清了这个思路,我们再去梳理它们之间的关系就会顺畅很多,分为两步。
第一步建立各个基础设施和组件的数据模型同时识别出它们的唯一标识。这个套路跟应用管理模型的梳理类似以典型的缓存为例每当我们申请一个缓存空间时通常会以NameSpace来标识唯一命名同时这个缓存空间会有空间容量和Partition分区等信息。
第二步也是最关键的一步就是识别出基础设施及组件可以与应用名AppName建立关联关系的属性或者在基础组件的数据模型中增加所属应用这样的字段。
还是以上面的缓存为例既然是应用申请的缓存空间并且是一对一的关联关系既可以直接将NameSpace字段取值设置为AppName也可以再增加一个所属应用这样的字段通过外键关联模式建立起应用与缓存空间的关联关系。
相应地对于消息队列、DB、存储空间等都可以参考上面这个思路去做。
通过上面的梳理,我们就可以建立出类似下图这样的以应用为核心的应用模型和关联关系模型了,基于这个统一的应用概念,系统中原本分散杂乱的信息,最终都被串联了起来,应用也将成为整个运维信息管理及流转的纽带。
真实的情况是怎么样的?
上面讲了这么多理论和道理,但是我们业界真实的现状是怎样的呢?
从我个人实际观察和经历的场景来看大部分公司在这块的统筹规划是不够的或者说是不成熟的。也就是软件架构上引入了微服务但是后续的一系列运维措施和管理手段没跟上主要还是思路没有转变过来。虽然说要做DevOps但实际的执行还是把开发和运维分裂了去对待不信你看下面两个常见的场景。
场景一
这个场景是关于线上的缓存和消息队列的。
开发使用的时候就去申请一下一开始还能记住自己使用了哪些但是时间一长或者申请得多了就记不住了。久而久之线上就存在一堆无用的NameSpace和Topic但是集群的维护者又不敢随意清理因为早就搞不清楚是谁用的甚至申请人已经离职以后会不会再用也已经没人讲得清楚了越往后就越难维护。
根本原因,就是前面我们讲到的,太片面地对待基础组件,没有与应用的访问建立起关联关系,没有任何的生命周期管理措施。
场景二
这个典型场景就体现了应用名不统一的问题。
按照我们前面讲的,按说应用名应该在架构拆分出一个个独立应用的时候就明确下来,并贯穿整个应用生命周期才对。
但是大多数情况下我们的业务架构师或开发在早期只考虑应用开发并不会过多地考虑整个应用的生命周期问题会下意识地默认后面的事情是运维负责的所以开发期间只要将应用开发完和将服务注册到服务配置中心上就OK了。
而到了运维这里,也只从软件维护的角度,为了便于资源和应用配置的管理,会独立定义一套应用名体系出来,方便自己的管理。
这时不统一的问题就出现了,如果持续交付和监控系统这些运维平台也是独立去开发的,脱节问题就会更严重。
如下图所示,一个个的孤岛,无法成为体系,当这些系统需要对接时,就会发现需要做大量的应用名转化适配工作,带来非常多无谓的工作量,所谓的效率提升就是一句空话。
所以,今天一开头我就提到,微服务架构模式下的运维思路一定要转变,一定要将视角转换到应用这个维度,从一开始就要统一规划,从一开始就要将架构、开发和运维的工作拉通了去看,这一点是与传统运维的思路完全不同的。
当然,这里面也有一个经验的问题。虽然微服务在国内被大量应用,但是我们绝大多数技术团队的经验还集中在开发设计层面。微服务架构下的运维经验,确实还需要一个总结积累的过程。我自己也是痛苦地经历了上面这些反模式,才总结积累下这些经验教训。
这也是为什么我今天分享了这样一个思路,我们要转换视角,规划以应用为核心的运维管理体系。
不知道你目前是否也遇到了类似的问题,如果今天的内容对你有帮助,也请你分享给身边的朋友。
欢迎你留言与我一起讨论。

View File

@ -0,0 +1,140 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
03 标准化体系建设(上):如何建立应用标准化体系和模型?
今天我专门来讲讲标准化这个工作。可以说这项工作是运维过程中最基础、最重要的,但也是最容易被忽视的一个环节。
我做过多次公开演讲每次讲到这个环节通常会有单独的一页PPT就放四个字字号加大加粗重复三遍这四个字就是“标准先行”然后演讲过程中会大声说出“标准先行标准先行标准先行”重要的事情说三遍目的就是想反复强调这件事情的重要程度一定不要忽视。
我们运维工作的开展常常不知从何下手,或者上来就冲着工具和自动化去了,却始终不得章法,工具做了一堆,效率却并没有提升。其实绝大多数情况下,问题和原因就是标准化这个基础工作没做扎实。
首先,让我们来看看为什么标准化这个事情如此重要。
为什么要做标准化?
标准化的过程实际上就是对运维对象的识别和建模过程。形成统一的对象模型后,各方在统一的认识下展开有效协作,然后针对不同的运维对象,再抽取出它们所对应的运维场景,接下来才是运维场景的自动化实现。
这有点像我们学的面向对象编程的思想,其实我们就是需要遵循这样一个思路,我们面对的就是一个个实体和逻辑运维对象。
在标准化的过程中,先识别出各个运维对象,然后我们日常做的所有运维工作,都应该是针对这些对象的运维。如果运维操作脱离了对象,那就没有任何意义。同样,没有理清楚对象,运维自然不得章法。
比如我们说扩容,那就要先确定这里到底是服务器的扩容,还是应用的扩容,还是其它对象的扩容。你会发现,对象不同,扩容这个场景所实施的动作是完全不一样的。
如果把服务器的扩容套用到应用的扩容上去,必然会导致流程错乱。同时对于对象理解上的不一致,也会徒增无谓的沟通成本,造成效率低下。自然地,这种情况下的运维自动化不但不能提升效率,还会越自动越混乱。
这就是为什么我每次都会连续强调三遍“标准先行”的原因。虽然这个事情比较枯燥和繁琐,但是于纷繁复杂中抽象出标准规范的东西,是我们后续一系列自动化和稳定性保障的基础。万丈高楼平地起,所以请你一定不要忽略这个工作。
好,总结一下标准化的套路:
第一步,识别对象;
第二步,识别对象属性;
第三步,识别对象关系;
第四步,识别对象场景。
接下来我们就按照上面这个思路,一起来分析从基础设施层面和应用层面应该识别出哪些运维对象。
基础设施层面的标准化
基础设施层面的运维对象应该不难识别,因为都是一个个物理存在的实体,我们可以进行如下分析。
第一步识别实体对象主要有服务器、网络、IDC、机柜、存储、配件等。
第二步识别对象的属性比如服务器就会有SN序列号、IP地址、厂商、硬件配置如CPU、内存、硬盘、网卡、PCIE、BIOS、维保信息等网络设备如交换机也会有厂商、型号、带宽等信息。
第三步识别对象之间的关联关系比如服务器所在的机柜虚拟机所在的宿主机、机柜所在IDC等简单关系复杂一点就会有核心交换机、汇聚交换机、接入交换机以及机柜和服务器之间的级联关系等这些相对复杂一些也就是我们常说的网络拓扑关系。
把以上信息梳理清楚通过ER建模工具进行数据建模再将以上的信息固化到DB中一个资源层面的信息管理平台就基本成型了。
以服务器为例简单展示一下,我们的视角就是下面这样的:
但是,信息固化不是目的,也没有价值,只有信息动态流转起来才有价值。接下来我们需要做的事情,就是识别出针对运维对象所实施的日常运维操作有哪些,也就是识别出运维场景是什么。
第四步还是以服务器为例我们针对服务器的日常操作有采购、入库、安装、配置、上线、下线、维修等等。另外可能还会有可视化和查询的场景如拓扑关系的可视化和动态展示交换机与服务器之间的级联关系、状态正常or故障的展示等这样可以很直观地关注到资源节点的状态。
完成了这些工作,接下来才是对上述运维场景的自动化开发。所以你看,在真正执行去做工具和自动化平台之前,其实是需要先做好大量的基础准备工作的。我要再次强调这一点,一定不能忽视。
应用层面的标准化
下面我们再一起看一个逻辑上的对象,就是我们前面经常提到的运维的核心:应用。对这个逻辑对象的建模会相对复杂一些,不过我们依然可以按照上面的套路来。
第一步,识别对象。
我们前面讲过,这个识别过程是在做微服务架构设计或拆分的时候就确定下来的。所以严格地讲,它不应该是运维阶段才被识别出来的,而是在之前设计阶段就被识别和确认下来,然后延伸到运维这里才对。
第二步,识别对象属性。
一个应用是业务的抽象逻辑,所以会有业务和运维两个维度的属性。业务属性在业务架构时确定,这主要是需要业务架构师去识别的,但是它的运维属性就应该由运维来识别了。
下面我们一起来看一下,一个应用应该具备哪些基本的运维属性。
应用的元数据属性也就是简单直接地描述一个应用的信息如应用名、应用Owner、所属业务、是否核心链路应用以及应用功能说明等这里的关键是应用名
应用代码属性主要是编程语言及版本决定了后续的构建方式GitLab地址
应用部署模式涉及到基础软件包如语言包Java、C++、Go等容器如Tomcat、JBoss等
应用目录信息,如运维脚本目录、日志目录、应用包目录、临时目录等;
应用运行脚本,如启停脚本、健康监测脚本;
应用运行时的参数配置如运行端口、Java的JVM参数GC方式、新生代、老生代、永生代的堆内存大小配置等。
从应用属性的视角,应该是下面这样一个视图(简单示例,不完整):
第三步,识别对象关系。
也就是应用与外部的关系,概括起来有三大类:
第一类是应用与基础设施的关系包括应用与资源、应用与VIP、应用与DNS等等的关系
第二类是平行层面的应用与应用之间的关系这里再细分下去就是应用服务或API与其它应用服务和API的依赖关系。如果你有相关的经验应该会联想到全链路这样的工具平台了没错这样的平台就是用来处理应用间关系管理的。
第三类是应用与各类基础组件之间的关系比如应用与缓存应用与消息、应用与DB等等之间的关系。
第四步,识别应用的运维场景。
这个就会比较多了,比如应用创建、持续集成、持续发布、扩容、缩容、监控等;再复杂点的比如容量评估、压测、限流降级等。
好,这里我们先收一下,聚焦到标准化的层面,通过基础设施和应用层面标准化的示例,我想你应该可以掌握基本的建模思路了,这样的思路可以应用到其它的运维对象上 。
同时,通过上面这些内容,你应该可以比较清晰地看到,我们的每一个运维操作都是针对某个运维对象的,这一点在规划运维体系时非常重要。
而在这些对象中,应用又是重中之重,是微服务架构下的核心运维对象。
从应用标准化的过程中我们也可以看到,针对应用的识别和建模,明显复杂很多。所以,后面我还会从理论和实践的角度来继续强化和分析这个概念。
最后,给你留两个小问题。
标准化部分我们提到,在规划和设计一个运维技术方案时,一定要找到对象主体,那请你思考以下问题:我们现在经常听到一些高大上的词汇,如水平扩展、弹性伸缩和自动化扩缩容等,你能否说一说这些技术手段的主体是谁,也就是是谁的水平扩展?弹性伸缩的是什么?同时,这些名词之间又有什么关系?
在对象属性识别过程中,我们进行了一些关键项的举例,但是如果换一个对象,有没有好的方法论来指导我们进行准确和全面的识别,而不至于遗漏?从我们今天的内容中,你有没有发现一些规律呢?
如果今天的内容对你有帮助,也请你分享给身边的朋友。
欢迎你留言与我一起讨论。

View File

@ -0,0 +1,113 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
04 标准化体系建设(下):如何建立基础架构标准化及服务化体系?
前面我们一起讨论了为什么要做标准化,标准化的套路是什么,并按照套路进行了基础设施和应用的标准化示例。我想这些内容可以帮助我们举一反三,尝试着应用到实际工作中了。
今天,我继续跟你聊基础架构标准化的问题,但是今天我计划不谈如何进行架构标准化的细节,而是想强调一下基础架构标准化的重要性,因为从我个人的经历和我实际观察到的情况来看,这块的问题会更普遍一些,而这一部分又影响着后续一系列效率和稳定性平台的建设方案。
同时,如果说上次我们讲的基础设施和应用标准化是运维团队职责的话,那今天的内容就是架构、开发和运维共同的职责。
常见的分布式基础架构组件
让我们先一起列一下,微服务的分布式架构下,涉及到的主要基础架构组件有哪些。
分布式服务化框架业界开源产品比如Dubbo、Spring Cloud这样的框架
分布式缓存及框架业界如Redis、Memcached框架如Codis和Redis Cluster
数据库及分布式数据库框架这两者是密不可分的数据库如MySQL、MariaDB等中间件如淘宝TDDL现在叫DRDS、Sharding-JDBC等。当前非常火热的TiDB就直接实现了分布式数据库的功能不再额外选择中间件框架
分布式的消息中间件业界如Kafka、RabbitMQ、ActiveMQ以及RocketMQ等
前端接入层部分如四层负载LVS七层负载Nginx或Apache再比如硬件负载F5等。
上面是几类主要的基础架构组件,为了便于理解我以开源产品举例。但在实际场景中,很多公司为了满足业务上的个性化需求,会自己研发一些基础组件,比如服务化框架、消息中间件等,这个情况在有一定技术实力的公司里比较常见。不过大部分情况下,我们会基于这些开源产品做一些封装或局部的改造,以适应我们的业务。
基础架构组件的选型问题
关于基础架构组件,业界可供我们选择的解决方案和产品非常多,但是选择多了就容易挑花眼,反而不知道从何入手。我们大概都会遇到同样的问题,是自研还是选择开源产品?有这么多的开源产品到底该选哪一个?
按正常的思路,一定是先组织选型调研,然后进行方案验证和对比,最后确认统一的解决方案。
但是,由于开源产品的便利性,以及开发同学对技术探索的好奇心,实际情况往往是,整个大的技术团队中,不同的开发团队,甚至不同的开发人员,会根据开发的需要或个人喜好,选择不同的开源产品,在没有严格限制的情况下,甚至会尝试去自研。
按照我的观察,这个问题特别容易出现在微服务架构引入初期。在这个阶段,团队组织架构按照业务领域进行切分,产生一个个与业务架构匹配的小规模技术团队。
每个小团队所负责的业务相对独立,自主权就会变大,如果这个时候整个团队中没有一个强有力的架构师角色去做端到端的约束,就极其容易出现上面的这个问题,并且会一直扩散蔓延下去。
相比之下,成规模的大公司在这一点上做得就相对严格一些,当然也可能是因为之前尝过苦头,所以后来变得越来越规范了。所以这一点也是每个技术团队在引入微服务架构时要提前关注的。
我们以分布式服务化框架为例我之前遇到的一个实际情况就是整个大的技术团队选型时以Java技术栈为主毕竟这块有很多的业界经验和产品可以借鉴参考。但是有的团队对PHP特别精通熟悉就想用PHP去做微服务有的团队对Go感兴趣就想尝试Go的微服务。
从单纯的技术选型上来看,选择什么语言并没有严格的标准。而且在技术团队中,我们也应该鼓励技术多样性和尝试新技术。不过这里要有个度,我暂时先不细说这个度在哪里,我们先来看看,假设没有统一标准的约束会带来什么问题。
技术的应用,一般都会随着应用场景的逐步深入和业务体量的增长,逐步暴露出各种各样的问题,我们分两个层面来看。
1.开发层面
业务开发同学将大量的精力投入到基础组件和开源产品的研究、研发以及规模化之后的运维上,再加上产品形态的不统一,导致需要在技术层面的协作上做大量适配工作,而且经验还无法互通。
好不容易在一个产品上摸索了很长时间,踩了很多坑,积累了宝贵的经验,结果发现另外一个产品也要经历同样的一个过程,积累的经验依然不能互通和传递。
2.运维层面
当我们考虑建设一个统一的效率和稳定体系时,发现基础组件不统一,这个时候就需要做大量的针对不同组件的适配工作。
比如我们要在发布系统中做服务上下线处理,就要针对多个微服务化框架做适配。再举个稳定性上全链路跟踪的例子,为了在分布式复杂调用场景下的链路跟踪和问题定位,我们会在服务化框架中统一做打点功能,这样才不需要侵入业务逻辑。
就这样一个工作,如果服务化框架不统一,就需要到每个框架里都去开发一遍。不过现实中遇到的实际问题是,整个链路就是会有这样那样的情况而串联不起来。
如果你有过类似的经历,一定深有感受。其实各种各样奇葩的问题还远不止这些,继续演化下去,就是我们所说的架构失控了。
当我们把业务开发资源消耗在与业务开发无关的事情上,业务开发就很难聚焦于业务架构,并能够更快、更多、更好地完成业务需求,这就与公司对业务开发的诉求背道而驰了。
同时还会出现维护投入不足,那就必然导致故障频发等一系列问题,团队内部也会因为问题定位不清楚而形成扯皮推诿的不良氛围。
所以这个时候我们需要做的就是对基础架构有统一的规划和建设。原则上每种基础组件只允许一种选型至少就能满足90%甚至更多的应用场景。
比如数据库就只允许使用MySQL然后版本统一同时配套的中间件也必须统一其它的关系型数据库没有特殊情况坚决不允许使用如果遇到特殊情况具体分析。
这里就举个特殊的小例子。
为了更好地满足业务个性化需求我们的消息中间件在早期选择了自研业务上也要求各个应用使用我们统一的服务。但是对于大数据的业务来说很多开源产品如Spark都是原生与Kafka配套的同时很多的新特性也都是基于Kafka去做的在这种情况下就不能很生硬地要求大数据业务必须按照我们的标准来这里还是得遵守大数据生态本身的标准才可以。
所以选型问题还是要看具体的业务和应用场景,这里只介绍大致的原则,至于具体应该如何标准化,你可以参考我们前面讲到的标准化套路去尝试梳理,先看看你梳理出来的标准化体系是什么样的,后面我也会针对案例进行分享。
基础架构的服务化
我们对基础架构组件做了统一标准之后下一步要做的就是服务化。因为这些组件都只提供了简单的维护功能还有很多都是命令行层面的维护这时我们要做的就是把这些组件提供的维护API进行封装以提供更加便捷的运维能力。
这里以Redis缓存为例。
创建和容量申请;
容量的扩容和缩容,新增分片的服务发现及访问路由配置;
运行指标监控如QPS、TPS、存储数据数量等等
主备切换能力等等。
以上这些假设都依赖Redis提供的原生能力来做基本是不可维护的。所以必须要基于这些原生能力进行封装结合运维场景将能力服务化这样就大大提升了使用方的便利性。
同时我们也可以看到这个服务化的过程其实就是PaaS化的过程。换言之如果我们能把基础架构组件服务化完成我们的PaaS平台也就基本成型了。
运维的职责是什么?
总结上面的过程,我们要做的事情,可以归纳为两步:第一步是基础架构标准化,第二步是基础架构服务化。
所以这个时候,运维必须要有意识去做的两件事情。
参与制定基础架构标准并强势地约束。在这里运维作为线上稳定的Owner发挥约束作用有可能会比业务架构师这样的角色更为有效。另外由于历史原因或其他种种因素造成的已有架构标准不统一的问题是需要开发和运维共同合作去改造的。这里面如何保持良好的协作制定统一的路线图也是非常重要的。所以这里强制约束是一方面同时也要提供工具化的手段来支持开发的改造也就是下面这个动作。
基础架构的服务化平台开发,目标是平台自助化,让开发依赖平台的能力自助完成对基础组件的需求,而不是依赖运维的人。这个事情是驱动运维转型和改进的动力,也是运维能够深入了解架构组件细节的有效途径。同时,要注意到,如果不朝着服务化方向发展,运维将始终被拖累在这些基础组件的运维操作上。
今天我们讨论的这个话题,我也和很多同行、专家交流过,发现大家都有相同的痛点,但是业界的架构资料和图书中很少涉及到这一部分的内容。我觉得根本上还是经验意识上的缺失,所以结合自己的经验专门整理出来,也很期待听到你的经验和想法。
如果今天的内容对你有帮助,也请你分享给身边的朋友。
欢迎你留言与我一起讨论。

View File

@ -0,0 +1,103 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
05 如何从生命周期的视角看待应用运维体系建设?
还记得上周我们在讲标准化体系建设(上)的最后,我留了两个小问题,其中一个是这样的:
在对象属性识别过程中,我们进行了一些关键项的举例,但是如果换一个对象,我们有没有好的方法论来指导我们进行准确和全面的识别,而不至于遗漏?从我们今天的内容中,你有没有发现些规律呢?
这个问题的答案其实就是我们今天要讨论的内容,那就是从“应用生命周期管理”的角度分阶段去梳理。
简单理解下来就是,对于一个对象,既然有生命周期,就会有不同的生命周期阶段,那这个对象在不同的阶段,可能就会具备不同的属性、关系和场景。只要我们把一个对象的生命周期阶段理清楚了,顺着这条主线分阶段进行分解,就可以分析得更加清晰、明确和具体了。
怎样理解生命周期
谈到生命,首先就会联想到我们自己,所以这里以人做一个简单的类比。我们人类从出生到死亡,就是一个生命周期,在这个周期的每一个阶段,我们都会有不同的属性、关系和所要面对的场景。
比如从人的学生时代开始,作为学生,我们就会具备学生的属性,会有所属学校、所属年级、所属班级、所属学号等等。这个时候我们周边的关系更多的是同学关系和师生关系。我们面临的场景可能就是读书、做作业和考试。当然学生时代细分下去还会有小学生、中学生、大学生以及研究生等阶段,每个阶段里面又会有不同的细分属性以及所要面临的场景,比如大学生毕业,就面对求职的场景等。
当一个学生毕业走入职场之后,这个时候就开启了生命周期里的另一个阶段,那就是职场生涯。这个时候我们身上的属性又发生了变化,具备所属公司、所谓职位、所谓层级等。这个时候的关系也更为复杂,如同事关系、上下级关系以及各种各样的社会关系。我们所面临的场景也变得复杂,要完成工作、晋升考核、领取薪酬以及离职跳槽、再次面试等等。
再往后,我们到了一定年纪,成为老年人,又会有老年人的属性、关系和场景,这里就不详细列举了。
围绕着人类的生命周期,我们国家和社会提供的解决方案,就必须要有一系列对应的教育体系、职业体系、医疗体系、养老体系等。目的就是针对人生的不同阶段,提供不同形式的保障和支持,让每个人在社会体系下都够正常生存并发挥出自己的价值。
从上面的分析我们可以看到,人这个对象,在不同的生命周期阶段中,会有不同的角色属性和外部关系,同时要面对的社会和生存场景也不一样。所以,当我们谈论人这个对象的时候,一定是把这个对象放到具体的某个生命周期阶段中,才会有意义。
应用的生命周期分析
回到我们运维对象的生命周期上来,我们所面对的这些对象就相对规范、标准很多。
当一个场景下有多个对象时,就一定要找到那个核心的运维对象,这个核心对象的生命周期就会涵盖其它附属运维对象的子生命周期。结合我们前面讲过的内容,微服务架构下,一切要以应用核心。因此,我们就找到了整个运维体系,或者说软件运行阶段的核心对象,那就是应用。
应用就类似于我们社会中的人,凡事都会以人为本,这里就是要以应用为本。那接下来按照上面我们对一个人的生命周期的阶段分解,我们也可以对应用的生命周期阶段进行分解,大致分为五个部分,应用的创建阶段、研发阶段、上线阶段、运行阶段和销毁阶段。我们依次来分析看一下。
1.应用的创建阶段
这个阶段,最重要的工作,是确认应用的基础信息和与基础服务的关系,要同时固化下来,从应用创建之初,就将应用与各类基础服务的生命周期进行挂钩。
应用的基础信息,可以参考之前我们讲标准化的部分,基本上已经涵盖了比较全的信息,你可以按照生命周期的思路,再理解一下并做梳理。
对于同一类的应用,只需要做一次标准化即可,后续完全可以形成模板固化到工具平台上。
同时另外一个很重要的工作就是要开启与应用相关的各类基础服务的生命周期。比如这个应用需要用到缓存、消息队列和DB等也可能需要域名DNS服务、VIP配置等这些就要从应用创建这个动作延伸出去启动这些关联基础服务的创建比如需要缓存就去申请容量空间需要消息队列要申请创建新的Topic等等。
当然一个应用使用到哪些基础服务,应该是在架构设计和编码阶段就确定下来的,这里做的事情,就是把这些信息通过应用关联起来,与应用的生命周期挂钩。
2.应用的研发阶段
应用的研发阶段主要是业务逻辑实现和验证的阶段。针对业务逻辑层面的场景就是开发代码和质量保证,但是这个过程中就会涉及到代码的提交合并、编译打包以及在不同环境下的发布部署过程。同时,开发和测试在不同的环境下进行各种类型的测试,比如单元测试、集成测试以及系统测试等等,这整个过程就是我们常说的持续集成。
所以,这个阶段,我们要做的最重要的一个事情,就是为研发团队打造完善的持续集成体系和工具链支持,在后面我们会有专门一个部分讲解这个过程。
3.应用的上线阶段
这是个过渡阶段,从应用创建过渡到线上运行。创建阶段,应用的基础信息和基础服务都已经到位,接下来就是申请到应用运行的服务器资源,然后将应用软件包发布上线运行,这个动作在下面的运行阶段也会持续迭代,我们直接看下面这个阶段。
4.应用的运行阶段
这是应用生命周期中最重要、最核心的阶段。
从运维角度来看,应用在线上运行起来之后就已经变成一个线上运行的进程,那这个进程形态的应用应该有什么样的属性呢?你可能已经联想到,这个时候需要应用线上运行的各种指标的输出。所以这个阶段,应用最重要的属性就是应用本身以及相关联的基础服务的各项运行指标。
这里我们就需要制定每个运维对象的SLI、SLO和SLA同时要建设能够对这些指标进行监控和报警的监控体系。
从业务角度看,应用是线上业务逻辑的执行载体,但是我们的业务需求是在不断变化和迭代的,所以就需要不断地去迭代更新我们的线上应用,这里仍然会依赖到上述应用研发阶段的持续集成过程,并最终与线上发布形成持续交付这样一个闭环体系。
从运行阶段应用的关系看,除了它跟基础服务之间相对固化的关系外,应用跟应用、以及应用包含的服务之间的调用关系也非常重要,而且这个关系可能随时都在变化,这个时候,我们应用之间依赖管理和链路跟踪的场景就出现了。
同时应用线上运行还会面临外部业务量的各种异常变化以及应用自身所依赖的基础设施、基础服务以及应用服务的各种异常状况。比如“双11”大促外部流量激增微博上热点事件带来的访问量剧增或者服务器故障、IDC故障DB故障再或者服务层面API的报错等等。这时就出现了线上稳定性保障的场景比如流量激增时的限流降级、大促前的容量规划、异常时的容灾、服务层面的熔断等等。
通过上面的这个分析过程,我们可以看到,日常接触到的各种技术解决方案,都是在解决应用生命周期不同阶段中应用自身或者应用与周边关系的问题,或者是所面对的场景问题。
5.应用的销毁阶段
这一部分就不难理解了。如果应用的业务职责不存在了,应用就可以下线销毁了。但是这里不仅仅是应用自身要销毁,我们说应用是整个运维体系的核心,所以围绕着某个应用所产生出来的基础设施、基础服务以及关联关系都要一并清理,否则将会给系统中造成许多无源(源头)的资源浪费。
我们在日常工作中经常见到的缓存系统中很多NameSpace不知道是谁的消息系统中有很多Topic不知道是谁的但是又不敢随意乱动就只能让它无端占用着系统资源。
执行应用的销毁这一步动作,其实是取决于最前面应用与基础服务的关系模型分析和建设是否做得足够到位。
总结
今天我们分析了应用的生命周期,再结合之前讲的标准化内容,我们就找到了做运维架构的切入点,套路也就有了,总结一下就是:
从生命周期入手,划分阶段,提炼属性,理清关系,固化基础信息,实现运维场景。
同理,这个思路还可以运用到基础设施和基础服务对象的生命周期管理中,虽然它们只是子生命周期,但是具体到每个基础服务上面,同样需要这个管理手段和过程。
我已经介绍了很多和应用相关的内容,很大一部分的原因是希望能够帮助你梳理好思路,在思考问题和设计解决方案的时候,一定要从实际出发、从问题出发、从基础出发,理清自己的需求和痛点,然后再去寻求解决方案。
借鉴业界思路,千万不要一上来就去套用别人的解决方案。因为别人的思路和解决方案往往是建立在一个非常稳固的基础之上的,而这些基础,往往又因为太基础、太枯燥、太不够酷炫,所以常常是一带而过,甚至是略去不讲的。一旦忽略了这一点,再优秀的解决方案也是无源之水,无本之木,是实现不了的。
独立思考非常重要,共勉!
如果今天的内容对你有帮助,也请你分享给身边的朋友。
欢迎你留言与我一起讨论。

View File

@ -0,0 +1,99 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
06 聊聊CMDB的前世今生
我们前面在讲标准化的时候,对关键的运维对象做了识别,主要分为两个部分:
基础设施层面IDC机房、机柜、机架、网络设备、服务器等
应用层面:应用元信息、代码信息、部署信息、脚本信息、日志信息等。
这两部分是整个运维架构的基础部分运维团队是维护的Owner需要投入较大的精力去好好地规划建设。
当我们识别出运维对象和对象间的关系,并形成了统一的标准之后,接下来要做的事情就是将这些标准固化,固化到某个信息管理平台中,也就是我们常说的配置管理,专业一点就叫作 CMDBConfiguration Management DataBase
其实,如果我们找准了需求和问题在哪里,你会发现技术手段和平台叫什么就真的不重要了,只要是内部能够达成一个统一共识的叫法就好。
关于如何打造CMDB和应用配置管理我之前有一篇公开的文章《有了CMDB为什么还需要应用配置管理》写得已经比较细致了会在下一期发布出来但不占用我们专栏的篇幅。
今天我主要来聊一聊CMDB的前世今生帮助你更加深刻地理解这个运维核心部件对我们后面开展CMDB的建设大有裨益。
CMDB源起
CMDB并不是一个新概念它源于ITILInformation Technology Infrastructure Library信息技术基础架构库。而ITIL这套理论体系在80年代末就已经成型并在当时和后来的企业IT建设中作为服务管理的指导理论得到广泛推广和实施。但是为什么这个概念近几年才被我们熟知为什么我们现在才有意识把它作为一个运维的核心部件去建设呢
我想主要有两个因素,一个起了限制作用,一个起了助推作用。
CMDB这个概念本身的定义问题限制了CMDB的实施
互联网技术的发展驱动了运维技术的发展和演进进而重新定义了CMDB。
传统运维思路下的CMDB
我们先来看下第一个原因按照ITIL的定义
CMDBConfiguration Management
DataBase配置管理数据库是与IT系统所有组件相关的信息库它包含IT基础架构配置项的详细信息。
看完上面这个描述,我们能感觉到,这是一个很宽泛的概念描述,实际上并不具备可落地的指导意义。事实上也确实是这样,稍后我们会讲到。
同时CMDB是与每个企业具体的IT软硬件环境、组织架构和流程强相关的这就决定了CMDB一定是高度定制化的体系。虽然我们都知道它不仅仅是一个存储信息的数据库那么简单但是它的具体形态是什么样子的并没有统一的标准。
从传统IT运维的角度来看运维的核心对象是资源层面所谓的基础架构也就是网络设备和硬件设备这个层面各种关联和拓扑关系基本也是从服务器的视角去看。所以更多地我们是把CMDB建设成为一个以设备为中心的信息管理平台。
这也是当前绝大多数公司在建设运维平台时最优先的切入点,因为这些运维对象都是实体存在的,是最容易被识别的和管理的;像应用和分布式中间件这种抽象的逻辑对象反而是不容易被识别的。
这种形态如果是在软件架构变化不大的情况下比如单体或分层架构以服务器为中心去建设是没有问题的。因为无论设备数量也好还是申请回收这些变更也好都是很有限的也就是整个IT基础设施的形态变化不大。
我没有专门调研过国外的实施情况,但就国内的情形,谈下我的经历。
早期大约是在2009~2013年我接触了一个省级运营商的全国性项目。2012年的时候日PV就到了5亿左右日订单创建接近2000万。分层的软件架构不到千台服务器对于资源的管理仍然是用Excel表格来记录的。
运维基于这样一个表格去管理和分配各种资源,问题也不算太大。究其根本,就是基础设施层面的架构形态相对稳定,有稳定的软件模块数量和架构。但是发展到后来,这样的软件架构无法满足业务的快速迭代,还是做了架构上的拆分,这就是后话了。
这里我想表达的是在那个时期即使是在IT架构相对先进的运营商体系下面我也没有太多地听说过CMDB这个概念包括运营商自身以及为运营商提供整体技术解决方案的厂商还有来自方方面面的资深架构师和咨询师等在做系统架构和运维架构设计时没有人提及过CMDB也没有人提出把它作为核心部件去建设更多的都是从ITIL管理服务的流程体系去给出咨询建议在落地实施的时候我们最终见到的大多是一条条的流程规范和约束后来增加的也多是流程和审批甚至是纸质的签字审批。
这也从一个侧面说明CMDB在那个时期更多的还是停留在概念阶段甚至是无概念状态也没有什么最佳实践经验的传承CMDB这个概念本身并不具备实践意义管理的方式方法也就停留在原始的Excel表格中。
高大上的ITIL体系更多的是被当做流程规范来落地的真正体现在技术方案和技术产品上的落地并不多。我想这是实施过程中对ITIL理解和运用的一大误区。
接下来,我们看第二个原因,也就是互联网运维的助推力。
互联网运维体系下的CMDB
值得庆幸的是进入到互联时代随着互联网运维力量的崛起CMDB这个概念也真正地得到了落地实践从理论概念的方法论阶段过渡到了具备具体技术方案的可实施阶段而且得到了业界的持续分享和传播。我们现在能够看到的CMDB经验分享基本上都是中大型互联网公司的运维最佳实践。
不过值得注意的是“此CMDB”已经非“彼CMDB”。我们前面提到传统运维阶段我们更多是以设备为核心进行管理但是到了互联网技术阶段这个核心就变了变成了应用这个核心对象。
至于原因,我们前面已经讲过,主要还是互联网技术的快速发展,大大推进了微服务技术架构的落地和实践,这种场景下,应用各维度的管理复杂度、应用的复杂度就逐渐体现出来了,所以我们的很多运维场景就开始围绕着应用来开展。
与此同时云计算技术也在蓬勃发展逐步屏蔽了IDC、网络设备以及硬件服务器这样的底层基础设施的复杂度有公有云或私有云厂商来专注聚焦这些问题让我们的运维不必再花过多的精力在这些基础设施上面同时单纯以硬件为核心的CMDB形态也被逐步弱化。
所以此时的CMDB仍然可以叫做配置管理数据库但是这个配置管理的外延已经发生了很大的变化。之前所指的简单的硬件资源配置管理只能算是狭义的理解从广义上讲当前的应用以及以应用为核心的分布式服务化框架、缓存、消息、DB、接入层等基础组件都应该纳入这个配置管理的范畴。
所以在这个时期我们提到的运维自动化远不是自动化的服务器安装部署交付或网络自动化配置这种单一场景而是出现了持续交付、DevOps、SRE等更适合这个时代的对运维职责的定义和新的方法论。
到了这个阶段传统运维思路下的CMDB因为管理范围有限可以定义为狭义上的CMDB而互联网运维思路下的CMDB外延更广我们称它为广义的CMDB。新的时期对于CMDB的理解也要与时俱进这个时候思路上的转变远比技术上的实现更重要。
CMDB进行时
如果我们仔细观察会发现一个很有意思的现象。CMDB源于80年代末的ITIL源于传统IT运维阶段但真正让它发扬光大的确是新兴的互联网运维行业而且现在很多的传统行业也在向互联网学习运维技术。
与此同时,在中大型的互联网公司中,比如阿里和腾讯,也越来越重视流程规范的管控,开始更多地将严格的流程控制与灵活的互联网运维技术结合起来,以避免在过于灵活多变的环境下导致不可控的事件发生。
所以从这里我们可以看到并不是说ITIL的重流程体系就一定是过时老旧的也不是说互联网运维技术就一定代表着最先进的技术趋势而是在这个过程中不同体系相互借鉴、相互学习、共同进步和发展在碰撞的过程中催生出更适合这个时代的技术体系。
这确实是一个充满了机遇和挑战、但又不乏乐趣的新时代。
今天我们讲了CMDB的前世今生我所讲到的对ITIL以及其定义下的CMDB的理解更多的是根据我个人的早期经历还有和业界同行交流的经验所得我自己并没有完整系统地学习过所以理解上和见识上会有一定的局限也期望你能批评指正我们一起讨论、共同进步。
如果今天的内容对你有帮助,也请你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,90 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
07 有了CMDB为什么还需要应用配置管理
今天我们分享的主题是有了CMDB为什么还需要应用配置管理
你不妨先停下来,思考一下这个问题。
我抛出的观点是: CMDB是面向资源的管理应用配置是面向应用的管理。
请注意,这里是面向“资源”,不是面向“资产”,资源 ≠资产。
CMDB是面向资源的管理是运维的基石
我们一起来梳理一下,在建设运维的基础管理平台时通常要做的事情。
第1步把服务器、网络、IDC、机柜、存储、配件等这几大维度先定下来
第2步把这些硬件的属性确定下来比如服务器就会有SN序列号、IP地址、厂商、硬件配置如CPU、内存、硬盘、网卡、PCIE、BIOS、维保信息等等网络设备如交换机也会有厂商、型号、带宽等等
第3步梳理以上信息之间的关联关系或者叫拓扑关系。比如服务器所在机柜虚拟机所在的宿主机、机柜所在IDC等简单关系复杂一点就会有核心交换机、汇聚交换机、接入交换机以及机柜和服务器之间的级联关系
第3.5步在上面信息的梳理过程中肯定就会遇到一些规划问题比如IP地址段的规划哪个网段用于DB哪个网段用于大数据、哪个网段用于业务应用等等再比如同步要做的还有哪些机柜用于做虚拟化宿主机、哪些机柜只放DB机器等。
以上信息梳理清楚通过ER建模工具进行数据建模再将以上的信息固化到DB中一个资源层面的信息管理平台就基本成型了。
但是,信息固化不是目的,也没有价值,只有信息动态流转起来才有价值(跟货币一样)。接下来我们可以做的事情:
第4步基于这些信息进行流程规范的建设比如服务器的上线、下线、维修、装机等流程。同时流程过程中状态的变更要同步管理起来
第5步拓扑关系的可视化和动态展示比如交换机与服务器之间的级联关系、状态正常or故障的展示等这样可以很直观地关注到资源节点的状态。
至此,从资源维度的信息梳理,以及基于这些信息的平台和流程规范建设就算是基本成型了。这个时候,以服务器简单示例,我们的视角是下面这样的:
应用配置管理是面向应用的管理,是运维的核心
上面说明了CMDB的基础信息部分如果从传统的SA运维模式这些信息已经足够但是从应用运维的角度这些就远远不够了。
这时我们就需要一个非常非常重要的句柄:应用名,或者叫应用标识。至此,应用运维里面最最重要的一条联系也就产生了:“应用名-IP“的关联关系这里也可以是定义的其它唯一主机标识如主机名、容器ID等等因为我们使用的方式是IP所以这里就以IP示例
之所以说“应用名”和“应用名-IP关联关系”非常重要是因为它的影响力不仅仅在运维内部而是会一直延伸到整个技术架构上。后面我们会介绍到的所有平台和系统建设都跟这两个概念有关。
CMDB是IP为标识的资源管理维度有了应用名之后就是以应用为视角的管理维度了。首先看一下应用会涉及到的信息
应用基础信息如应用责任人、应用的Git地址等
应用部署涉及的基础软件包如语言包Java、C++、GO等、Web容器Tomcat、JBoss等、Web服务器Apache、Nginx等、基础组件各种agent如日志、监控、系统维护类的tsar等
应用部署涉及的目录,如运维脚本目录、日志目录、应用包目录、临时目录等;
应用运行涉及的各项脚本和命令,如启停脚本、健康监测脚本;
应用运行时的参数配置如Java的jvm参数特别重要的是GC方式、新生代、老生代、永生代的堆内存大小配置等
应用运行的端口号;
应用日志的输出规范;
其他。
上面的梳理过程实际就是标准化的过程。我们梳理完上述信息后就会发现这些信息跟CMDB里面的资源信息完全是两个维度的东西。所以从信息管理维度上讲把资源配置和应用配置分开会更清晰解耦之后也更容易管理。
好了按照上面CMDB说的套路梳理完成后就是要进行信息的建模和数据的固化这时就有了我们的“应用配置管理”。再往后就是基于应用配置管理的流程规范和工具平台的建设这就涉及到我们经常说的持续集成和发布、持续交付、监控、稳定性平台、成本管理等等。
从应用的视角,我们配置管理,应该是下面这样一个视图(简单示例,不是完整的):
好了,有了资源配置信息和应用配置信息,这两个信息应该怎么统一管理起来呢。直接看图:
至此CMDB和应用配置管理的分层分解就完成了应用名关联着应用配置信息IP关联着资源信息二者通过“应用名-IP”的对应关系联系到一起。
总结
CMDB是运维的基石但是要发挥出更大的价值只有基础是不够的我们要把更多的精力放到上层的应用和价值服务上所以我们说应用才是运维的核心。
你可以看到如果仅仅基于CMDB的资源信息作自动化最多只能做出自动化的硬件资源采集、自动化装机、网络-硬件拓扑关系生成等资源层面的工具,这些工具只会在运维层面产生价值,离业务还很远,就更谈不上给业务带来价值了。
但是基于应用这一层去做,就可以做很多事情,比如持续集成和发布、持续交付、弹性扩缩容、稳定性平台、成本控制等等,做这些事情带来的价值就会大大不同。
以上就是我抛出的观点CMDB是面向资源的管理应用配置是面向应用的管理。希望能够抛砖引玉听到更多你的观点和反馈。
如果今天的内容对你有用,也希望你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,123 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
08 如何在CMDB中落地应用的概念
我们前面讲了应用是整个微服务架构体系下运维的核心而CMDB又是整个运维平台的基石。今天我就讲讲在CMDB中如何落地应用这个核心概念以及如何建立应用集群分组的思路。
如何有效组织和管理应用
微服务架构下会有很多应用产生出来,少则十几、几十个,多则上百甚至上千个。这时我们面临的第一个问题就是如何有效地组织和管理这些应用,而不是让它们在各处散乱,命名方式和层次结构可能还不统一。
你可能接触过“服务树”的概念这个提法是小米在早期互联网运维实践的分享中传播出来的。我第一次听到这个概念是在13年阿里技术嘉年华大会上听小米运维的分享。再往前这个概念应该是从百度的运维体系中借鉴出来的。
这里的服务实际对应的就是我们前面提到的应用这个概念。据我了解,在阿里和腾讯都是叫作应用,现在业界比较通用的叫法也是应用。其实叫什么并不重要,关键还是要学习到对这个概念的管理方式。
从服务树这个名字中我们就可以了解到有效组织和管理应用的方式就是把它组织成一个树形的层次结构。这种管理模式无论是在BAT还是在其它的互联网公司基本都是一样的思路和模式所以叫法虽然不同但是思路上却是相通的可谓异曲同工。
基于业务维度的拆分对应产生了我们的应用拆分原则。比如对于电商公司大的维度会有电商、支付、广告、流量和搜索等业务领域进一步电商业务领域里最典型的会有用户、会员、商品、交易、商家、店铺以及物流等这里面还可以再进一步细分比如商品会有详情、SKU、SPU、库存、评价、标签等。
讲到这里,我们再看一下技术团队的组织架构,基本上是对应着整个业务技术架构的拆分的。也就是业务架构决定了技术架构,而技术架构又决定了一个研发团队的组织架构,这个组织架构中不同的团队单元分别承担着对应业务的需求开发和实现职责。
上面这个组织架构建设的逻辑和思路,也是我们在组建团队和职责划分时可以参考的。
这样一个逻辑讲下来,我们的应用管理思路其实也就明晰了:产品线-业务团队-应用。
这里举个电商商品的例子就是:电商技术-商品团队-商品中心-商品详情等。
当然因为每个公司对组织架构定义的方式不同,也可以用一、二级部门这样的方式来指代。但是具体团队的分工和职责,一定是来自于业务架构决定的技术架构,只有这样,各业务团队才会职责清晰,配合协作才会顺畅起来。
对于应用名定义,要设定规范,比如:
应用名必须以大小写英文字母以及下划线组合;
应用名长度不超过40个字符尽量简单易懂
不允许出现机房代号和主机名称这样的信息。
简单举例商品中心命名为itemcenter商品详情命名为detail。
这里做个小结:到了软件运维阶段,运维工作是否可以高效地组织开展,很大程度上,在前面的业务架构拆分阶段就决定了。也就是业务架构拆分得是否合理、职责是否明晰,决定了后续团队组织架构是否合理、团队职责是否明晰。如果这点没做好,到了运维阶段必然就是混乱的。
这一点我在开篇词中也提到过,运维能力的体现,一定是整体技术架构能力的体现,割裂两者单独去看,都是没有意义的。同时,对于当前仍然把运维割裂建设的研发团队,也需要去思考一下在组织架构建设上的合理性了。
应用的集群服务分组建设
上述讲到的是应用的组织管理,看上去逻辑思路相对清晰,组织起来也不复杂,但是再往下,应用的集群服务分组建设就会相对复杂了。
为什么会有集群服务分组呢?我们一起来看这么几个需求场景。
场景一:多环境问题。
我们常见的环境会有开发联调环境、集成测试环境、预发环境、线上环境等等。后面我们讨论持续交付时会讲到,实际场景下所需要的环境会更多。
场景二多IDC问题。
对于大型互联网业务会做业务单元化或者有海外业务拓展需求的场景我们会在多个IDC机房部署应用应用代码是相同的但是配置可能会不同。
场景三:多服务分组问题。
这个场景就跟具体业务场景相关了。举个例子比如商品中心IC这样一个核心应用对外会有商品详情、交易下单、订单、购物车、评价、广告、秒杀活动、会场活动、商家、店铺等一系列应用依赖它但是这些依赖它的应用优先级是不一样的。
核心应用和非核心应用比如交易支付链路上的应用属于核心应用任何时候都必须要优先保障但是对于评价、商家和店铺这些应用优先级就低一些。反过来理解就是一个应用出现故障是不是会影响业务收入如果影响就属于核心应用如果不是或者影响非常小那就属于非核心应用。所以IC这个应用下面就会有IC的交易分组IC的广告分组、IC的电商分组等这些分组就会相对固定和静态。
场景因素决定。这个对于电商就会比较典型比如大促时的秒杀场景对于参加秒杀活动的商品瞬时的访问量就会非常大而不参加活动的商品就不会有这么大的访问量。所以这时为了隔离较大的流量就需要有多个不同的秒杀IC分组从资源层面进行隔离同时上层秒杀活动的应用在配置中心配置依赖时就要配置到对应的秒杀IC集群分组上这样即使秒杀IC出现问题也不会影响正常的商品IC访问。所以根据场景不同阶段就会有IC的大促秒杀分组这种类型的分组就需要根据实际的业务场景来决定是个动态调整的过程需要开发和运维一起来讨论和验证。
一般情况下集群服务分组会有以上三个维度中的一个或多个来决定。还是以商品中心IC为例按照上面的介绍就会对应如下关系
至此,“应用-集群服务分组-资源”的对应关系就建立起来了。这里我们叫它“应用树”或者“服务树”都可以不管叫什么这个信息是CMDB中最为关键和核心的信息。为什么是最关键和核心的呢
CMDB在基础服务体系中的核心位置
这里我们以应用为核心来看CMDB中会保存“应用-分组-资源”的对应关系,这个关系对于周边系统来说都是需要的,举例如下。
1.监控系统。
我们需要以上的对应关系,监控到每个应用、每个集群以及每台机器上的关键信息。
2.发布系统。
我们需要将每个应用对应的代码进行编译打包,然后发布到对应集群的主机上,也需要这个对应关系,这一点我在后面的持续交付中还会讲到。
3.服务化框架。
需要依赖应用和集群分组两个信息其中主要是对应用名和集群分组名的依赖对于服务化框架来说更多的是通过其配置管理中心注册的应用名来实现应用的服务和API管理这里要做到与CMDB统一。同样像LVS和Nginx这样的四七层负载以及ZK这样的开源分布式配置管理凡是涉及服务注册、服务发现以及服务上下线的基础服务都是类似思路。
4.基础服务中。
如分布式DB、分布式缓存和消息等就需要应用的应用名以及应用与资源IP的对应关系或者集群分组与IP的对应关系。
应用名是因为要建立应用与分布式服务实例之间的关系。如应用与缓存NameSpace的对应关系应用与消息Topic的对应关系等以便于这些基础服务的生命周期管理和自动化开发。
应用与资源的对应关系是因为有些核心资源是要做ACL访问控制的。比如对于用户、交易或支付这样非常敏感的数据它们对应的数据库就不允许随意连接而应该是仅限于授权过的应用访问。这时就要针对应用对应的IP地址进行白名单配置。一方面可以通过分布式DB中间件进行配置另一方面也可以通过在DB层面进行设置比如MySQL就可以直接配置白名单策略同时也可以在机器的iptables上配置至于如何配置就看具体需求了但是无论怎样应用与资源的对应关系是非常重要的。
5.稳定性保障平台,或者叫服务治理平台。
针对系统的稳定性,我们会在应用中做很多的降级限流和开关预案策略,这些都是跟应用直接关联的。而且按照我们前面介绍的,不同的集群分组,策略可能会有不同,所以又会跟集群分组相关。同时,这些策略最终下发到具体服务器上运行的应用实例上,所以这里就会需要应用、集群分组以及对应的资源关系。
总结一下,简单示意图如下:
总结
通过上述的分析我们可以看到基于以应用为核心的CMDB中又衍生出“应用-集群服务分组-资源”这样一个运维体系中的核心关系。经过这三部分的分析,我们之前所说的基于应用为核心的运维视图就可以建立出来了,我们再次示意如下:
今天我们讨论的内容提到了监控、发布、基础服务以及稳定性平台会依赖CMDB中“应用、集群服务分组-资源”的对应关系信息但是当CMDB中的这些关系信息发生变化比如新增一个IP或者下线一个IP这些信息是如何传递到其它平台的呢这些平台又是如何查询这些关键信息的呢欢迎你留言与我一起讨论。
如果今天的内容对你有帮助,也请你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,110 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
09 如何打造运维组织架构?
前面几周我们介绍了Netflix为什么没有运维岗位、应用运维标准化、基础服务标准化以及从应用生命周期的角度如何进行运维建设等内容。这一周我们就来聊聊在组织架构和运维转型方面的话题。
Netflix给我们的启示
专栏的第一篇我们就介绍了Netflix的云平台组织架构你应该可以发现Netflix其实已经给我们提供了一个非常好的思路和方向就是在提供基础服务能力的同时提供对应的自助化运维能力。也就是说开发人员可以在这样一个平台上完成自己想要做的任何运维操作而不再依赖运维的人。
我们最应该学习和借鉴的,也恰恰是我们绝大多数团队都会忽略的,就是要做好运维和整个技术架构体系的融合,一定不要割裂两者。同时,还要注意不仅仅是促进组织架构层面的融合,最重要的是要促进职能协作上的融合。
应该怎么理解呢?
我先撇开组织架构,大致说一下我的思路。开篇词中我提到,运维能力的体现,一定是整体技术架构能力的体现。所以,要想做好运维就一定要跳出运维这个框框,从全局的角度来看运维,要考虑如何打造和体现出整个技术架构的运维能力,而不是运维的运维能力。这一点是根本,一定要注意。如果我们仍然片面地从运维的角度看运维,片面地从运维的角度规划运维,是无法走出运维低价值的困局的。
从价值呈现的角度看运维
当我改变了这个认知后,我的出发点就回归到了效率、稳定和成本这三个对于研发团队来说最重要的目标上来。从运维的角度来说,能够与这三个点契合的事情,我总结了以下五个。
1. 运维基础平台体系建设
这块主要包括我们前面提到的标准化体系以及CMDB、应用配置管理、DNS域名管理、资源管理等偏向运维自身体系的建设。这一部分是运维的基础和核心我们前面讲到的标准化以及应用体系建设都属于这个范畴。
2. 分布式中间件的服务化建设
在整个技术架构体系中,分布式中间件基础服务这一块起到了支撑作用。这一部分的标准化和服务化非常关键,特别是基于开源产品的二次开发或自研的中间件产品,更需要有对应的标准化和服务化建设。这也是我们无意识地割裂运维与技术架构行为的最典型部分,这里容易出现的问题,我们前面讲过,你可以回去再复习一下。
3. 持续交付体系建设
持续交付体系是拉通运维和业务开发的关键纽带,是提升整个研发团队效率的关键部分。这个部分是整个软件或应用的生命周期的管理体系,包括从应用创建、研发阶段的持续集成,上线阶段的持续部署发布,再到线上运行阶段的各类资源服务扩容缩容等。开发和运维的矛盾往往比较容易在这个过程中爆发出来,但是这个体系建设依赖上面两部分的基础,所以要整体去看。
4. 稳定性体系建设
软件系统线上的稳定性保障,包括如何快速发现线上问题、如何快速定位问题、如何快速从故障中恢复业务、如何有效评估系统容量等等。这里面还会有一些运作机制的建设,比如如何对故障应急响应、如何对故障进行有效管理、如何对故障复盘、如何加强日常演练等等。同样,这个环节的事情也要依赖前两个基础体系的建设。
5. 技术运营体系建设
技术运营体系也是偏运作机制方面的建设,最主要的事情就是确保我们制定的标准、指标、规则和流程能够有效落地。这里面有些可以通过技术平台来实现,有些就需要管理流程,有些还需要执行人的沟通协作这些软技能。
最终通过这样一个规划,我把团队以虚拟形式重新规划了不同职责,分别负责基础平台体系、分布式中间件服务化体系、持续交付体系和稳定性体系,基本就是上述的前四件事情。
对于最后一个技术运营体系,这一点作为共性要求提出。我要求团队每个成员都要具备技术运营意识。具体来说,就是要能够有制定输出标准的意识和能力,能够有规范流程制定的能力,同时能够将标准和流程固化到工具平台中,最后能够确保承载了标准和规范的平台落地,也就是平台必须可用,确实能给运维团队或开发团队带来效率和稳定性方面的提升。这些对个人的要求还是比较高的,要有一定的规划、设计和落地能力,能具备一整套能力的人还是少数,目前这块还是靠团队协作来执行。
运维协作模式的改变
上面的这几件事情,并不是由运维团队内部封闭来做。还是我们反复强调的那个思路,要站在怎么能够打造和发挥出整个技术架构体系运维能力的视角,而不仅仅是发挥运维团队的运维能力。所以这些事情的执行可以理解为是由运维团队发起,与周边技术团队协作配合来完成的。
所以这些事情都需要跨团队协作。一方面运维团队要主动出击,去沟通,去推进;另一方面,必须能得到上级主管甚至是更高层技术领导的支持,所以这里要求技术管理者必须要有这个意识,促进这样的组织协作方式变革,如果技术管理者意识不到或者支持不到位的话,运维在后续的推进工作中将会遇到非常大的阻力。
下面来分享下我们目前正在尝试的一些调整。
我们运维所在的平台技术部门,包括了分布式中间件、虚拟化技术、稳定性工具平台以及大数据几个子部门。当我们发起并推进上述工作时,就需要与这些团队联合协作,朝着某个目标共同执行。下面我们来看看细分的情况。
1. 运维基础平台建设
这块大多数的工作会由运维来完成,因为这是运维的基础,也属于整个技术架构比较关键的基础平台之一,这一点我们在讲应用和集群服务管理时已经介绍过。
2. 分布式中间件服务化建设
这个部分我们就需要分布式中间件团队的配合。我们可以一起制定各种使用标准、规范和流程;中间件团队负责提供运维服务能力的接口;运维团队根据用户使用的场景进行场景化需求分析,并最终实现场景,同时负责标准和自助化工具平台的推广和落地。
3. 持续交付体系建设
这一部分也会涉及多个团队的协作。在资源使用上我们前期会用到KVM那么如何快速交付KVM资源就需要与虚拟化技术团队协作。现在我们在尝试容器方案涉及到镜像制作、网络配置以及对象存储这些底层技术一样会与虚拟化团队配合在资源交付效率和利用率上都有很大提升。同时还会与中间件团队协作因为在应用发布和扩容缩容过程中就会涉及服务上下线这就要与服务化框架配合服务化框架提供底层运维服务能力而运维要做的就是通过中间件运维能力的封装整合进而实现用户使用的场景化需求。
4. 稳定性体系建设
这里会涉及一些链路埋点、限流降级、以及开关预案等一些技术方案需求通常会有这样一个专门的稳定性工具团队对外输出一些稳定性保障能力比如一些稳定性通用SDK的开发后台日志采集分析以及数据计算等等这些事情会对技术能力的要求比较高需要具备较强开发能力的人来做。所以运维在这里发挥的作用一个是上述提到的场景化实现能力再一个就是稳定性能力的落地或者说是运营能力。稳定性工具提供的多是能力和支持最终要在业务层面真正执行就需要运维和业务开发共同来执行。比如一个应用上线是否具备关键接口的限流降级能力是否具备熔断能力是否满足上线的性能及容量要求这个工作是需要运维深入每个业务根据不同的业务场景和实现情况一个个具体落地才行。所以整体上对运维技术运营能力的要求就会非常高。
运维在这个过程中要发挥的最关键作用就是通过用户使用场景的分析,将各项基础服务封装并友好地提供出来,并确保最终的落地。方式上,或者是通过工具平台的技术方式,比如分布式中间件基础服务;或者是通过技术运营能力,比如稳定性能力在业务层面的落地。
运维在这个过程中,就好像串起一串珍珠的绳子,将整个平台技术的不同部门,甚至是开发团队给串联起来,朝着发挥出整体技术架构运维能力的方向演进。
运维的组织架构
上面是我们从团队需求和运维价值呈现层面成立的虚拟组织,从实际的人员管理以及技能维度来划分的话,我们和其它互联网公司的运维团队差别不大,基本会分为如下几个岗位:
基础运维包括IDC运维、硬件运维、系统运维以及网络运维
应用运维,主要是业务和基础服务层面的稳定性保障和容量规划等工作;
数据运维,包括数据库、缓存以及大数据的运维;
运维开发,主要是提供效率和稳定性层面的工具开发。
这个实体的组织架构相当于是从技能层面的垂直划分。基础运维更擅长硬件和操作系统层面的运维应用运维可能更擅长业务稳定性保障、疑难问题攻关以及技术运营等数据运维就不用多说了DBA本身就是专业性极高的一个岗位运维开发则是支持上述几个岗位日常运维需求的是否能将人力投入转换成工具平台支持就看这个团队的能力。
而前面所说的从价值呈现层面进行的虚拟团队划分,则是将上述几个实体团队技能上的横向拉通,让他们重新组织,形成技能上的互补,从而发挥出更大的团队能力。
实体组织架构,相当于一个人的骨骼框架,但是价值呈现层面的虚拟组织,就更像是一个人的灵魂,体现着这个人的精神面貌和独特价值。
这个过程中,必然会对运维的技能模型有更新、更高的要求。
总结
今天我为你介绍了我们正在实践的一些运维组织架构方面的内容。后来当我翻阅《SREGoogle运维解密》这本书时发现如果按照书中的章节目录进行分类的话基本上都可以与前面我介绍的部分对应起来这也更加坚定了我们要按照这套组织模式运作下去的信心。
同时,我们也要明白,业界没有一劳永逸的组织架构,也没有放之四海而皆准的组织架构标准,更没有万能的可以解决任何问题的组织架构设计,这里的关键是我们如何能够发挥出团队整体的能力和价值,而这一点又需要我们不断地与自己所在团队和业务特点去匹配和契合,这是一个不断变化的过程,也是需要持续调整的过程。
所以这对技术管理者要求会比较高,应该如何不断地去匹配和契合这个最佳价值点,同时如何统筹调度好团队中不同类型的技术资源并形成合力,是非常重要的。
你的团队在实际过程中遇到过哪些问题,你有怎样的经验和观点,欢迎你留言与我一起讨论。
如果今天的内容对你有帮助,也请你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,84 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
10 谷歌SRE运维模式解读
前面我和你分享了一些关于运维组织架构和协作模式转型的内容为了便于我们更加全面地了解先进的运维模式今天我们再来谈一下谷歌的SRESite Reliability Engineer。同时也期望你能在我们介绍的这些运维模式中找到一些共通点只有找到这些共通点才能更深刻地理解并借鉴到真正对我们有用的东西。
专栏的第一篇文章我们介绍了Netflix的NoOps模式。这个模式并不意味着不存在任何运维工作只是Netflix将这些事情更紧密地融入到了日常的开发工作中又做得非常极致所以并没有很明显地体现出来。
但是谷歌的SRE却是一个真实具体的岗位也有明晰的岗位职责。从借鉴意义上来讲SRE可以给我们提供更好的学习思路和样板。
SRE这个概念我应该是2014年下半年的时候听到的。当时可接触的资料和信息有限只知道是谷歌对运维岗位的定义负责稳定性保障就没有更多其他的认识了。
后来有越来越多在谷歌工作或接触过这个岗位的专家开始在公开演讲中分享这个概念。同时《SREGoogle 运维解密》这本由多名谷歌SRE亲笔撰写的图书也开始在国内广泛流传让我们对很多细节有了更加细致的了解。
SRE岗位的定位
首先SRE关注的目标不是Operation运维而是Engineering工程是一个“通过软件工程的方式开发自动化系统来替代重复和手工操作”的岗位。我们从SRE这本书的前面几个章节可以看到谷歌不断强调SRE的工程能力。我简要摘取几段
Common to all SREs is the belief in and aptitude for developing
software systems to solve complex problems.
所有的SRE团队成员都必须非常愿意也非常相信用软件工程方法可以解决复杂的运维问题。
By design, it is crucial that SRE teams are focused on engineering.
SRE模型成功的关键在于对工程的关注。
SRE is what happens when you ask a software engineer to design an
operations team.
SRE就是让软件工程师来设计一个新型运维团队的结果。
与之相对应的还有一个很有意思的地方整本书中提到Operation的地方并不多而且大多以这样的词汇出现Operation loadOperation overloadTraditional/Manual/Toil/Repetitive Operation Works。你可以仔细体会一下这些大多就是传统的纯人工操作模式下的一些典型词汇。
我们可以看到从一开始谷歌就没把SRE定义为纯操作类运维的岗位也正是谷歌换了一个思路从另外一个维度来解决运维问题才把运维做到了另一个境界。
SRE岗位的职责
书中对SRE的职责定义比较明确负责可用性、时延、性能、效率、变更管理、监控、应急响应和容量管理等相关的工作。如果站在价值呈现的角度我觉得可以用两个词来总结就是“效率”和“稳定”。
接下来,详细说下我的理解和分析。
SRE的能力模型不仅仅是技术上的还有产品设计、标准规范制定、事后复盘总结归纳这些技术运营能力同时还需要良好的沟通协作能力这个就属于职场软技能。
SRE直译过来是网站稳定性工程师。表面看是做稳定的但是我觉得更好的一种理解方式是以稳定性为目标围绕着稳定这个核心负责可用性、时延、性能、效率、变更管理、监控、应急响应和容量管理等相关的工作。
分解一下,这里主要有“管理”和“技术”两方面的事情要做。
管理体系上涉及服务质量指标SLI、SLA、SLO、发布规则、变更规则、应急响应机制、On-Call、事后复盘机制等一系列配套的管理规范和标准制定等。
技术体系上,以支持和实现上述标准和规范为目标,涉及自动化、发布、监控、问题定位、容量定位,最终以电子流程串联各个环节,做到事件的闭环。
可以看到技术上的平台和系统是用来支撑管理手段的。谷歌的运维其实并没有单独去提自动化、发布、监控等内容,而是通过稳定性这个核心目标,把这些事情全部串联在一起,同时又得到了效率上的提升。
我们来看几个主要的系统。
自动化。是为了减少人为的、频繁的、重复的线上操作以大大减少因人为失误造成的故障同时提升效率。比如谷歌内部大名鼎鼎的Borg系统可以随时随地实现无感知的服务迁移。现在它的开源版本已然成为业界容器编排体系标准的Kubernetes。
持续交付。谷歌非常重视持续交付。由于它的需求迭代速度非常快,再加上是全球最复杂的分布式系统,所以就更加需要完善的发布系统。
问题定位。这块跟监控相关但又有不同。我看到谷歌SRE这本书中并没有提到太多Tracing的内容更多的是讲监控和问题管理层面的跟踪机制。其实关于问题定位谷歌的Dapper大名鼎鼎功能很强大国内外很多跟踪系统和思路都参考了Dapper的理论。这块也是为了能够快速定位问题保障稳定而产生的国内分享的大多关于全链路跟踪和分析、限流降级、开关和预案系统、强弱依赖等都属于这个范畴我认为这块应该更准确地定义为分布式服务治理相关的内容。
各类分布式系统。如分布式锁、分布式文件、分布式数据库,我们熟知的谷歌三大分布式论文,就是这些分布式系统的优秀代表,也正是这三大论文,开启了业界分布式架构理念的落地。
这些系统大都是以稳定性为导向,同时带动了日常运维效率的大幅度提升,有了监控和全链路这样的问题发现和定位手段,也大大提升了我们对故障处理和问题定位的效率。容量管理,不仅仅可以保障容量充足,还能最大程度地保障资源分配的合理性,尽可能减少浪费,对于成本管控也大有好处。所以,围绕着稳定性这个核心目标,不仅达到了稳定的目的,还获得了高效的运维效率。
所以SRE的理念通过稳定性这个核心点将整个运维体系要做的事情非常系统紧密地整合起来而不是一个个孤立的运维系统。所以SRE是一个岗位但更是一种运维理念和方法论。
如何借鉴和落地
在国外SRE岗位的薪资和SWE软件开发工程师相比要平均高出25%。从实际的岗位要求上看SRE的技能要求也要比SWE更高、更全面所以这样的人才是比较紧缺的。即使在国外除了谷歌、Facebook以及Netflix这样超一流的科技公司能够招聘到或者内部培养出较多这样的人才其它公司的SRE、PE或者应用运维也无法完全达到上面的要求。
在国内就更难一些那怎么做呢一个思路就是我们之前讲组织协作模式转型时提到的就是要依靠团队的力量、发挥团队的力量如果是单个团队不能完成的事情就跨团队协调完成。所以SRE岗位的要求很高但是我们可以靠团队中具备不同能力的人协作共同达成SRE的职责和目标。
最后,还是我反复强调的观点,要想做好运维,就得跳出运维的局限,要站在全局的角度,站在价值呈现的角度,站在如何能够发挥出整体技术架构运维能力的角度,来重新理解和定义运维才可以。
通过今天的内容你对于SRE有什么新的理解或者疑问结合前面的内容你能够挖掘出哪些共通点呢欢迎你留言与我讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,98 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
11 从谷歌CRE谈起运维如何培养服务意识
2016年10月谷歌云平台博客Google Cloud Platform Blog上更新了一篇文章谷歌宣布了一个新的专业岗位CRECustomer Reliability Engineering直译过来就是客户稳定性工程师。我看了介绍后发现还是一个挺有意思的岗位设置搜索之后发现针对这个岗位国内还没有太多的解读。下面我们就来尝个鲜一起来看一看。
CRE产生的背景
这个岗位出现的主要背景还是越来越多的用户选择在云上开展自己的业务很多企业和用户将业务从原来传统的自运维IDC机房迁移到云上。这样做其实就是选择相信公有云平台但同时也就放弃了对底层基础设施的把控甚至把企业最为核心的数据也放到了云上。说简单点就是一个公司的身家性命都交给公有云了。
虽然绝大多数的公有云都宣称自己的稳定性多么高多么好,但是我们知道实际情况并非如此。
其实我们可以看下Netflix虽然业务在相对稳定的AWS上但是自从在AWS上遇到过几次严重故障后就开始自己做稳定性保障的功能我们熟知的Chaos Monkey这只猴子就是这么来的进而发展到后来的Chaos Engineering这样一整套体系。
可以看到Netflix秉承Design For Faliure从一开始就选择在变化多端且自己不可控的环境里加强自己系统的健壮性和容错能力而不是依赖任何云厂商的承诺。
不过并不是任何企业都具备Netflix这样的技术能力把自己打造得这么稳定。所以当云上不稳定的情况发生时公有云客户通常是手足无措的。因为他并不了解出了什么状况不知道是自己的问题还是云上基础设施或基础服务的问题也不知道自己应该从哪里入手恢复业务所以时间长了必然就会感到非常焦虑各种不放心。
CRE岗位的职责
CRE出现的根本目的就是消除客户焦虑真正地站在客户的角度去解决问题同时对客户进行安抚、陪伴和关怀。
通常的售后支持都是你问什么问题我就回答什么问题能马上解决的就马上解决不能解决的就转到后端处理然后让客户等着承诺多长时间内给出答复。这种流程标准严格执行SLA规范对于一般问题还好但要是真的出现大问题就不行了。
业务挂了,我都火烧眉毛了,你还跟个机器人一样,我问啥你说啥;或者你排查下对我说跟你没关系,让我自己再检查下,再或者转给后端处理,让我先等着,这个体验就非常差了。
所以CRE这个角色一定是站在客户角度解决问题。加入客户的“作战室”War Room和客户一起排查问题不解决自己不撤退还会随时通报进展必要的时候会将故障升级到更高的级别寻求更专业的资源投入以共同解决同时根据客户的不同反应进行不同方式的安抚。
CRE还会发挥谷歌多年积累下来的非常宝贵的线上运维经验在日常就跟客户沟通传递一些稳定性保障的知识。CRE可以按照谷歌总结出来的类似SRE的标准规范对客户线上系统进行稳定性标准评审并给出专业的建议。如果客户同意遵守这样的标准规范执行在后续出现故障时CRE就完全可以按照非常成熟的SRE的运作模式去协作用户处理故障这样就会大大提升CRE和客户的协作效率为故障快速处理赢得更多宝贵时间。同时CRE也可以发挥更大的专业作用而不是之前的对客户系统不熟悉空有一身绝世武功却使不上劲。
所以CRE这个角色既具备良好的专业技术能力又有非常强的问题解决能力同时还要具有优秀的客户沟通和关怀能力。背后还有谷歌多年的全球最佳运维实践SRE的经验和方法论支持让CRE这个角色发挥出更加独特的作用这一点可能是其它公有云厂商难以达到的。
从CRE谈谈做运维为什么要有服务心态
上面花了些篇幅对CRE做了一个整体的介绍。我个人的整体感受CRE更多的是一个服务性质的岗位最终是要对客户的满意度负责所以我们可以看到他的职责里面处处充满了紧贴客户需求和痛点的工作内容。
我们可能一下子达不到CRE这么高大上的水平但是日常工作中我们要不断提升自己的服务意识还是很有必要的。而且我观察下来有时候我们日常工作中出现的很多沟通问题、协作问题甚至是技术问题都是因为服务意识不够而导致的。
我总结了一下,是不是有服务心态,表现在我们的做事方式上,就是我们是否能够站在对方的角度考虑问题、解决问题。
具体怎么做,可以有很多方式,这里我给出我个人的几个建议。
1. 多使用业务术语,少使用技术术语
与合作部门沟通协作特别是对于非技术类的业务部门尽量多使用业务语言来表达。在讨论一个需求时如果表达的都是API、缓存、数据库、消息队列等等这些专业术语估计业务部门的同学肯定是跟不上我们的思路的这样的沟通通常无法正常地进行下去所以就会经常出现业务同学说业务的事情技术同学说技术的事情两边不能达成一致矛盾就产生了。
这里需要强调的一点是,对于绝大多数的公司来说,业务一定是最重要的,技术是实现业务功能的一种手段和方式,所以一定是从业务角度出发考虑技术解决方案,而不是从技术角度出发让业务来适配技术。
那怎么从业务角度出发呢?就是我刚说的尝试用业务语言去沟通,用对方能够听得懂的表达方式去表达你的技术观点。为了让业务人员理解你的想法,就自然会用业务的思路去思考和解决问题了。这个需要一点点改变,可以先从尝试开始。
2. 学会挖掘问题背后的真正诉求
外部提出的一个问题,可能并不一定是真正的问题,而是问题的一个解决方案。
先举个之前我遇到的例子,有个部门给我们提了一个在服务器上安装翻墙软件的需求,结果我们的工程师就照着这个需求去做了,最后发现软件怎么调都启动不了,中间还牵扯到网络同事的配合,需要检查网络上的配置,最后就差动网络设备了。
后来我就去问为什么要安装翻墙软件呢一问才知道有个业务需求是需要爬取Twitter、Instagram和Facebook上一些时尚达人的时间线信息的需要部署一个这样的应用然后能够对外访问但是部署在我们机房内部发现不行肯定不行啊所以就建议尝试装一个翻墙软件看看是不是能访问出去。
这么一问,就发现安装翻墙软件不是真正的需求,真正的需求是能够访问到海外站点。看问题的角度不同,解决方案也就不一样了。
因为我们有公有云的海外节点这样的需求我们直接将应用部署在海外节点就可以了然后从申请资源、部署上线到调测通过30分钟搞定。
这种情况非常常见,也是日常团队协作中最容易出现的问题,很多矛盾都是因为这种原因导致的。如果按照上述不假思索的方式去做,极有可能是没有结果,或者是结果无法让人满意。如果你很努力很认真地做了很多事情,但却无法得到对方的认可,那就太令人沮丧了。
遇到类似问题,可以不着急动手做,先多问自己和对方几个问题,比如:
为什么要这样做?
谁要求做这件事情的?
这样做的目的是什么?
这样做是为了解决什么问题?
这一点其实也是站在对方角度去考虑,去思考对方要解决的问题是什么,而不是解决我们的问题。通常情况下,两三个问题后,一般就会暴露出背后最原始的那个需求了。正所谓“磨刀不误砍柴工”,问题和背景搞清楚了,思路和方案就是顺其自然的事情了。
3. 解决问题的时候关注目标,而不是聚焦困难
我尝试写了一段话想来分享我的观点但是读来读去感觉有点太鸡汤。所以还是上一张图这个是我16年去腾讯交流的时候在腾讯办公区拍到一张照片对我启发很大。
两种不同的思考问题的方式,带给人的感受也是完全不一样的。
道理还是需要我们自己悟明白的,所以文字也好,图片也罢,期望对你也有所启发。
近些年,随着云计算技术的深入发展,公有云事业也不断拓展,运维领域的分工也在不断地精分细化,而每个细分领域对专业技术的要求也越来越高,专业的服务化程度也越来越高。我想这是一个好现象,让原来非常模糊的运维行业范畴变得越来越清晰、越来越具体。
对于我们运维来说,这样的发展既是机遇,也是挑战。一方面我们要不断提升自己的技术能力,另一方面也要注意自身服务意识的培养,让自己的能力得以发挥,创造更大的价值,获得更好的回报。
对于今天的内容你有怎样的共鸣和思考,欢迎你留言与我一起讨论。
如果今天的内容对你有帮助,也请你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,88 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
12 持续交付知易行难,想做成这事你要理解这几个关键点
前面几篇文章,我们介绍了非常基础的运维建设环节。如果我们想要这些运维基础建设发挥出更大的作用和价值,就需要针对运维场景进行场景化设计和自动化,让效率和稳定性真正提升上来。也就是说,把基础的事情做好之后,我们就要进入效率提升的运维场景自动化阶段了。
在这一阶段,我个人的经验和建议是,首先要把持续交付做好。
为什么要先做持续交付?如果说我们完成了一些运维职责范围内的自动化工具,提升的是运维效率的话,那么,做持续交付就是提升整个研发体系效率的关键。
做持续交付的价值表现在哪里?
持续交付覆盖了应用的整个生命周期,涉及产品、开发、测试、运维以及项目管理等相关方面。从生命周期出发,自然就会牵出整个自动化的全貌,就会有从全局着眼的规划设计,这时无论是在开发还是运维过程中存在的问题,都会完完整整地暴露出来。那么,应该以什么样的主线开展?各方应该如何配合?应该以怎样的优先级明确任务?这些问题就都清楚了。同时,也避免了各个环节只把注意力放在各自职责范围内的事情上,而忽略了整体的配合。所以,做好持续交付,对于整个研发体系意义重大。
我们面临的实际场景是怎样的?
我们知道,随着业务复杂度的升高,不管是分层架构,还是微服务架构,都会带来一个最明显的变化,那就是应用数量增多,有时甚至多达几十个、上百个。不同的应用就有不同的代码、依赖和配置,为了协同多应用之间的在线发布,我们还要做到服务能够平滑地进行上下线切换。同时,为了最大限度地降低发布风险,我们还需要进行多环境下的验证,以及上线后的灰度策略等等。
应对这一切,如果只是手工维护,或者利用简单的工具脚本进行维护,都不能保证正常运作。这个时候,我们必须有一系列的流程、机制和工具链来支持和保障。
由杰斯·赫布尔Jez Humble、戴维·法利 David Farley编著乔梁老师翻译的《持续交付发布可靠软件的系统方法》Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation这本书针对持续交付的过程、方法和指导建议几个方面做了非常详细的描述。我向你强烈推荐这本书不过这本书的内容并不仅仅针对于微服务架构。
接下来我就分享如何把持续交付的理念和实践相结合,讲一讲在实践过程中,做好持续交付最关键的几步是什么,以及具体应该怎么做。
什么是持续交付?
我们现在经常会接触到这些名词比如持续交付、持续集成、持续部署、持续发布、DevOps和敏捷开发等等。大多有关持续交付的分享或文章中这些名词经常会同时出现。它们之间到底有什么区别我自己之前也弄不清楚直到看到乔梁老师的这张图。
这里我重点解释一下持续交付这个概念,通俗地说,持续交付代表着从业务需求开始到交付上线之后的端到端的过程。后面我们会针对这个过程的关键环节进行分享。
受篇幅所限,其它名词就先不作过多解释了,你可以看图自己体会,都不难理解。后面针对某些概念我们还会提到。
持续交付的关键点
可以说,这一部分也是我们后面将要分享内容的提纲。
从前面那张图来看,做持续交付需要端到端考虑,同时还要有一些非常关键的准备工作。我把这些工作大致分为以下几个部分。
1. 配置管理
这一部分会利用到我们前面讲过的标准化和CMDB打下的基础同时还会有更大的外延比如环境配置、代码配置以及依赖管理等等。
配置管理是非常关键的基础工作。有一点值得注意,那就是标准化是一个持续的过程。我们不太可能在一开始就把所有运维对象、属性和关系全部都考虑清楚,面面俱到是不太现实的,所以,一定要具备标准化的意识,在开展运维工作的过程中,持续不断地用这个思路去标准化新出现的对象。先标准,再固化,然后自动化。
2. 需求拆解
需求拆解这个工作跟业务需求部门和业务开发有更直接的关系。在这里,运维需要做的是,明确需求拆解的粒度和我们最终发布上线的粒度相匹配。
3. 提交管理
需求拆解完成后,就进入到开发阶段,开发完成后向代码库中提交代码,这个过程中代码分支的合并策略选择就是提交管理。
4. 构建打包
这一部分是指将提交后的代码编译成可发布的软件包。
5. 自动化测试
自动化测试包括功能测试和非功能性测试。对于运维来说,会更注重非功能方面的特性,所以后面我会着重讲非功能性相关的测试环节。
6. 部署发布
这一部分是指发布到不同的环境如开发环境、预发环境、线上Beta以及线上全量环境。针对不同的环境发布策略和注意事项也会不同。
以上是一个完整的持续交付过程中最重要的几个环节,后面我们分篇进行详细介绍。
从我自己的实践经验来看,配置管理、提交管理、构建和部署发布是持续交付的重中之重,是关键路径,是从开发代码开始,到发布上线的必经之路。当时,因为这几个环节出现了问题,不能解决,运维同学经常做手工发布,这样效率就跟不上,还经常出现各种问题。
后来,我们就是先从这几个环节入手,把阻塞的问题解决掉,然后在这个主流程上不断增加外围能力,让整个流程的功能更加丰富和全面。整个系统也从原来的只具备持续部署发布功能的平台,逐步演进为具有持续交付能力的平台。由此可见,我们实现持续交付的过程,也不是一蹴而就的,而是在摸索中逐步演进完善的。
最后,给你留两个思考题。
先放下持续交付的概念,你所理解或经历的从开发完代码到发布到线上这个过程中,会有哪些环节?和我列出来的这几部分是否有相同之处?
持续交付是谁的持续交付,它的主体是谁?或者有哪些主体?
欢迎你留言与我讨论。
如果今天的内容对你有用,也欢迎你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,101 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
13 持续交付的第一关键点:配置管理
今天我们来看持续交付的第一个关键点:配置管理。按照持续交付的理念,这里所说的配置管理范围会更广,主要有以下几个部分。
版本控制
依赖配置
软件配置
环境配置
讲持续交付,一上来就先讲配置管理,主要还是想强调:配置管理是基础,是关键。我们后面将要讲的每一个持续交付环节,都对配置管理有很强的依赖。这个基础工作做不好,也就谈不上的持续交付的成功。勿在浮沙筑高台,我们做工具平台或系统,一定要重视基础的建设。
同时,这里还有一个前提,就是一定要做到代码和配置的分离。不要让配置写死在代码里,需要依靠严格的规范和约束。同时,对于那些因历史原因遗留在代码中的配置,要多花些时间和精力把配置剥离出来,做这项工作没有什么好的方法或经验,只能多上心,多投入些精力。
配置管理中,对于版本控制和依赖配置目前都有比较成熟的工具体系支持,也有丰富的实践经验供我们参考学习,下面我会做一个简要的介绍。
对于软件配置和环境配置管理,这两项配置跟我们自身的业务软件特性强相关,是整个持续交付过程的关键,我会结合我们自身的实践经验进行重点介绍和分享。
版本控制
版本控制的主要作用是保证团队在交付软件的过程中能够高效协作,版本控制提供了一种保障机制。具体来说,就是团队在协作开发代码的情况下,记录下代码的每一次变更情况。
说到这里你是不是想到了SVN和Git这样的版本管理工具其实我们每天都在接触每天都在不停地做这个事情所以目前看来这是一件很平常的事情。
关于这一部分我在后面的文章里会介绍关于提交阶段的实践经验。这里我们只要知道,版本控制及其工具是必不可少的,因为这是开发团队协作最基础的工具。现在应该很少有团队不采用版本控制的管理机制吧?
依赖管理
这里以Java为例我们使用Java进行开发必然会依赖各种第三方的开源软件包。同时内部还会有不同组件的二方包。这些三方包和二方包就是一个应用编译和运行时所依赖的部分。
有过开发经验的同学肯定都知道即使运行一个非常简单的Web应用都会有大量的jar包依赖。如果人工去管理这些依赖基本上是不可能的所以就需要有依赖管理的工具。
对于Java来说我们熟知的依赖管理工具有Ant、Maven和Gradle。当然这些工具不仅仅提供依赖管理这样单一的能力一般都具备以下几个能力
二方包、三方包的仓库Repository管理
依赖管理;
构建打包。
下面介绍下我自己的实践经验。因为我们的经验基础都在Maven上再加上Maven周边有一些优秀插件和业界经验可以借鉴比如后面将要介绍到的AutoConfig所以我们选取了Maven作为主力构建工具。
大致用法是建立一个本地Maven源构建时会优先从本地源中获取依赖包本地源中没有对应的依赖时会从公网上下载同时缓存到本地。这也是业界绝大多数公司采用的一种通用方案。具体如何构建打包呢这个内容会在构建阶段进行分享。
软件配置
这里我把软件配置细化为两类:一类是代码配置,一类是应用配置。
1. 代码配置
我们可以这样理解,代码配置是跟代码运行时的业务逻辑相关的。比如应用的服务接口、并发线程数、超时时间等这些运行时参数;还有类似于业务或技术上的开关,比如商品评论是否开放、优惠时间段设置等等。
2. 应用配置
还记得我们在标准化文章中提到的应用吗?应用配置就是应用这个对象的属性和关系信息。我们把应用配置放到持续交付这个场景中进行分析,对于这个配置可以细分为:
应用构建时配置比如它的编程语言、Git地址以及构建方式等
应用的部署配置源代码目录、应用日志目录、Web日志目录、临时目录、脚本目录等
应用的运行配置,应用启停、服务上下线方式、健康监测方式等;
应用运行时与基础组件的关联关系比如其依赖的DB、缓存、消息以及存储的IP地址、域名、端口、用户名或Token等。
从上面这种分类方式中,应该可以体会到,我们对于配置的分类,也是基于应用生命周期的不同阶段进行分解和分析的。所以,标准化的过程也是一个持续迭代的过程。不同的场景下,一个应用可能会具备不同的属性。这个时候,如果我们无法在一开始就把这些属性梳理得清清楚楚,具备标准化的意识和思路就显得更为重要。这样,当我们遇到新场景的时候,随时可以对它做标准化分析和建模。
3. 代码配置和应用配置的区别
从上面的分析中,你有没有找出两者的区别?这里建议你暂停一下,花一分钟时间自己先想想代码配置和应用配置有什么区别,再往下看。
从区别上讲,我们可以认为代码配置是跟业务或代码逻辑相关的,动一下就会改变系统执行状态,是运行时的配置,但不依赖周边环境。而应用配置,是跟业务和代码逻辑无关的,不管你怎么动,业务逻辑是不会改变的,但是它跟环境相关。
与环境相关,按阶段分又大致可以分为两个阶段、三种情况。
第一种软件在交付过程中环境会不一样。比如我们正式发布软件前会历经开发测试环境、预发环境和生产环境等等。那开发测试环境访问的DB跟线上访问的DB就不能是同一套。同时这个环境中的应用依赖的大多是本环境内的基础组件和应用但不是必然原因我们后面会讲到。还有日志级别也可能不同比如测试环境可以开Debug级别但是线上是绝对不允许开Debug的。
第二种,软件交付上线后,线上可能会存在多机房环境,特别是有海外业务的公司,一个站点可能会在中国、北美、欧洲以及东南亚等不同区域建立当地访问的分站点;或者大型网站做了单元化,在国内也会分多机房部署,这个时候每个机房的环境配置必然不同。
第三种软件交付后一套软件可能交付给不同的客户分别独立运行比如类似ERP、CRM这样的软件或者私有部署的SaaS服务等。不同客户的基础环境是不一样的有的可能是Linux有的是Unix还有的可能是Windows这时应用配置中的各种目录、用户名等信息可能也是不一样的软件的交付模式就取决于最终的客户环境。
对于平台类的产品遇到第一、二种情况的可能性更大这两种情况更多的是对周边依赖的配置不同比如不同的服务注册中心、DB、缓存或消息等等。对于一些针对不同客户进行私有部署的产品可能更多的是第三种情况这种情况就是应用的基础配置比如目录、用户名以及基础软件版本等会有不同。
我们回到代码配置和应用配置之间的区别这个问题上来。
对于代码配置我们一般会通过Config Server这样专门的配置管理服务进行动态管理在软件运行过程中可以对其进行动态调整。之所以增加这些配置主要是让开发能够以更灵活的方式处理业务逻辑。当然也有一些为了稳定性保障而增加的配置比如限流降级、预案开关等等。对于前者运维不必关注太多而后者是运维关注的重点这个内容我们后面讲到稳定性部分会重点分享。
对于应用配置,是我们在构建软件包时就需要面对的问题。这个配置取决于环境,所以就延伸出持续交付过程中非常重要的一个配置管理:环境配置管理。解释一下就是,不同环境中的应用配置管理。
环境配置是我们在持续交付过程中要关注的重中之重,也是最为复杂的一部分。我们自己的团队在做多环境发布和管理的时候,遇到最头疼的问题就是环境配置管理,我们下一期就着重来聊聊环境的配置管理。
今天我和你分享了做持续交付的第一步:配置管理,主要包括版本控制、依赖配置、软件配置和环境配置四个部分。关于今天分享的内容,你有怎样的思考或疑问,欢迎你留言与我讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友。我们下期见!

View File

@ -0,0 +1,138 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
14 如何做好持续交付中的多环境配置管理?
上一篇内容中,我们讲到软件配置中的代码配置和应用配置,这两种配置之间最大的区别就是看跟环境是否相关。由此,就引出了持续交付过程中最为复杂的环境配置管理这个问题,准确地说,应该是不同环境下的应用配置管理。
今天我就结合自己的经验和你聊一聊环境管理的解决方案。
多环境问题
上篇内容我们介绍了应用配置的三种情况,今天我们稍微聚焦一下,以上篇文章中提到的前两种应用配置场景为主进行介绍,也就是平台类的业务。我们一起来看同一套软件在持续交付过程中和交付上线后,多环境情况下的配置管理问题。
我们先从生命周期的角度,对环境做个简单说明,主要包括:
开发环境,主要是在应用或软件开发过程中或完成后,开发人员对自己实现的代码进行单元测试、联调和基本的业务功能验证;
集成环境,开发人员完成代码开发并自验证通过后,将应用软件发布部署到这个环境,测试人员再确保软件业务功能可用,整个业务流程是可以走通的;
预发环境,在真实的生产数据环境下进行验证,但是不会接入线上流量,这也是上线前比较重要的一个验证环节;
Beta环境也就是灰度环境或者叫金丝雀发布模式。为了整个系统的稳定性对于核心应用通常会再经历一个Beta环境引入线上万分之一或千分之一的用户流量到这个环境中
线上环境,经历了前面几个阶段的业务功能和流程验证,我们就可以放心地进行版本发布了,这个时候就会将应用软件包正式发布到线上 。
以上是一个持续交付体系中必须要有的几个环境。环境建设,又是一个比较大的话题,我们后面会专门来讲,今天就聚焦在环境配置管理上。
不同环境下的应用配置管理
我们前面提到,环境配置管理,解释得更准确一点,应该是不同环境下的应用配置管理,所以这里的核心是应用配置管理。因为有多个环境,所以增加了其管理的复杂性。持续交付过程中涉及到应用配置管理的属性和关系如下:
应用属性信息,比如代码属性、部署属性、脚本信息等,你可以参考之前我们对这块的细分,这里就不细讲了;
应用对基础组件的依赖关系。这个也不难理解应用对DB、缓存、消息以及存储有依赖不同的环境会有不同的访问地址、端口、用户名和密码。另外在分布式架构中一个应用必然要依赖一个环境中的其它应用这时对于应用的服务注册、服务发现也要求必须在本环境中完成。举一个最简单的例子我们肯定不允许一个线上应用服务注册到线下环境中去让线下业务测试的服务调用影响到线上服务运行要不然就会导致线上的业务故障了。
讲到这里,你应该会发现,对于我们假设的平台类业务场景,应用的基础属性信息是不会随着环境的变化而发生变化的,但是应用依赖的基础设施和依赖这个关系是会随环境不同而不同的。所以,我们可以再进一步理解,环境配置管理主要是针对应用对基础设施和基础服务依赖关系的配置管理。
如果是针对不同的客户进行私有化部署的软件,那么应用的基础属性信息可能也会发生变化,但是这样的场景就更会更加复杂一些,但是配置管理上的解决思路上是一样的,所以这里我们还是简化场景。
环境配置管理解决方案
上面详细讲解了环境和应用配置之间的管理,下面就结合我自己团队和业界的一些方案,来看看这个问题应该怎样解决。
我们的示例尽量简化场景,重点是讲清楚思路。所以我们假设现在有三个环境:
开发环境
预发环境
线上环境
继续假设某应用有配置文件config.properties里面存储了跟环境相关的配置简化配置如下
缓存地址cache.app.url
消息地址message.app.url
数据库地址db.app.url
支付调用地址pay.url
支付调用Tokenpay.app.token
很明显,不同的环境,配置是不完全相同的。我们看以下几个解决思路。
方案一,多个配置文件,构建时替换。
这是一个比较简单且直接有效的方式,就是不同环境会分别定义一个配置文件,比如:
开发环境dev_config.properties
预发环境pre_config.properties
线上环境online_config.properties
这几个配置文件中的配置项保持相同,但是配置的值根据环境不同是不一样的,不过都是固定的实际信息。比如开发环境配置文件中的缓存地址:
cache.app.url=10.88.77.66
而线上环境配置文件中:
cache.app.url=10.22.33.44
然后在构建时我们会根据当前所选定的环境进行替换。比如我们现在构建开发环境的软件包这时就会选择dev_config.properties作为配置文件并将其文件名替换为config.properties打包到整个软件包中。
我们看下这种方案的优缺点:
优点,就是简单直接。在环境相对固定且配置项变化不大的情况下,是最为简便的一种环境配置管理方式。
缺点,也比较明显。首先是在实际的场景中,我们的环境可能会更多,且交付上线后可能还会有线上多环境。这时每多出一个环境,就要多一个配置文件,这时配置项的同步就会成为大问题,极有可能会出现配置项不同步,配置错误这些问题。特别是如果配置项也不断地增加和变化,管理上会变得非常繁琐。再就是,这里需要针对不同环境进行单独的构建过程,也就是要多次打包,这一点是跟持续发布的指导建议相悖的。
方案二占位符PlaceHolder模板模式。
这种方案在Maven这样的构建工具中就可以很好地支持直接示例如下
cache.app.url=${cache.app.url}
我们可以看到这种模式下配置项的值用变量来替代了具体的值我们可以设置到另外一个文件中比如antx.properits这个文件后面在autoconfig方案中我们还会介绍这里面保存的才是真正的实际值。
这时我们只需要保留一个config.properties文件即可没必要把值写死到每个不同环境的配置文件中而是在构建时直接进行值的替换而不是文件替换。这个事情Maven就可以帮我们做而不再需要自己写脚本或逻辑进行处理。
不过这个方案仍然不能很好地解决上面第一种方案提到的问题配置文件是可以保留一个了但是取值的antx.properties文件是不是要保留多个同时对于配置文件中配置项增加后antx.propertis文件中是否同步增加了配置或者配置项名称是否完全匹配这一点Maven是不会帮我们去检查的只能在软件运行时才能验证配置是否正确。
最后这个方案还是没有解决只打包一次的问题因为Maven一旦帮我们构建完成软件包之后它并没有提供直接针对软件包变更的方式。所以针对不同的环境我们仍然要打包多次。
方案三AutoConfig方案。
AutoConfig是阿里开源的Webx框架中的一个工具包在阿里的整个持续交付体系中被广泛应用它继承了Maven的配置管理方式同时还可以作为插件直接与Maven配合工作针对我们上面提到的部分问题它也针对性地进行了加强和改进比如
配置校验问题。AutoConfig仍然是以上述第二种方案的模板模式为基础最终通过antx.properties文件中的配置值来替换但是它会做严格校验同时也可以自定义校验规则来检查配置项是否与模板中的设定严格匹配如果不匹配就会在构建时报错这样就可以让我们提前发现问题而不是软件包交付到环境中运行时才发现。
只打包一次的问题。AutoConfig不需要重新构建就可以对软件包比如war包或jar包的配置文件进行变更所以它很好地解决了针对不同环境需要重复构建的问题。但是比较遗憾的是它的Maven插件模式并没有解决这个问题还需要与AutoConfig工具模式配合才可以。
讲到这里我们可以看到AutoConfig的方案已经相对完善了也可以满足我们的大部分需求但是它仍然没有解决多环境配置值管理的问题我们是通过多个antx.properties文件来管理还是有其它方式
这里我们就需要基于AutoConfig做一下二次开发了也就是我们要把这些配置项做到一个管理平台中针对不同环境进行不同值的管理然后根据AutoConfig的规则在变更后生成对应不同环境的配置文件然后再结合AutoConfig针对配置管理文件的能力这样就可以很方便地做多环境的软件包构建了。
这样的配置项管理平台AutoConfig自己也没有做所以需要我们自己开发。同时对于比较敏感的配置信息特别是涉及用户名、Token、核心DB地址等信息还是不要放到配置文件中最好是放到管理平台中进行受控管理。同时这里也要特别强调密码信息一定不允许放在配置文件中出现更不允许以明文的方式出现这一点是需要开发、运维和安全共同来保障的。
总结
今天我们针对多环境的配置管理进行了分享这里更多的还是思路和方案上的引导。如果你对Maven和AutoConfig不熟悉的话建议自行查询资料进行学习了解甚至是自己动手尝试一下。
另外,对于文章中的方案,我是尽量简化了场景来分享的,虽然思路上是相通的,但是实际情况下各种细节问题会更繁琐,要具体问题具体分析。
你在这个过程中遇到过什么问题?有什么好的解决方案?或者还有什么具体的疑问?欢迎你留言与我一起讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,125 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
15 开发和测试争抢环境?是时候进行多环境建设了
在上一期文章里,我们介绍了多环境下的应用配置管理问题,从这期开始,我们会分两期文章详细聊聊多环境建设的问题:就是我们到底需要哪些环境?这些环境都有什么作用?环境建设的思路和方式是怎样的?
今天我就结合自己的经验和理解与你聊一聊持续交付中的线下多环境建设。
环境分类
通常,我们主要按照环境所起到的作用,将环境分为两大类:
线下环境:测试验收用。
线上环境:为用户提供服务。
从建设角度来说,线下环境和线上环境,在网段上是要严格隔离的。这一点在做环境建设时就要确定网络规划,同时在网络设备或者虚拟网络的访问策略上要严格限定两个环境的互通,如果限制不严格,就极易引起线上故障,甚至是信息安全问题。
如果你维护过这样两套环境,我想你一定在这方面有过深刻的感受,甚至是痛苦的经历。
所以,从规划上,线上环境和线下环境是两套独立的区域,所有的应用、基础服务都是全套独立部署的。但是线下环境所需的资源往往是要少于线上环境,毕竟只有负责开发测试的少数人使用,不会有线上流量进来。如下图所示:
但是,在实际情况中,这两个环境远远满足不了我们日常开发、测试和运维方面的需求。从保障软件质量和系统稳定的角度出发,我们在实际操作中还需要在这两个大的环境区域中,建立细分的小环境,来满足不同阶段和不同角色的工作需求。
线下环境分类建设
线下环境最初建设的时候,主要是提供给测试使用,帮助其建立一个模拟环境,在软件发布上线前进行需求功能验证,保障业务流程顺畅,以确保应用在上线前达到最低质量要求。
所以,我们在线下环境区域内,建设的第一个环境就是集成测试环境。甚至在一开始,线下环境=集成测试环境,这个环境下的应用和各类基础服务必须跟线上保持一致,但是集群规模不用这么大(如我们上图所示)。
所以,集成测试环境极其重要,这个环境中的应用有严格的发布标准,并且要求环境稳定,不能随意发生变更,否则将会大大影响测试的效率。
不过,随着集成测试环境建设起来,业务需求迭代越来越快,应用和开发人员数量也越来越多,软件发布和变更也会更加频繁,这个时候就会出现开发和测试人员争抢集成测试环境的问题。
比较典型的场景就是,测试人员正在验证一个功能,突然发现应用停止运行了,原来开发为了验证和尽快发布新功能,更新了代码,这样就阻塞了测试的正常工作,但是不更新代码,开发的工作又会停滞下来。
后来这个矛盾越来越严重。这时,我们就需要考虑多建设一套给开发用的环境来解决这个问题。
于是,我们就开始建设线下的第二套环境:开发测试环境。这个环境主要是让开发同学能够尽快发布自己开发完的代码,并在一个具备完整业务应用和基础服务的环境下,验证自己的代码功能。
但是,是否需要跟集成测试环境一样,再建设一套独立完整的线下环境出来呢?答案是否定的。因为这时的应用变化范围相对独立,变化也较小,周边依赖需要同时变化的应用也不会太多,就像上面说的,只要能把它们放到一个完整的环境中进行验证即可。
所以,这个环境只要按照最小化原则建设即可,如果有依赖,可以直接访问到集成测试环境。在这里,我们以简单的模型展示开发测试环境跟集成测试环境的关系:
再往后,开发测试环境上,又会出现开发和测试的冲突和争抢,因为从场景上,业务开发团队可能要同时承担多个并行项目的研发,而且可能会有多个业务开发团队一起参与进来。
比如对于电商来说到了年底就集中会有“双11”、“双12”、“双旦节”以及“年货节”等等这样的大型营销项目因为时间非常紧凑所以就必须多项目并行。
这个时候,分解下来,对于我们的应用软件来说,有可能是存在多个开发分支的。到了项目联调和验证环节,就必然会存在同一个应用有多个版本需要同时发布和测试的情况,但是开发测试环境却只有一个,这就必然导致双方激烈的争抢。
所以这个时候,就必须建立解决冲突的方案,开始建设线下的第三套环境:项目环境。
项目环境可能有多套,一个项目对应一套环境,但是无论从资源成本还是维护成本方面考虑,项目环境仍然不会像集成测试环境那样形成一套完整的开发测试体系。
所以项目环境同开发测试环境一样,仍然是以最小化为原则来建设,也就是说,在这个环境里面,只部署同一项目中涉及变更的应用,而对于基础服务和不涉及项目需求变更的应用不做重复建设。如果对项目环境中不存在的应用有依赖,那么访问集成测试环境中对应的应用就可以了。
在这里,我们同样以简单的模型展示多个项目测试环境、开发测试环境与集成测试环境的关系:
不过,如果说随项目的增加就需要分别建设对应的项目环境,那么这对于开发、测试和运维来说都会有非常大的维护负担。所以通常情况下,我们会严格限制建设项目环境的起步线。
比如只有公司级大促、公司战略级的项目,或者超过一定人日的跨团队项目,才允许建立独立的项目环境。一般情况下,还是引导优先使用开发测试环境。
环境建设上的关键技术点
线下环境细分出集成测试环境、开发测试环境以及多个项目环境之后,带来的最大的成本其实不在资源上,而是在管理和维护上,而且单单就线下维护的工作量来说,甚至要超过线上维护的工作。
复杂度和涉及到的技术点有以下四个方面。
第一是网段规划。每个环境都要有独立的网段比如整个线下环境要独立占用一个B段项目环境和开发测试环境相对较小可以独立占用一个C段。虽然不需要做网络策略上的隔离但是为了便于管理如分配回收资源以及部署应用还是要在逻辑上区分出来。同时网段规划也是为下面的单元化调用做准备。
第二是服务化框架的单元化调用。这一点需要服务化框架支持比如上面我们提到的项目环境到了联调阶段就需要一组应用单独联调而不能跨项目环境调用。同时对于项目中依赖的未变化的应用就需要调用集成测试环境中稳定版本的应用。这个服务调用的基本规则就是基于上述网段的规划来建立的规则要放到服务化的注册中心也就是ConfigServer这个部件中保存同时需要服务化框架支持规则调用优先支持本单元调用本单元不存在可以调用集成测试环境单元。
第三是环境的域名访问策略。这么多的环境 内外部DNS域名是保持一套还是多套比如访问蘑菇街主页www.mogujie.com首页域名就一个但是怎么能确保访问到我们所期望的环境上呢。这里有几种方式
第一种DNS服务保持一套域名特别是外部域名多套每个环境分别配置一个不同的域名比如开发测试环境dev.mogujie.com。但是如果这样下层的二级域名和二级目录等等都要跟着变动而且对于项目环境来说数量不固定每次都换一个也不方便记忆和管理所以这个方案基本不可行。
第二种DNS服务保持一套域名保持一套但是做域名的hosts绑定也就是自己来设置要访问域名所对应的环境。这样一来如果相对固定的开发测试环境和集成测试环境所对应的hosts相对固定那么只需要绑定一次就可以通用。但是项目环境始终在不断的变化中绑定规则可能随时在变化所以这种方案的复杂度在于对hosts配置的管理上。
第三种DNS服务多套也就是不同的环境中配置独立的DNS服务这样可以减少繁琐的hosts绑定但是也会提高多套DNS服务管理上的复杂度而且对于项目环境有可能依赖集成测试环境中的服务这时仍然会涉及本地DNS服务的hosts绑定。
第四种对于公网域名可以直接通过无线路由劫持的方式访问可以在无线路由器上配置多个接入点这样一来连接不同的接入点就会自动对应到不同环境的域名IP地址上去。
通常,对于公网域名来说,如果具备稳定的环境,如集成测试环境,直接通过第四种劫持方式指定到对应环境中去,这样最方便,这种方案在后续线上多环境建设中还会使用。
对于内部域名,则有多种方案,没有优劣,主要看场景和管理成本。我们选择的是第二 种即绑定hosts的方式。每个环境会对应一套hosts配置当选择不同环境进行联调或访问时就将hosts配置下发到对应部署应用的主机上。
在这里,我们仍然以模型展示第二、四种方案和多种线下环境之间的运行逻辑:
但是,无论采取哪种方式,我们可以看到,这个管理过程仍然是比较复杂繁琐的,必须要非常仔细地规划和部署,同时还需要配套的自动化工具支持,否则靠人管理是不现实的,所以最后一点就是自动化的配套。
第四是自动化管理。按照我们之前分享的管理模式,这里虽然有这么多的线下环境,但我还是会把它们以应用为核心给管理起来,即应用的开发测试环境,应用的集成测试环境,应用的项目环境。这样一来,上面提到的不同环境的网段信息、配置信息、资源分配回收以及软件部署发布,都能够以应用为出发点去做,这一点我们在后面的文章会详细分享。
总结
最后,不知道你有没有感受到,单单一个线下环境就要如此复杂和繁琐,整个持续交付体系建设是多么的有挑战性,就可想而知了。
我们对线下环境稍微做个总结:
集成测试环境,主要供测试使用,这个环境会最大程度与线上版本保持同步。作为对应用的功能、需求、业务流程等在正式发布上线进行验证的主要环境,集成测试环境的稳定性和可测试需要加强保障,进行全套建设。同时,作为整个线下环境的中心节点,也要为开发测试环境和项目环境提供部分依赖服务。
开发测试环境,主要供开发人员使用,针对偏日常的需求开发、联调和功能验证,以最小化原则进行建设,但是一般情况下不对资源进行回收。
项目环境,供开发和测试共同使用,针对多团队多人员协作的项目型场景,可以同时存在多个项目环境,在这个环境中针对项目需求进行独立开发、联调和验证。测试也需要提前介入这个环境进行基本功能的验收,并遵循最小化的建设原则,但是要有生命周期,即项目启动时分配资源,项目结束回收资源,不能无限期占用。
最后,在实际操作中,仍然会很多细节问题,这些问题会跟业务场景有关,针对这些场景又有可能有不同的建设要求,比如消息的消费问题会涉及全业务流程验证等等。
所以,留几个问题给你思考:在线下环境的建设过程中,你通常会遇到哪些问题?会有哪些独立环境?或者你有什么更好的经验和建议分享?
欢迎你留言与我讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,139 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
16 线上环境建设,要扛得住真刀真枪的考验
前面几期我们分享了一些线下环境建设方面的内容,我们可以感受到,整个线下环境的建设是比较复杂的,那经过线下环境的验证,是不是就可以直接发布到线上生产环境了呢?答案同样是否定的,由线下正式交付到线上之前,我们仍然会做很多的验证和稳定性保障工作。
今天我们就一起来看一下线上环境是如何建设的。
下面我们就生产环境、Beta环境、预发环境、办公网生产环境这四种线上环境分别展开讨论。
生产环境
我们还是进入到现实场景中。最初我们的软件代码开发完成后,就可以发布到生产环境,也就是可以正式接入用户流量,承载真实的业务场景。
在最早期,我们业务复杂度不高,用户量不大,集群规模小,软件架构也相对简单。在这种情况下,其实这一个环境就足够了,真有问题,也可以快速回退掉。退一步讲,即使有问题也回退不了的话,影响范围也有限。
所以,这个时候,线上环境=生产环境。
我们知道,随着业务量增大和业务复杂度升高,我们的软件架构、部署模式、集群规模等等也相应变得复杂和庞大起来。同时,业务产品在用户和业界的影响力也在变得越来越大。
这个时候,任何一个小的变更或一个不起眼的小问题,都有可能导致非常严重的故障,从而造成公司资损甚至是恶劣的产品口碑影响。
比如,我们假想一下,如果国内某个大型电商平台不可用,或者某即时通讯软件不可用,会造成何等严重的后果,就不难想象了。
所以,这时就需要我们非常严肃而谨慎地应对生产环境的变更。
我想你可能跟我一样,会想到一个问题:就是我们不是已经在线下环境经过了很多轮不同形式的验证测试环节,为什么到了生产环境还会有验证不到的严重问题?
这里涉及一个用户和业务场景的概念,就是线下和线上的用户场景是完全不同的:线下是我们模拟出来的,线上却是真实的用户场景,这两者之间会存在巨大的差异,有差异,系统的表现状况就会不一样。
所以线下我们只能尽可能地确保业务功能和业务流程是正常的,但是没法百分之百模拟线上场景,特别是一些异常特殊场景方面。这一点后面的文章我们还会再分享,这篇文章我们只要知道存在差异即可。
这个时候,我们的第一个思路就是:即使有影响,也要把它控制在小范围内,或者是在萌芽状态时就发现。这样就可以提前处理,而不是全量发布到生产环境后才发现问题,影响全局。
所以线上的第二个环境Beta环境就产生了。这个环境也可以叫作灰度环境包括我们常提到的金丝雀发布也是基于这个环境的发布模式。
Beta环境
这个环境的建设我们简单理解就是从生产环境的集群中再建立一个独立集群。看过我们之前介绍CMDB应用和服务分组的文章的读者应该不难理解针对应用就是再建立一个分组独立出一个集群出来但是这个集群中服务器数量1-2台即可主要还是针对小规模真实业务流量。如何做到小规模呢这就要在负载均衡策略上做工作了主要两种方式
调用RPC在服务化框架的复杂均衡策略中将其权重或者流量配比降低
调用HTTP在四层VIP或者七层权重上将权重降低。
这个环境同样不会全量建设,通常只针对核心应用,比如交易链路上的各个应用。同时,除了承担的流量比重不同外,其他与生产环境的应用没有任何差别。
后面的部署发布环节我们会看到针对核心应用必须要经过Beta发布环节才允许正式发布到生产环境。
有了Beta环境之后上面说到的影响范围的问题从一定程度上就可控了。但是在Beta环境上我们仍然会有两个问题无法很好的解决
影响范围再可控,其实也已经影响到了部分真实用户,特别是当访问量特别大的时候,即使是千分之一、万分之一,也是不小的数量。
之前经历的线下环境毕竟是一个模拟环境一方面在数据规模、分布特点、多样性以及真实性方面跟生产环境的数据场景还是会有很大的区别所以有很多跟业务逻辑相关性不大但是跟数据相关性特别强的场景功能在线下环境就很难验证出来另一方面对于一些第三方的系统特别是商家、支付和物流这样的体系在线下环境极有可能是Mock出来的所以验证的时候并不能代表真实场景但是等到了线上再去发现问题就可能就会造成真实的业务影响。业务访问失败可以重试但是造成商家真实的销售数据错误或者用户真实的支付资金错误这样就会非常麻烦了。所以从线下直接进入Beta环境还是会给生产环境特别是数据层面造成影响。
当业务复杂度和系统规模发展到一定程度后上面两个问题就会非常突出所以单纯的Beta环境是无法满足要求的。
这时,线上第三套环境,预发环境,就产生了。
预发环境
预发环境在建设上,有以下几个规则要求:
状态基础服务共用如DB、KV、文件存储以及搜索类的数据服务。这里基本就是真实的生产环境的基础了我们上述的问题在这个基础上就可以很好地解决了。除有状态服务外其他都需要在预发环境上进行全套建设但是资源使用上一般是一个应用部署一个实例即可所以规模比生产环境要小很多。
网络隔离上预发环境做独立网段的划分不承担线上真实流量独占一个B段同时在网络上进行逻辑隔离。业务调用必须本环境内闭环预发不允许跨环境进行应用服务调用如预发应用调用生产环境应用反之亦然。
要保证一定的稳定性。预发环节就是基于线上真实环境进行功能和业务流程的最终验证,所以对于版本质量要求是要高于线下环境,所以不允许反复频繁地变更部署,出现异常或警告也必须要以较高优先级处理。
上述环境的搭建使用的技术方案跟我们上篇文章讲到的方案是通用的如服务单元化调用、绑定hosts以及网络策略隔离等等。预发环境与生产环境的关系如下图
预发环境正式使用后的另一用途,就是在生产环境出现问题,但是线下复现不了时,就可以在预发环境上复现,这样对于问题定位会带来很大帮助。如果是在生产环境上做调试和问题定位,有时候会影响到正常用户访问,但是预发环境的影响就可控一些。
不过,定位问题可以,但是绝对不可以通过预发环境去做下面两件事:
与数据订正和变更相关的事情。因为这是由业务流程触发,而不应该由调测触发。而且要时刻牢记,在这个环境做的任何事情都是会对生产环境产生直接影响的,所以这里必要要靠强调意识、事先培训等方式进行避免。
阻塞他人工作。在定位问题的过程中,如果发现有其他应用依赖,这时要停下来,优先保证环境稳定性,而不是阻塞依赖方发布前的准备工作。
形象一点描述,预发环境就像是球类运动员,他们平时可以在训练场进行训练,但是正式比赛前,一定是要到正式比赛场地提前适应场地或者热身。一方面是为了了解现场的实际情况,做针对性的准备和调整;另一方面也是为了调动赛前兴奋度和氛围。
预发环境搭投入使用之后,有很多问题在这个阶段被发现,而且是开发和测试同学目前强依赖的一个环境,所以确实进一步保障了业务的稳定性。
然而,在这个环境中仍然存在一个问题。下面我还是以电商为例。
电商每年大促一般都是提前几个月准备有可能开发团队在大促活动正式开始前3-4周左右业务功能都已经开发完成但是这个时候是不能上线的或者上线了也要有入口开关控制绝对不能让用户流量提前进来。
与此同时,运营侧的招商、报名以及商品上架这些工作也会提前完成,所以这时线上实际已经具备了真实的大促环境,只是因为时间点不到,暂时只能等着。
但是,如果有一个只让员工访问,让员工们体验和反馈问题的环境,那么,在这个阶段我们是可以提前暴露很多问题,并进行很多优化改进的。这样做就更进一步保障了大促的系统问题和用户体验。
不过上述Beta环境和生产环境是无法满足要求的。预发环境能满足一部分要求但是因为这个环境主要还是供开发和测试验证功能使用在访问的便捷性和功能体验方面不能完全保证达到真实用户访问的要求和体验。
为了满足上述需求,我们会再单独建设一个环境出来,于是,线上环境的第四套环境,办公网生产环境,就应运而生了。
办公网生产环境
办公网生产环境建设的技术方案与预发环境一致,但是在要求上又有所不同:
访问用户是办公网内的员工用户所以必须连接指定的办公网wifi接入点。于是员工会通过wifi被劫持到这个环境上这时用户就可以在这个环境中提前体验新版本软件的功能比如我们之前说的大促活动等。
稳定性要求上,办公网生产环境相当于生产环境,虽然不是外部用户访问,但是一个公司内的员工也算是真实用户了,他们发现的问题等同于线上问题,但是级别上会降低一级处理。
建设规模上,公司有上千、上万名员工,他们的频繁访问行为,也产生一定的业务量,所以综合上述稳定性要求,办公网生产环境在规模上会根据应用容量进行相应的资源分配,这里至少每个应用应该以两个实例做冗余。
所以这个环境,从建设规模和稳定性要求上,就相当于一个小号的生产环境,所以我们内部又把它简称为“小蘑菇”环境。
总结
我们简单构建一张模型图来对线上环境作个展示:
我在这两期文章中介绍了这么多环境,我们可以看到,环境建设是一项异常繁琐复杂的工作,这些工作不是一蹴而就,而是根据实际的场景和问题催生出来的,所以是个逐步渐进的过程。
而且,因为不同的业务类型和场景,以及业务发展的不同阶段,场景和问题可能都是不一样的,而且其建设需求也不一样,所以在实际操作中,一定要切合具体情况进行建设。
再就是环境管理是复杂的多一个环境就多一份管理成本。所以环境并不是越多越好反而是越精简越好。这个时候也需要各位读者能够有一定的ROI评估毕竟能带来最大价值的投入才是有意义的而不是盲目地建设和投入。
最后,给你留几个问题思考:
我们分别介绍了线下环境和线上环境的建设,这两个环境在持续交付体系中,分别对应哪些理念和指导思想?
我们建设了这么多的环境,都是为了解决不同场景下的问题,那么还有哪些问题是上述这些环境仍然解决不了的?
欢迎你留言与我讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友,我们下期见!

View File

@ -0,0 +1,106 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
17 人多力量大vs.两个披萨原则,聊聊持续交付中的流水线模式
在前面5期文章中我们分别详细介绍了持续交付体系基础层面的建设主要是多环境和配置管理这些是持续交付自动化体系的基础是跟我们实际的业务场景和特点强相关的所以希望你一定要重视基础的建设。
本期文章是我们持续交付系列的第6篇文章从本期开始我们进入到交付流水线体系相关的内容介绍中。
持续交付流水线简要说明
从一个应用的代码提交开始,到发布线上的主要环节,整个流程串起来就是一个简化的流水线模式。如下图所示:
我们前面介绍了持续交付的多环境以及配置管理,而流水线模式的整个过程正是在这个基础上执行,所以它的某些环节和要素与我们的多环境是有一些交叉的。比如,功能测试会在线下相关的几个环境上完成,比如我们前面介绍到的开发联调环境、项目环境和集成测试环境。
但是,它们要达成的测试目的是不同的:对于非功能验收,我们会在线上的预发环境完成,因为预发环境更接近真实场景,所以像容量、性能、安全这些跟线上稳定性相关的能力验收,越接近真实环境,效果越好。
后面几期文章,我会结合我们的实践,分环节来介绍。本期文章我们先看项目需求分解和开发模式选择。
项目需求分解
持续交付我认为更多的是针对应用层面,所以项目需求分解这一部分,这里我们就不展开讲了。这里我们的工作重点,就是将项目管理中的需求与持续发布中的应用这二者很好地关联起来。
比较通用的做法就是要求业务架构师在做需求分析和功能设计时要针对一个需求进行拆分最终拆分成一个个的功能点这些功能点最终落实到一个个对应的应用中对应的逻辑体现就是应用代码的一个feature分支。
如下图所示:
举个简单的例子比如我们要做大促的优惠活动同一店铺商品购满500元可以使用10元店铺内优惠券同时还可以使用10元全站优惠券。
这样一个需求最终拆解下来,可能需要店铺应用支持多优惠活动的叠加,同时下单应用和购物车应用在计算价格时也要设定相关的优惠逻辑,这一个需求可能就拆出三四个功能点。
这样做的好处就是,从一开始的需求管理维度,就确定了最终多个应用联调、测试以及最终发布的计划和协作方式,从而就会让我们明确同一个项目环境中到底需要部署哪些应用,这些应用的发布顺序怎样安排。
比如如果A应用依赖B应用那么B应用就必须优先发布。所以上述这个过程对于项目进度管理、团队协作以及最终的发布计划都是有帮助的。
讲到这里,你是不是又进一步感受到了运维的重要性呢?
当然,每个公司都有不同的项目管理方式,这里我们只要明确做好需求拆分与应用功能的对应即可。
提交阶段之开发模式选择
在代码提交阶段,我们遇到的第一个问题,就是分支管理问题。这反映出研发团队协作模式的问题。
我们所熟知的开发协作模式有以下三种:
主干开发模式。这也是极限编程里提倡的一种模式每一次代码提交都是合并到master主干分支确保master随时是可发布状态。但是它对代码开发质量以及持续集成自动化和完善程度要求非常高通常一般的团队很难做到。
gitflow开发模式。因为git的流行gitflow是专门基于git代码管理的工作流工具它的特点是在master分支之外会有一条常驻develop开发分支所有功能开发和缺陷修复都在这个分支上再建立分支。发布时合入一个从master分支中签出的release分支最终发布的是release分支代码然后release分支再合并回master和develop分支。如下图所示
分支开发模式。相对于gitflow模式分支开发模式会简单清晰很多。它的特点是功能开发或缺陷修复从master签出独立的一个feature或bug分支发布前从master分支签出一个release分支并将要发布的feature或bug分支合入。发布完成后release分支合入master分支。如下图所示
开发模式的选型原则
上面我分别介绍了三种开发模式的特点,那么,在实际操作中,我们选择哪一种比较好呢?
这里的选型原则就是:一看这几种模式的适用场景;二看我们实际的使用场景是怎么样的。
下面我们分别看看主干开发和gitflow开发这两种模式。
主干开发模式。它的特点是所有的代码变更直接提交到master分支这种情况比较适合规模较大的应用这类应用自身集中了所有的需求功能点且需求串行开发需要多人协作共同完成同一个需求发布时间点明确、统一。
这种模式最简单,且便于管理,不需要再建立各种分支。我们之所以在极限编程中提倡这种模式,也是因为这种模式最简单,最便捷,也最高效。因为我们的软件架构在早期还是单体结构且分层架构的,代码相对集中,所以,主干开发模式也是适用的。
但是,在现实场景下,需求总是层出不穷的,所以就需要需求并行开发。这就会产生这样一种情况:同一应用会有多个团队在同时提交不同需求的代码,且每个需求发布的时间点是不同的。
所以如果采用主干开发模式,就可能会将还没有经过测试验证的代码发布到线上。这时,我们就需要在代码里预设很多功能开关配置,这样一来,在应用正式上线前,代码可以发布,但是功能不开放,而这样也必然会增加代码的复杂度。
所以就有了gitflow开发模式。
gitflow开发模式能够适应并行开发解决上述我们所说的问题而且gitflow工具能够从技术层面帮我们解决各种分支合并问题。
通过上面gitflow的图示我们可以看出gitflow开发模式带来的分支的管理代价还是比较高的且随着分支增加开发人员之间的沟通协作成本也会随之提高。
同时gitflow开发模式还是在代码相对集中的应用场景中更加适用因此基于这个应用完成较多的并行需求就需要通过多个分支来管理。
在现实场景中,尽管我们日常需求非常多,但是这些需求拆解下来的功能都是集中在某个或某几个应用上的吗?
其实不然。我们从原来的单体或分层架构演进到微服务架构后,带来的一个好处就是每个应用的职责更加明确和独立,与此同时,针对应用的开发,团队也更加自制,规模更小,符合“两个披萨原则”。
所以,一个需求拆解出功能,对应到每个应用上,这样可以很好地控制并行的功能点数量,大大降低开发协作的沟通复杂度,即使有合并冲突问题,往往内部沟通一下就可以很快解决。
而实际上我们设想的这种复杂的gitflow场景在微服务架构下的组织架构中极少存在。
在此经过对主干开发模式和gitflow开发模式这二者的综合对比结合前面我对分支开发模式的介绍我们可以看出分支开发模式简单清晰在实际操作中更适合我们使用。
最后,留个问题给你:你对于开发协作模式是如何选择的?存在哪些问题?有什么更好的建议?
欢迎你留言与我讨论。
如果今天的内容对你有帮助,也欢迎你分享给身边的朋友,我们下期见!