服务重构,老版系统为php代码,新版系统改成Java。
数据层面沿用以前老版服务的数据库结构,部分库字段进行修改。php
最终目的:服务实现切换,数据实现切换(老库到新库),不能停机升级,尽可能减少对用户影响。数据库
实现方案:日志追加
下面具体说一下本身的实现方案,可能会有纰漏的地方,仅作参考。工具
步骤一
经过用户执行的新增、修改、删除操做,记录到日志文件中,old_db再也不写入新数据。
日志的格式统一为被修改的库、被修改的表、被修改的字段等信息。
保证日志的统一性,方便日志同步服务同步数据。
日志
步骤二
开发一个数据同步服务syn-data-service,将旧库的数据同步到新库中。
server
步骤三
当数据同步完毕后,将new-service设置为暂不可写数据(日志同步很快,会牺牲部分用户体验)。 且开发一个日志同步工具syn-log-service,将日志同步到新库中
blog
4,步骤四
开发一个compare-service,进行数据校验
开发
5,步骤五
数据没有问题后切换为new-db,用户执行的新增、修改、删除 双写到日志和new_db中。
同步
6,步骤六
兜底策略:若是发现数据有大规模不一致或者大规模数据丢失的状况,能够经过日志回写到old_db中,而后切换服务到old_server。用户体验
大体步骤如上所示,可能有考虑不周全的地方,这里只是短期的牺牲了用户的体验来完整数据同步的一致性。
步骤六是我多加的一个步骤,作任何事情都要想一个兜底策略,这也是我最近感触最深的一点体验。用于不要过度相信依赖的调用方,作好plan b。bfc