零宕机布署!让你的数据库轻松实现向后兼容变更

  • 时间:
  • 浏览:0

第三步:从代码中移除last name

 



通过去掉 新的数据列和内容复制,亲们儿儿完会 通过向后兼容的法律法律法律依据对数据库做了变更。亲们儿儿回滚完后 JAR,一齐有完后 老版本的JAR在运行,它无需在运行时挂掉。

部署版本为4.0.0的任务管理器-代码没人 任何变化。部署版本为v4数据库,完成最后从last name 到surname的迁移,并删掉last name。并都都要添去掉 都要的约束。

译者:张万程



步骤:

为你的服务布署版本1

步骤:



目前的情况,应用是3.0.0版本,数据库是v3版本。应用3.0.0不再把数据存到last name列,这原因分析分析分析,最新的数据是存储在surname列。

为新版本任务管理器准备安装包

将数据从last_name复制到surname。注意,完会 你有絮状的数据,你最好考虑批量迁移的法律法律法律依据!

代码变更

读完以上信息,你完会 会问:蓝绿布署和零宕机有那先 关系?

本文将深入介绍怎样让你的数据库和代码从零停机布署中受益,完会 很好地运行。

都不 却说我复杂布署过程(一点类式删除回滚,一点数据库回滚几乎不完会 )。亲们儿儿选折 只做应用回滚。采用你你你是什么法律法律法律依据,即便你有不同的数据库(如SQL和NoSQL),但你的布署过程是一样的。

完会 亲们儿儿对数据库和应用做非向后兼容变更,亲们儿儿无法回滚到前完后 版本。

 

说明

将数据迁移到新版本。

使用向后兼容法律法律法律依据重命名数据列

1.0.0不使用数据列surname,2.0.0使用。亲们儿彼此没人 交互,无需抛出异常。

回滚完后 版本(全部完会无需 )通常是亲们儿儿都能做到的



数据库包括last_name列

步骤:



假设要修改列名,亲们儿儿来看一下下面的例子:

布署完后 新实例,任务管理器版本为2.0.0.BAD,将数据库升级到v2bad

至此,引出了亲们儿儿今天的主要话题:数据库。让亲们儿儿再回顾一下这句话:

没人 怎样做到?下面是众多法律法律法律依据中的并算是:

非向后兼容

亲们儿儿不都要做数据库回滚

数据库变更

无变化

完会 1.0.0版本的应用,让你是知道数据列surname的居于,它会抛出异常

通过遵守你你你是什么法律法律法律依据,让你做到回滚版本,而无需破坏数据库和任务管理器的兼容。



应用版本: 2.0.0

数据库版本: v2

将数据库迁移到新版本

部署版本为3.0.0任务管理器,数据只存储在surname列,读取时从surname列取值。对于数据库,最后从last name迁移到surname。对于last name列,not null限制要取消。数据库现在是v3版本。

说明

亲们儿儿关闭版本为2.0.0.BAD的应用

创建完后 新数据列,命名为surname,并把你的数据库迁移过来。现在你的数据库版本是v2

在本节内容中亲们儿儿将关注数据库变更的并算是法律法律法律依据。



跟v3相比,亲们儿儿移除了last name完会 去掉 了约束。

写代码,一齐使用新旧完后 数据列。现在你的应用版本是2.0.0

应用版本: 2.0.0.BAD

数据库版本: v2bad



这是亲们儿儿要使用的任务管理器初始情况

使用非向后兼容法律法律法律依据重命名数据列



目前情况是任务管理器版本为2.0.0,数据库版本为v2



异常日志如下:

步骤:

版本为1.0.0的实例在插入last_name的完后 会另一一俩个劲再次出现异常,完会 last_name列完会 不居于了



应用版本: 1.0.0

数据库版本: v1

数据库变更

版本2一齐使用last name和surname。

database仍然使用v2bad

 

2.0.0将数据保存到新旧完后 数据列,无需 无需 是向后兼容的

