基于文件的离线数据同步方案
产品此前的数据备份方案,存在不少问题,所以需要设计一个新的方案。本文总结一下新旧方案的优劣
首先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到中心文件,此外还需要保证文件合并的先后顺序等。这种场景比单客户端的场景要复杂很多,不在本文讨论范围,有空单独再写
基于文件的离线数据同步方案相关推荐
- 【Android】【功能设计】离线数据同步方案
这里考虑的是本地数据不会被其它用户修改的情况,类似于微信,离线任务都是自己要发出的消息,不会和网络数据产生冲突 对于多个离线用户,同时修改同一份数据的情况,不适合使用此方案,大多时候也不允许离线使用 ...
- 基于数据库数据增量同步_基于 Flink SQL CDC 的实时数据同步方案
简介:Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的 ...
- 基于Canal的MySQL=>ES数据同步方案
文章目录 1.MySQL和ES的主要区别? 1.1 功能性 1.2 性能指标 1.3 在搜索业务上的区别 1.3.1 查询 1.3.2 检索 2.为什么要做数据同步 2.1 检索性能 2.2 写入性能 ...
- cdc工具 postgresql_基于 Flink SQL CDC 的实时数据同步方案
作者:伍翀 (云邪) 整理:陈政羽(Flink 社区志愿者) Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink P ...
- 华为云严选上新啦!高效准确的数据同步方案来了
摘要:英方软件i2Stream产品服务已上架华为云严选商城啦! 近期,上海英方软件股份有限公司(简称"英方软件")宣布加入华为云沃土云创计划,同时基于i2Stream(数据流复制管 ...
- windows mobile数据同步方案
距离上篇博客似乎又过了一段日子了,这段日子应该算是挣扎着过来的,从寻找同步错误的过程到使用新的解决方案,总共花了近3个星期,我想自己有必要总结下这次的经历. 项目是使用C#+VS2008开发的,客户端 ...
- 基于Fabric+IPFS大规模数据上链方案
基于Fabric+IPFS大规模数据上链方案 更多区块链技术与应用分类: 区块链应用 区块链开发 以太坊 | Fabric | BCOS | 密码技术 | 共识算法 | 比特币 | 其他链 通证经济 ...
- DataX离线数据同步
目录 1 DataX 2 ODPS同步数据到HDFS HA 配置 Kerberos 配置 域外访问配置 3 HDFS同步数据到另一个HDFS 4 MongoDB同步数据到HDFS 5 带 Kerber ...
- PostgreSQL与es的数据同步方案调研
PostgreSQL与es的数据同步方案调研 1.logstash 基于时间戳,或者id增量同步,且不能实时同步暂不考虑 2.pg-es-fdw https://github.com/Mikulas/ ...
最新文章
- 给HttpClient添加请求头(HttpClientFactory)
- vue refs v-for 使用注意
- 谷歌54量子计算机,量子计算机要来了:谷歌开发了一种名为“ Sycamore”的新型54比特处理器,其200秒产生的输出将需要世界上最快的超级计算机10,000年 - googleblog...
- 2021年计算机应用基础统考题库,2021年计算机应用基础统考题库试卷全-20210515145621.doc-原创力文档...
- 再谈Weiphp公众平台开发——1、成语接龙插件
- 算法笔记_什么是数据结构_向量vector
- Apache VirtualHost的配置
- 利用GridView显示主细表并一次编辑明细表所有数据的例子(转)
- php视频转发,蓝叶分享好看视频地址解析php代码
- 企业微信登陆服务器设置,企业微信怎么登入
- 主成分之综合竞争力案例分析
- CSS( Cascading Style Sheets )简书
- Hie with the Pie(旅行商问题)
- 微信小程序获取右上角胶囊距顶部的距离和胶囊的尺寸
- js解决键盘长按输入时会有停顿的问题
- Android系统的VTS测试套件介绍
- 设置计算机电源方案20分钟后,屏保为什么我的电脑在20分左右不操作会自动 – 手机爱问...
- Unity插件FogofWar详细学习笔记
- Zabbix 5.2实战系列之Grafana变量使用
- 第三次自考第一阶段总结
热门文章
- php-cgi是什么,什么是CGI、FastCGI、PHP-CGI、PHP-FPM
- conda使用教程简写
- 全网最全的Mac代码风格总结
- 【转】如何成为一个牛逼的程序员
- 前端面试——打包工具
- 鸿蒙系统服务器在哪,鸿蒙系统我的服务怎么打开、关闭?鸿蒙系统我的服务添加设置教程...
- Incorrect string value: ‘\xE6\x9D\x8E\xE8\x80\x81...‘ for column ‘name‘ at row 1
- direct UI总结
- DevOps免费学,还有证书
- android获取颜色资源,Android中获取颜色的几种方法