产品此前的数据备份方案,存在不少问题,所以需要设计一个新的方案。本文总结一下新旧方案的优劣

首先APP是一个支持离线的应用。本地数据保存在sqlite,在离线环境下,在本地数据库里读写记录,在有网络的时候,再将数据备份到服务器;同时,也可以随时将数据从服务器恢复到本地

旧方案

此前的备份方案是基于内容的,每一条记录都有create_date和modify_date字段,同时APP保存有latest_backup_date(上次备份时间)。然后开始备份的时候,就对所有表进行扫描,根据这3个时间的对比,直接生成sql语句,发到服务器执行,写入服务端的mysql数据库;收到服务器的成功响应之后,又刷新latest_backup_date

而恢复逻辑,则是从服务器的mysql数据库里,遍历找到所有的记录,也生成sql语句,发回客户端,客户端再执行sql进行恢复。当发生冲突的时候,以客户端的数据为准,违反主键约束的时候,插入数据就会失败。比如客户端将一个卖品的价格改为200,而服务器mysql里的记录还是100,那么下发的insert语句就无法执行

这个方案有几个问题:

1、客户端的备份逻辑,散落在业务模块里,因为涉及到业务操作的地方,都需要记得修改modify_date和create_date,容易造成数据备份不上去的BUG

2、备份逻辑依赖客户端本地时间,而客户端时间总是不可靠的

3、服务端缺少客户端数据库的完整镜像,也就是说,一旦有BUG导致部分数据没有备份上来,那么如果用户卸载了APP或者PAD丢失,这部分数据就永远找不回来了

4、生成恢复文件之前,需要遍历mysql表,数据量大的时候,容易使客户端超时而恢复失败

5、恢复逻辑以客户端数据为准,在某些场景下不满足需求,比如做不到在服务端对客户端的数据进行干预校正

6、sql是纯文本,当数据量大的时候,在网络间传输的数据太多

新方案

新的方案准备这样做:备份和恢复不再基于内容,而是基于文件。每次备份都把本地的数据库文件上传到服务器。但是在传输上有特别处理,只传文件的差量;在服务器利用差量文件,合并得到完整的客户端数据库文件副本。同时在数据库增加一个差量表,配合trigger,将每次的insert,update,delete操作,写到差量表中。在服务器遍历差量表,将有变化的数据写到mysql里

恢复的时候,就直接把数据库文件发到客户端,替换掉客户端的数据库文件

在这个过程中,当然需要在服务端增加专门的表,来控制整个流程,比如记录文件在OSS里的路径,最后备份的时间等,本文不展开

这个方案相比老方案的优势:

1、客户端业务代码不再需要关注数据同步的逻辑,减少了出错的机会

2、不依赖客户端时间

3、服务端始终有客户端数据库的完整镜像,即使有BUG,也只是没有写到mysql里,对汇总统计有影响,但是不会造成客户端数据直接丢失

4、恢复文件不需要每次生成,速度快

5、可以在服务端直接修改数据库文件,校正客户端的错误;版本升级时如果需要做数据迁移,也可以在服务端统一处理

6、由于每次备份的差异量小,生成的差量文件也很小,需要在网络间传输的文件一般也比较小

新方案的局限性

总的来说,新方案的优势比较明显。但是,这个方案也只能解决单个客户端操作的场景,对于多终端同时操作就无能为力了。比如说,2个PAD同时修改一个会员的余额,那先备份的那条数据将会被覆盖,造成数据错误。所以,还需要保证同时只有一个终端操作数据,这样才能放心地替换文件。因为这种场景下,是不存在数据冲突的

如果要支持离线环境下,多终端同时操作的场景,则还需要在这个方案的基础上更进一步,识别出终端差异,将各终端的数据merge到中心文件,此外还需要保证文件合并的先后顺序等。这种场景比单客户端的场景要复杂很多,不在本文讨论范围,有空单独再写