执行非向后兼容变更是亲们儿儿另一一俩个劲遇到的情况。亲们儿儿完会 证实,完会 不做些额外工作,无法通过简单的数据库迁移做到零宕机布署。本节内容将通过三次任务管理器布署和数据库迁移达到亲们儿儿期望的效果,完会 一齐做到向后兼容。

数据库变更



亲们儿儿完会 将数据列lastName重命名为surname。

A/B测试

目前的情况是亲们儿儿在生产环境布署了完后 1.0.0版本的应用,数据库版本为v1。亲们儿儿想再布署完后 实例,使用2.0.0版本的应用,将数据库升级到v2.

本文将深入探讨怎样处理数据库兼容性以及布署过程相关的一点问题图片。完会 你没人 做一点准备工作就去尝试本文介绍的布署法律法律法律依据,我将无法预知你的应用会居于那先 。接下来,亲们儿儿将透过任务管理器生命周期的每一步骤介绍零宕机方案。亲们儿儿的任务管理器最终要达到的效果是在完后 不支持向后兼容的数据库上实现向后兼容变更。

为你的服务布署版本2,让版本1和版本2并行

警告:记住,都不 却说我为新加列设置非空约束。完会 JAR回滚时旧版本让你是知道新加列,会自动设置空值。完会 有非空约束,旧版本应用会崩溃。

提示:作为提醒,假定亲们儿儿使用V1版本的数据库,它所含列first_name和last_name。亲们儿儿想把last_name变更为surname.完会 亲们儿儿还有完后 1.0.0版本的应用还没人 使用surname.

灾难性故障,无法回滚

说明

版本为2.0.0.BAD的实例都都要正常运行



通过去掉 完后 新列,并把内容复制过来,亲们儿儿为数据库配置了向后兼容模式。完会 亲们儿儿回滚到JAR, 一齐旧的JAR版本也在运行,系统无需奔溃。



在当前环境中亲们儿儿布署了完后 版本为1.0.0的任务管理器和完后 版本为v1的数据库。亲们儿儿要布署另外完后 实例使用版本为2.0.0的任务管理器,完会 将数据库升级到v2bad。

完会 亲们儿儿对数据库和任务管理器做非向后兼容布署,亲们儿儿无法使用A/B测试。

本文来自云栖社区协作伙伴"DBAplus",原文发布时间:2016-07-01



在你你你是什么例子里亲们儿儿都都要看到五个迁移脚本,完会 完后 没人 执行过,在应用启动时完会 顺序依次执行。让让让你打开完后 文件(V1__init.sql)看一下。

回滚应用到2.0.0版本

现在,让你问个人完后 问题图片,完会 数据库变更不向后兼容会居于那先 ?难道我的版本1完会崩溃不成?事实上,它随便说说会。

完会 surname列的值不为空,从它读取值,完会 surname不居于则从last_name读取。让你从代码中移除getLastName(),完会 完会 你把应用从3.0.0回滚到2.0.0,它完会 产生空值。

脚本



假设尝试A/B布署完后 ,亲们儿儿都要将应用回滚到1.0.0.完会 亲们儿儿不希望回滚数据库。

A/B测试

第一步:初始化环境

项目:

此时有一点请求会被分类分类整理到使用1.0.0版本的实例

关闭运行中的应用

部署版本为2.0.0的任务管理器,数据存储在last name和surname两列,读取的完后 只从last name取值。数据库是v2版本,所含last name和surname两列。surname列是last name的复制。(注意:你你你是什么列能才能 有非空约束)

回滚完后 新版本



通过一点向后兼容的法律法律法律依据,亲们儿儿成功布署了重命名完后 的非向后兼容变更。在此总结一下:

通过URL映射,把所有访问都切换到绿色系统。

使用模式版本控制工具来管理Spring Boot,有完后 好处。

应用回滚



形态学 上,数据库没人 变化。执行下面的代码,来实现数据迁移:



迁移脚本将数据列last_name重命名为surname

