//
使用MySQL、Hudson、Gradle、Maven和Git实现数据库DevOps
http://www.infoq.com/cn/articles/mysql-hudson-gradle-maven-git-devops
你可以开发自己的解决方案,或者使用像Flyway这样的框架。后续的章节里,我们会演示一个例子,在一个完整的构建中使用Flyway,整合了Maven、Gradle、Git和Hudson。
Flyway所执行的Oracle和MySQL脚本都能在SQL*Plus和其他Oracle兼容工具中执行(在替换了占位符之后)。Flyway有多种执行方式,包括Maven插件、Gradle或Ant,它还可以通过命令行来执行。接下来,让我们将注意力集中到Flyway的MySQL支持上。
DevOps概述
DevOps描述了一些让软件交付过程更顺畅的实践,强调让生产到开发的反馈更加顺畅,并缩短生产周期(就是从开始到交付的时间)。DevOps不仅让你能更快交付软件,还能帮助你开发成质量更高的软件,这更符合个性化需求和基本条件。
DevOps试图让开发和运维找到一致的目标、概念和工具,通过这些东西(怎么做)让两者的协作更为顺畅(为什么)。
DevOps能让组织的障碍最小化。“一个团队”的做法,让敏捷实践延伸到了运维中。开发和运维的专家现在都是“开发人员”了,也就意味着正他们紧密协作,在一同“开发”解决方案。
DevOps针对了多个不同的活动和方面。
多个活动和方面
DevOps包含了多个活动和方面,例如:
文化,这个概念强调人要胜过流程和工具。软件是由人开发,服务于人的。
自动化,这是DevOps能快速获得反馈的基础。
度量,DevOps找到了明确的度量方法,质量和共同的(起码是对等的)动机是关键。
分享,这创造了交换思想、知识和经验的平台。
为了定义并带成数据库DevOps的概念,最好能分清四个不同的领域。图2展示了DevOps的领域矩阵。领域1是将开发延伸到运维中,在数据库方面,常见的例子是将变化脚本放入版本控制系统,并且开发和运维都用相同的数据库迁移工具,比如Flyway,我们后续会讲到这个工具。
领域2是将运维延伸到开发中。对数据库DevOps而言,这意味着在生产系统里提供锁定行、阻塞查询和资源竞争等方面的可视化信息。
领域3是将开发嵌入到运维中。比如针对非功能性需求设置约束和共同目标。举些例子来说明共同目标,80%数据库搜索要在2秒钟内返回结果显示到屏幕上(共同的性能目标);系统中不能使用任何会妨碍从一个Linux发行版迁移到另一个发行版的技术(共同的可移植性目标);数据库要在保持性能目标的前提下,在特定硬件上保存两千万会员信息(共同的容量目标);必须要有针对所有组件的自动化测试,包括基础设施代码(共同的可维护性目标)。
领域4是将运维嵌入到开发中。这可以增强两者的协作,比如让开发能够在不牵扯数据库管理员的前提下访问数据,这就能避免DBA成为看门人。
自动发布数据库。自动发布数据库时有一个比较高难度的挑战,就是如何将数据库的当前版本(即当前的结构元素,比如表、字段及其数据),也可以说是当前状态,与组成本次完整发布的其他部分的当前版本关联起来。通过把数据库元素纳入版本控制,你可以创建标签(tags,通常也被称为标记[labels]),把所有配置项添加到一个规定的基线里。
要自动部署数据库变更,就需要有一套流程,它能支持增量应用数据库变更,同时还要保持当前的结构和内容。目前有不少方法都能更新现有数据库,他们都有如下共同的活动:
将所有代码和数据库元素(所有变更集)纳入版本控制。
创建用于将数据库推进至下一版本和回滚到上一版本的SQL脚本。这些脚本要放到一个变更集里。
调研一下是否需要回滚机制。可以通过提速开发流程来避免增加复杂性,打补丁(hot fix)也是个不错的策略。
针对每个变更集创建一个文件,在里面放置对应的变更内容。给文件一个唯一的名字,其中包含数字编号。变更集推动数据库向前或向后变化,而且变更集都是运用在一个基线上的。因此,一个变更集中的具体内容可能和上一个变更集里的内容是矛盾的,换言之,每个变更集都包含了多条SQL语句。为了管好一个特定的变更集,最好用一个文件而非多个文件,这能更好地实施基于任务的开发。
打造基线,其中会冻结应用程序的所有配置项,包含数据库元素。
为部署获取基线。在完整安装的情况下,要基于数据库元素的初始基线,运行所有增量变更集。在增量安装的情况下,检查特定数据库的当前状态(版本号),运行该版本之后的所有新变更集(之前没有运行过的)。
确保部署过程是从版本控制中获取基线的。把数据库变更集放到专门的工作目录里。
保存数据库版本。一种方法是使用那些持有元信息的数据表,特别是数据库表结构的版本。此外,还可以为要执行的SQL脚本或回滚脚本创建一些字段,这样Shell脚本就能使用数据库里保存的信息来执行变更或者回滚。
计划通过监控来最小化平均修复时间(MTTR,mean time to repair)、平均检测时间(MTTD,mean time to detect),还要计划执行冒烟测试。