基于文件的离线数据同步方案相关推荐

  1. 【Android】【功能设计】离线数据同步方案

    这里考虑的是本地数据不会被其它用户修改的情况,类似于微信,离线任务都是自己要发出的消息,不会和网络数据产生冲突 对于多个离线用户,同时修改同一份数据的情况,不适合使用此方案,大多时候也不允许离线使用 ...

  2. 基于数据库数据增量同步_基于 Flink SQL CDC 的实时数据同步方案

    简介:Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的 ...

  3. 基于Canal的MySQL=>ES数据同步方案

    文章目录 1.MySQL和ES的主要区别? 1.1 功能性 1.2 性能指标 1.3 在搜索业务上的区别 1.3.1 查询 1.3.2 检索 2.为什么要做数据同步 2.1 检索性能 2.2 写入性能 ...

  4. cdc工具 postgresql_基于 Flink SQL CDC 的实时数据同步方案

    作者:伍翀 (云邪) 整理:陈政羽(Flink 社区志愿者) Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink P ...

  5. 华为云严选上新啦!高效准确的数据同步方案来了

    摘要:英方软件i2Stream产品服务已上架华为云严选商城啦! 近期,上海英方软件股份有限公司(简称"英方软件")宣布加入华为云沃土云创计划,同时基于i2Stream(数据流复制管 ...

  6. windows mobile数据同步方案

    距离上篇博客似乎又过了一段日子了,这段日子应该算是挣扎着过来的,从寻找同步错误的过程到使用新的解决方案,总共花了近3个星期,我想自己有必要总结下这次的经历. 项目是使用C#+VS2008开发的,客户端 ...

  7. 基于Fabric+IPFS大规模数据上链方案

    基于Fabric+IPFS大规模数据上链方案 更多区块链技术与应用分类: 区块链应用 区块链开发 以太坊 | Fabric | BCOS | 密码技术 | 共识算法 | 比特币 | 其他链 通证经济 ...

  8. DataX离线数据同步

    目录 1 DataX 2 ODPS同步数据到HDFS HA 配置 Kerberos 配置 域外访问配置 3 HDFS同步数据到另一个HDFS 4 MongoDB同步数据到HDFS 5 带 Kerber ...

  9. PostgreSQL与es的数据同步方案调研

    PostgreSQL与es的数据同步方案调研 1.logstash 基于时间戳,或者id增量同步,且不能实时同步暂不考虑 2.pg-es-fdw https://github.com/Mikulas/ ...

最新文章

  1. 给HttpClient添加请求头(HttpClientFactory)
  2. vue refs v-for 使用注意
  3. 谷歌54量子计算机,量子计算机要来了:谷歌开发了一种名为“ Sycamore”的新型54比特处理器,其200秒产生的输出将需要世界上最快的超级计算机10,000年 - googleblog...
  4. 2021年计算机应用基础统考题库,2021年计算机应用基础统考题库试卷全-20210515145621.doc-原创力文档...
  5. 再谈Weiphp公众平台开发——1、成语接龙插件
  6. 算法笔记_什么是数据结构_向量vector
  7. Apache VirtualHost的配置
  8. 利用GridView显示主细表并一次编辑明细表所有数据的例子(转)
  9. php视频转发,蓝叶分享好看视频地址解析php代码
  10. 企业微信登陆服务器设置,企业微信怎么登入
  11. 主成分之综合竞争力案例分析
  12. CSS( Cascading Style Sheets )简书
  13. Hie with the Pie(旅行商问题)
  14. 微信小程序获取右上角胶囊距顶部的距离和胶囊的尺寸
  15. js解决键盘长按输入时会有停顿的问题
  16. Android系统的VTS测试套件介绍
  17. 设置计算机电源方案20分钟后,屏保为什么我的电脑在20分左右不操作会自动 – 手机爱问...
  18. Unity插件FogofWar详细学习笔记
  19. Zabbix 5.2实战系列之Grafana变量使用
  20. 第三次自考第一阶段总结

热门文章

  1. php-cgi是什么,什么是CGI、FastCGI、PHP-CGI、PHP-FPM
  2. conda使用教程简写
  3. 全网最全的Mac代码风格总结
  4. 【转】如何成为一个牛逼的程序员
  5. 前端面试——打包工具
  6. 鸿蒙系统服务器在哪,鸿蒙系统我的服务怎么打开、关闭?鸿蒙系统我的服务添加设置教程...
  7. Incorrect string value: ‘\xE6\x9D\x8E\xE8\x80\x81...‘ for column ‘name‘ at row 1
  8. direct UI总结
  9. DevOps免费学,还有证书
  10. android获取颜色资源,Android中获取颜色的几种方法