在线系统数据服务的迁移策略

成都办公室的张耀丹是去年毕业的,只是他的职业生涯一开始就面对一个复杂的遗留系统。好在遗留系统的复杂并没有让他退却,而是从中学习到了解决遗留系统的思考之道。 他写了篇《在线系统数据&服务的迁移策略》。 如果不说,嘿,还真看不出这个内容出自一个毕业生的文笔。

当需要在正在运行的在线系统中进行数据或服务的迁移时,有很多问题需要考虑,如何设计迁移策略以保证数据正确迁移,如何处理系统间的依赖,如何保证服务持续可用等等。本文将从一个服务提供者的角度,讨论如何进行数据迁移才能保证对外提供的服务接口前后一致且持续可用,实现对于客户端的无缝迁移。

考虑一个简单的场景,有一个web应用,存有一定数量的用户信息,以前用户的密码都是用明文存在数据库里面的,作为一个有理想有道德的程序员,我现在想升级系统,对这些密码信息进行加密,我已经准备好了加密算法和相关的实现代码,现在问题来了,我要如何加密现有用户的密码呢?

Solution 1:写个程序在后台进行加密转换,然后重启系统,用新的代码访问加密后的数据。

存在的问题:如果在转换的过程中有新的数据进来或对原有数据有修改,如何处理?如何保证加密前后的数据同步?

Solution 2:停止服务 —> 执行加密转换 —> 重启服务,用新的代码访问加密后的数据。

存在的问题:也许在开发机器上测试100遍,这个过程每次都不超过1分钟,但是根据“Showcase必挂”原理,在产品环境上做同样的事情很可能就要1个小时,甚至更多。如果我的系统1分钟能挣1万块钱,你还告诉我要这么搞么?

那么该如何进行原有数据的加密呢?

图1:未加密时的调用

图2:加密后的调用

我们的目标是从图1转换成图2,数据的迁移肯定是不能一下子就完成的,那么我们就需要一步一步的去实现这样的DAO调用的转换。

Step 0:现有系统接口。

Service层:

  • UserService,用户处理接口,对外服务API
  • UserServiceImplUserService接口的实现,调用UserDAO

DAO层:

  • UserDAO,用户数据访问接口
  • UserDAOImplUserDAO接口针对未加密数据的实现

Step 1:数据库的设计。

假设以前我们的用户表有三个字段:idusernamepassword,那么我们实现的第一步是加一个字段encryptedPassword

这样乍看起来数据库是有冗余的,但是我们如果直接修改password列中的内容,实质上就是删除了一个原有的列,再新加了一列,我们知道,步子迈得大了,是容易扯着蛋的,具体原因Solution ½ 中已经讲了。

相应的,我们需要增加一个UserDAO接口针对加密数据的实现:UserDAOEncryptedImpl

UserDAOImplUserDAOEncryptedImpl的主要区别在于这几个方法:

其中,对于password来说,add()update()delete()方法是写数据,existed()方法是读数据。

Step 2:增加一个组合模式DAO实现。

实现代码如下:

UserServiceImpl中的userDAO改成CompositeUserDAOImpl的实例。

当前状态下,该CompositeUserDAOImpluser的读/写都操作未加密数据,使用UserDAOImpl来实现。

Step 3:

修改CompositeUserDAOImpl,使其读数据仍操作未加密数据,但写数据同时修改加密和未加密两个列。

Step 4:开始进行数据迁移。

可以写个脚本在后台执行,将password列中的数据加密后存入encryptedPassword列。

Step 5:

数据迁移完成后,修改CompositeUserDAOImpl,使其读数据从加密数据列中读取,写数据仍同时修改加密和未加密两个列。

Step 6:

上线运行一段时间后,当确保password列中的数据已经完全正确迁移并且没有其他的程序依赖与它,便可以将这一列移除了。CompositeUserDAOImpl中将只调用加密数据的DAO

原文发布于微信公众号 - 思特沃克(ThoughtWorks)

原文发表时间:2014-02-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

iOS ZipperDown 漏洞来袭,我们该如何应对?

昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公...

7520

保护微服务(第一部分)

面向服务的体系结构(SOA)引入了一种设计范式,该技术讨论了高度分离的服务部署,其中服务间通过标准化的消息格式在网络上通信,而不关心服务的实现技术...

15250
来自专栏自由而无用的灵魂的碎碎念

转:安装完QQ必须要删除掉的几个恐怖文件

很多关注自己电脑硬件温度的朋友,一般都懂得去查看什么进程占用CPU较高,可能发现过有这么几个进程的CPU占用会有时莫名其妙的非常之高,它们的名字叫 QQExte...

9450
来自专栏FreeBuf

你的终端是安全的吗?iTerm2 中可能通过 DNS 请求泄漏隐私信息

Mac 上的开发者可能非常熟悉 iTerm2 这款终端应用程序,甚至已经用它取代了 Apple 官方终端应用的地位。但就在今天之前,iTerm2中还存在一个严重...

29950
来自专栏FreeBuf

色情网站的光棍节“福利”:加密式挂马玩转流氓推广

双十一前夜,还想着通过同城交友或是某些不可描述的网站一解单身的烦恼?别急,不妨先来看看这些网站给光棍发的“福利”! 最近,360安全中心监测到一起网站弹窗广告挂...

27380
来自专栏我就是马云飞

APK瘦身全面总结——如何从32.6M到13.6M

前言 之前我简单介绍了关于svg图片瘦身的问题,在公司,瘦身这个问题是我提出来的,所以这锅我背了。公司项目是32.6M,我给自己的要求就是低于20M。上周花了一...

20260
来自专栏张戈的专栏

实测Nginx服务器开启pagespeed加速效果

上周有一个站长问到我一个问题,问 fastcgi_cache 和 pagespeed 加速有没有冲突。略微想了下,2 个都是比较原生的主,应该不存在兼容问题。 ...

63490
来自专栏菜鸟程序员

色情网站的光棍节“福利”:加密式挂马玩转流氓推广

35220
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–应收帐款(157)-11 F-32手动清算客户帐户中的未清项目

4.12 F-32手动清算客户帐户中的未清项目 清算未清的客户项目。例如,如果要清算的项目余额不为零,则可以创建多付/付款不足的剩余项目。 客户帐户中的未清项...

45580
来自专栏阮一峰的网络日志

双因素认证(2FA)教程

所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 ? 越来越多的地方...

501100

扫码关注云+社区

领取腾讯云代金券