2. 概述

数据如果要保留副本,要么同时写(就是多写),或者进行复制:异步写(即从主数据拷贝到副本);

同时写(多写),引出一个问题,写多少节点算成功(场景:分布式系统)?全部写成功才算成功,还是写大多数成功算成功,还是写指定几个节点算成功?

异步写的话,如果采用异步复制,那么实时性需要考量的话,就需要采用性能优先的架构。

3.同步方式

数据同步一般分为两种方式:全量和增量。

3.1  全量

全量,这个很好理解。就是每天定时(避开业务高峰期)或者周期性全量把数据从一个地方拷贝到另外一个地方;

全量的话,可以采用直接全部覆盖(使用“新”数据覆盖“旧”数据);或者走更新逻辑(覆盖前判断下,如果新旧不一致,就更新);

这里面有一个隐藏的问题:如果采用异步写,主数据物理删除了,怎么直接通过全量数据同步?这就需要借助一些中间操作日志文件,或者其他手段,把这些“看不到”的数据记录起来。

3.2 增量

增量的基础是全量,就是你要使用某种方式先把全量数据拷贝过来,然后再采用增量方式同步更新。

增量的话,就是指抓取某个时刻(更新时间)或者检查点(checkpoint)以后的数据来同步,不是无规律的全量同步。这里引入一个关键性的前提:副本一端要记录或者知道(通过查询更新日志或者订阅更新)哪些更新了。

3.2.1 确定更新点

采用更新时间戳、有的采用checkpoint等来标识和记录更新点。

二、能用全量别用增量

两个系统之间需要同步数据,同步的方法可以分为全量和增量两种形式。多年的经验告诉我,能用全量就别用增量。增量有三个问题

  1. 数据提供方,很难制作增量包,事无巨细都要记录,稍微记错就全完了
  1. 数据接收方,理解并且实施增量包的逻辑比较复杂
  1. 中间过程一旦出了问题,很难定位

这里为了方便讨论,假设有两个系统,其中系统A拥有全深圳所有纳税人的当月工资,系统B需要从系统A同步这个数据。对于系统A来说,它的数据在不停的变化,但是可以分成三类

  1. 新增,比如说有毕业生来深圳打工
  1. 删除,比如说有人离职离开深圳了
  1. 变化,比如说有人涨工资了

这个时候,同步数据的方法很难决策,全量同步不合适,数据量太大而且还不值当,毕竟变化的部分比较少。增量同步又怕麻烦,一旦某次同步出问题,很难倒查故障和恢复。

其实,可以有一种折中方案,上不了台面,但是值得尝试。为了方便理解,还是以上面的例子来讨论。

我们知道所有人都有身份证号码,其中有一部分为年月日,表示生日。我们按照生日,在系统A将数据进行分组,这个分组是逻辑上的,不是真实的。如果有个人,工资涨了,生日为1999.9.1,那么系统A就记录分组1999.9.1的数据发生了变化。假设两个系统之间的同步周期是每天同步一次,那么系统A只需要整理这段时间那些分组发生了变化,但是不用记录变化的实际内容。系统B就老老实实将发生变化的分组数据删掉,然后全量同步这些分组的数据。

这个方案,就是赌每天发生变更的数据不会那么巧,波及所有分组,只会有很小的一部分分组发生变化。这样从整体看,只是同步了部分数据,从分组看又是简单的全量同步。这个方案的巧妙之处就是选择合适的分组标准,既要分的足够细,又要足够直接,方便程序处理。

方案一(总结出来业界可行方案): 1、Hive原始表提前规划好以时间分区,初始化装载源库记录为base_table(最新数据) 2、每个相关表都会有一个timestamp列,对每一行操作做了修改,都会重置这列timestamp为当前时间戳; 3、新增数据通过sqoop(支持当天抽取)或者导出当天文件两种形式,抽取或导入到hive表,记录为新增表incremental_tabl... 当一个数据需要存储多份时,会出现一致性问题,所以就需要进行同步,同步分为两种: 增量 全量 。 简单来说,就是在一定的周期中,把当前系统在周期时间内所有数据复制到目标表/系统这样的同步方式就叫做—> 全量 增量 同步的前提是 全量 ,然后再更具规则 增量 同步; 增量 的基础是 全量 ,就是你要使用某种方式先把 全量 数据拷贝过来,然后再采用 增量 方式同步更新。 增量 的话,就是指抓取某个时刻(更新时间)或者检查点(checkpoint)以后的数据来同步,不是无规律的 全量 同步。这里引入一个关键性的前提:副本一 相信很多公司都是基于Hive做的数仓,从而对外提供数据服务。这里只讨论离线数仓,做数仓必然离不开对大 数据的ETL处理工作。目前的ETL种类繁多,可选择的工具也有很多,比如使用Sqoop, DataX做离线的T+1数据同步, Spark或者Flink做T+0的实时数据同步等。 目前有很多公司业务是T+1的,每天需要同步昨天的业务库(MySQL、mongodb等)的数据到Hive数据仓库中,... root@vultr:/home/blog# mkdir -p /home/blog/mysql/backup 2.编辑/etc/my.cnf文件添加如下信息,log-bin 和 log-bin-index路径按照自己的路径填写 #backup properties log-bin = "/home/blog/mysql/logbin.log"... (2)每次上报的数据都是所有的数据(变化的 + 没有变化的) 一般导入数据时,不进行任何操作导入的数据就是 全量 表。 例如:平时使用sqoop直接导入,或者load加载,不需要任何特殊的操作,全表覆盖或者先删除表再插入数据,就是 全量 表。 以用户表为例,假设该表从2 全量 ,这个很好理解。就是每天定时(避开业务高峰期)或者周期性 全量 把数据从一个地方拷贝到另外一个地方; 全量 的话,可以采用直接全部覆盖(使用“新”数据覆盖“旧”数据);或者走更新逻辑(覆盖前判断下,如果新旧不一致,就更新); 这里面有一个隐藏的问题:如果采用异步写,主数据物理删除了,怎么直接通过 全量 数据同步?这... IDEA 导入项目时 “Import project from external model” 和 “Create project from existing sources”的选择 前端项目呢 查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况 weixin_44172018: 哈哈,确实骨骼精奇 Could not resolve view with name 'xxx' in servlet with name 'dispatcherServlet'", 远山初学编程: 感谢,@RestController写成了@Controller,找了半天没找到错误 spring boot es 支持中文精准查询的方法QueryBuilders.termQuery qq_36516284: XTopicIndexFields.FIELD_ALGORITHM_TAG这是个啥