步骤:

数据库变更

完会 surname不为null,版本2.0就使用surname。完会 为null,就使用last name。



检查向后兼容的例子,请运行:

提示:为了提高可读性,亲们儿儿在文章中将只展示代码的新增内容。

亲们儿儿的项目是完后 简单的Spring Boot Flyway应用,在你你你是什么应用中,完后 Person在数据库里有first_name和last_name完后 字段。亲们儿儿想把last_name重命名为surname。

完会 没人 做好准备,都不 却说我用第一法律法律法律依据做零宕机布署,亲们儿儿会给出警告。第二种法律法律法律依据,亲们儿儿会提供一点零宕机向后兼容的布署建议。

说明

你听说过蓝绿布署吗?在云环境下很容易实现。在此前的一篇文章中,亲们儿儿完后 做过角度介绍。快速总结一下,做蓝绿布署要点如下: 



警告:下面的例子是故意完后 做的,它会崩溃。亲们儿儿用它来展示数据库兼容问题图片。

脚本执行的日志:

在这篇文章中亲们儿儿使用Flyway做为模式版本控制工具。亲们儿儿还写了完后 Spring Boot任务管理器,都都要为Flyway提供原生支持,完会 都都要为模式迁移的执行提供任务管理器上下文设置。使用Flyway时,让你把迁移脚本存储在项目文件夹(默认位置是classpath下的db/migration)。这里有完后 迁移文件的示例:



通过URL映射,只让浅绿色系统对外提供服务;

步骤:

提示:忠告,复杂的流程都都要为你节省无需 无需 钱(公司人无需 ,都都要节省的钱无需 )!

从代码变更中分离数据变更

重要:你都要移除getLastname()法律法律法律依据,完会 在3.0.0版本中的代码中让你是知道数据列last_name。这原因分析分析分析默认会把它的值设置为空。你也都都要保留该法律法律法律依据,但要去掉 判空检查,完会 最好的方案是getSurname()在逻辑上保障没人 空值。



通过例子都都要启动H2 console ,无需 无需 让你浏览数据库的情况(默认的jdbc url 是jdbc:h2:mem:testdb)

零宕机布署

你做到了!

回滚应用

重要:完会 让让让你基于新/旧列进行一点统计查询,请记住,你有完后 值(完会 完会 迁移)。类式,你想统计姓氏以A开头的用户数,除非你完会 做好了数据迁移(从旧列到新列),完会 你在新列上做统计会遇到数据不一致。

部署版本为1.0.0的任务管理器和版本为v1的数据库(列名是last name)

亲们儿算是需 无需 一齐之处,完会 要维护完后 相同的环境,都要付出双倍的支撑。无需 无需 像Martin Fowler完后 的团队倾向更多变通的法律法律法律依据:蓝绿布署的完后 变体是使用同完后 数据库,只在网站和域你你你是什么层做蓝绿切换。



假定

任务管理器版本:3.0.0

数据库版本: v3

模式版本

亲们儿儿只回滚到所都要的版本。完会 当前版本居于bug,完会 不容易修复,亲们儿儿希望都都要回到上完后 稳定版本。亲们儿儿假定上完后 稳定版本却说我上完后 版本。为多个布署维护代码和数据库兼容是困难且昂贵的。

第二步: 去掉 surname

将任务管理器回滚到版本1.0.0。



亲们儿儿将数据一齐保存到last_name和surname.亲们儿儿从last_name读取最新数据。在升级过程中一点请求完会 会被分类分类整理到还没人 更新的实例。

向后兼容



复制代码仓库后,让你看到如下文件形态学 :

数据变更

太简单了,对不对?完会 很不幸,事情并全部完会没人 简单,亲们儿儿接下来就探讨你你你是什么问题图片。让亲们儿儿来看一下另外并算是流行的布署法律法律法律依据:蓝绿布署。

下面所用到的代码示例,你都都都要在GitHub上找到。

第四步:从数据库移除last name



