《DevOps软件架构师行动指南》读书心得

中心思想
本书讨论了DevOps的定义、范围、实践以及相关案例。作者从目标的角度,给DevOps下了如下定义:DevOps是一套实践方法,在保证高质量的前提下缩短系统变更从提交到部署至生产环境的时间。其核心是缩短部署时间,根据这一目标,就必须减少部署过程的运维和开发的协同时间、必须减少构建、测试和发布的时间。根据这一目标,通过DevOps的实践,通过重新定义运维和开发的职责来减少协同,通过自动化的工具,来提高构建、测试以及发布的效率,同时,通过自动化的工具也把运维和开发的显示协同变成了隐式协同。
在职责分工方面,DevOps包括:

  • 1、让开发人员和运维人员互相沟通;
  • 2、运维人员提前介入,在需求阶段提出系统的运维性需求;(例如日志及监控相关的需求、维护发布向后兼容及软件可切换的特性)
  • 3、允许开发团队自动化地部署到生产环境;
  • 4、当生产环境中发现错误时,让开发团队成为第一个响应者。(新部署的内容在开始一段时间内由开发人员负主要责任,之后由运维人员负主要责任。

另外,本书也提出在组织内推动方案落地的工作方式,具体见下图:

文章摘要

  • 脚本和文件也应该进行版本控制,也应该进行错误检查。这个术语常常称为:“基础架构即代码(infrastructure-as-code)”。
  • 5个为什么(5 Whys)是一个确定根本原因的技巧。不停的问为什么,直到发现原因。
  • 确定一个组织的文化的方法之一是看它的激励产生什么样的结果。
    一般来说,开发人员收到的激励是做出变更(发布新代码),运维人员收到的激励是不要变更。这两种不同的激励机制培育出不同的态度,可能成为文化冲突的原因。
    组织中的两个部门有一个共同的目标----确保组织取得成功。

  • 一般来说,一个人对自己的团队最忠诚,其次才是整个组织。
  • 使用工具意味着需要遵守隐含在工具中的策略。
  • DNS服务器可能会轮换服务器的顺序以便提供某种程度的负载均衡。
  • NoSQL 起初,这个名字的意思是No SQL,由于现在有些系统支持SQL,所以现在它代表Not Only SQL。
  • 模块是一个具有一致功能的代码单元,而组件是一个可执行单位。
  • 开发团队应该实践一些防御性编程。
  • 测试框架的一个关键特征是,它产生报表。
  • 环境拆解:在资源的目的已经实现后,很容易失去对资源的跟踪。处于安全的目的,每个虚拟机都必须打补丁,不使用、失去跟踪的资源为恶意用户提供了一个攻击点。
  • 功能开关:常见的实践是把功能的开关放到配置文件中。
  • 配置参数是一个能够更改系统行为的外部设置变量。配置设置可以是:希望展示给用户的语言、数据文件的位置、线程池的大小、屏幕上背景颜色或功能开关设置。
    可以按照使用时间把配置参数分组。
  • 构建是从源代码和配置等输入创建一个可执行工件(例如二进制可执行文件)的过程,包括编译和打包等过程。构建的目的是创建适合于部署的东西。
  • 集成测试是测试已构建的可执行工件的步骤。环境包括与外部服务的联系,例如代理数据库。
  • 一个开发人员把测试代码连接到了生产数据库,这样的例子我们听到多次了。
  • 服务的注册可以包含版本号,然后客户端就能够请求具体版本的服务。
  • 虚拟机是运行在虚拟机监视器上的一个镜像,虚拟机镜像可以包含多个独立的进程----每一个进程就是一个服务。
  • 计算的目的是洞察世界,而不是计数。
  • 性能度量包括:延迟、吞吐量、使用率。
    吞吐量一般用每秒事务数(TPS);
    使用率是资源使用的相对量,通常是通过在感兴趣的资源中插入探针来度量。
  • 如果系统主动提供了被监控的数据(例如简单网络管理协议SNMP,因为网络设备经常作为一个封闭的系统出现),那么监控是入侵式的且影响系统设计。如果系统不主动提供被监控的数据,那么监控是非入侵式的,且不影响系统设计。
  • 监控是基于时间或基于事件的。
  • 微服务架构,会让你的系统变成扇形系统或深层次系统。
  • 对虚拟机强制一个较短的生命周期是一个用来防止虚拟机泛滥的技术。
  • 如果你不能将你所做的事情描述为一个过程,那么你不知道你在做什么。
    过程模型是一组活动的规格说明,当这些活动执行时,导致完成所需的结果。
  • 审计记录必须加密,并且要独立于被审计系统进行存储,同时保护对这些记录的访问。
    不要把审计追踪和日志混为一谈。审计追踪持续存在数月或者数年,且有法律地位,主要用于安全目的。日志持续存在时间是以日(甚至更短)来计算的,它主要用于支持运维和开发的需求。

  • 云平台的一个核心特征是编程接口和自动化框架的广泛可用性。
  • 协同工具:JIRA,问题追踪和软件开发
  • 最小化权限原则。
  • Notation:符号
    JSON:JavaScript Object Notation。 小的JavaScript对象表示法。
  • 定时任务 cronjob
    守护程序:daemon
    平面文件:flat file
    领域特定语言:Domain Specific Language,DSL
  • ITIL是对运维组的最重要功能进行组织的体系。
  • 发布计划的规定之一就是测试回滚计划。回滚意味着恢复到之前的发布。也可能前滚,也就是说,修正错误并生成包含错误修正的新版本。由于回滚的敏感性以及前滚的可能性,所以自动触发回滚很少。
  • 管理依赖关系!
  • 数据模式!
  • 团队之间的协作是最消耗时间的。如果开发团队接受DevOps的职责,即开发团队交付、支持并维护服务,那么因为所有所需的知识都保留在开发团队,所以向运维团队和支持人员转交知识也就少了。不需要转移知识也就省掉了部署过程中的大量协作步骤。
    (其实类似敏捷的全功能团队也是为了减少协同的成本)
    DevOps的目标的一部分是通过使用隐形和不经常的协作代替直接的协作来实现。