代码变更

回滚应用

布署新实例,应用使用2.0.0,数据库升级到v2



当前变更不允许亲们儿儿一齐运行完后 实例(新旧完后 版本)。无需 无需 零宕机布署是难以达到的(根据亲们儿儿的假定,这实际上是不完会 的)。

说明

随便说说零宕机/蓝绿布署很强大,完会 出于安全考虑,公司仍然顷向于以下法律法律法律依据:



本文所使用的代码,都都都要在Gitbub上下载到。更多的介绍,都都要在下面看到。

使用脚本去掉 surname列。



所有的例子都复制于Spring Boot Sample Flyway项目。

完会 版本运行很完美,把版本1停掉

升级成功,版本为1.0.0的实例和版本为2.0.0的实例一齐运行,都使用版本为v2的数据库

完会 你正在使用Spring Boot Flyway,通过这两步都都要启动2.0.0版本的应用。完会 你是手动运行数据库版本控制工具,你都要在完后 独立的任务管理器中操作(先手动升级数据库,再布署新应用)。



亲们儿儿用last name和surname两列来存储数据。一齐,从last name读取数据,完会 你你你是什么列数据是最新的。在部署阶段,一点需求完会 会被没人 更新的实例来执行。

运行数据库迁移脚本布署运行新版本任务管理器

传说中的零宕机布署是个那先 鬼?让你把它理解为完后 并算是任务管理器布署法律法律法律依据:让你成功把任务管理器的新版本更新到生产环境,完会 用户没人 宕机的感觉。从用户和公司的角度来看,这是最好的布署法律法律法律依据,完会 不仅发布了新的功能,完会 没人 带来bug。

代码完会 做了很好的自我解释:让你使用SQL定义你的数据库变更。如都要更多了解Spring Boot和Flyway,请参考Spring Boot文档。

代码变更:

数据库和应用都完会 成功升级,完后 实例使用版本1.0.0,完后 使用版本2.0.0.BAD.亲们儿都使用版本为v2bad的数据库

1.0.0不使用数据列surname,无需 无需 回滚成功。



完会 应用3.0.0不使用last name,在从数据库移除你你你是什么列后,完会 亲们儿儿回滚到版本3.0.0,无需居于崩溃情况。

代码

数据迁移和任务管理器布署同步,你的布署过程变得简单



检查非向后兼容的例子,请运行:

在深入细节完后 ,亲们儿儿都要为应用做一点假定。主却说我让过程变得简单。

数据库问题图片



任务管理器将Person数据存储到last_name列:

维护两套生产环境(蓝和绿)

采用你你你是什么技术会有数据库方面的挑战,不为什么会么会是当软件的新版本都要修改数据库模式的完后 。

完会 你的应用是无情况的,不都要使用数据库来存储任何数据,那你现在就都都要做到零宕机布署。但不幸的是,大每段软件都都要把数据存到某个地方。这却说我为那先 在做任何数据库模式变更时,你全部完会再三考虑。在亲们儿儿探讨数据库模式变更细节前,让亲们儿儿先关注模式版本。





让你运行脚完后 执行并算是场景:数据库向后兼容和非向后兼容。

代码变更

重要:记住,新创建的列能才能 使用NOT NULL,完会 你做回滚,老版本任务管理器让你是知道新的列,无需在插入数据时为它赋值。无需 无需 ,完会 你去掉 了你你你是什么约束,完会 你的数据库版本是V2,没人 新的数据列的值能才能 为空,完会 违法约束。

代码变更

任何测试和变更全部完会绿色系统中进行;

通过蓝绿布署,发布新功能变得很轻松,不再担心把bug引入到生产系统。完会 让你通过路由映射很方便地回滚到前完后 版本,就像“拨动开关”一样简单。



任务管理器版本:4.0.0

数据库版本:v4

在v2bad 中数据库中完会 没人 last_name数据列,它完会 重命名为surname



数据库所含完后 数据列last_name