如何系统性认知分布式软件中的数据同步
前言:
程序与数据在计算机世界里面是相生相克,随着分布式系统流行,数据也不再保持单一区域,随着并行并发逐步流行,大量数据需要在系统中多点存在,数据同步显得越来越重要,如何做好数据同步,是每个分布式软件开发的同学所需要了解的,借此一起深入研究一下数据同步问题。
理论知识图谱
同步方向
-
确定性的同步方向
确定性的同步方向一般指同步双方在数据同步过程中,所承担的角色是特定的。以C/S架构为例,Server端一般担当数据源和同步发起者角色,而Client一般担当同步接收者的角色,所有Client接收来自Server的副本数据。
-
不确定性的同步方向
不确定的同方方案一般指系统中没有明确和固定的角色之分,所有人既可以是同步发起者,也可以是同步接收者,一般P2P的系统中就是这样的,每一个对端都拥有完整的数据,互相同步备份。
同步方式
-
同步通信
同步地方式进行同步时,可以保证数据同步的实时性,作为同步方来看,编程相对简单一些,可以直接对同步结果进行处理,因为同步过程中,会占用线程资源,所以一般需要额外的技术方式解决性能问题。
-
异步同步
异步地方式进行同步时,相对来看,需要经过一次线程切换才可以触发同步,数据实时性上相对差一些,编程上需要考虑各种故障场景下的可靠性处理,如:重试、校验等等。但由于是异步处理,吞吐量相对较大。
同步要素
同步的各个要素描述了同步的数据内容,包含变更源、变更对象标识、变化跟踪等具体要素。
-
变更源
变更源是指数据变更的源头,此次的变更是由变更源发起的,具体的变更实施者。对象可能在生命周期中,有一个或者多个变更源。包含了两层含义:
- 时间维度,同一个字段可能由一个或者多个变更源发起;
- 空间维度,一个对象的多个字段可能由一个或者多个变更源发起。
-
变更对象标识
该标识用以区分变更对象。假设系统由多个子系统组成,每个子系统拥有自治的数据同步关系,那么对象标识可以被设计为:
- 全局唯一。不区分具体同步区域,每个对象标识,在全局是唯一的。一般采用uuid相关算法实现,算法相对复杂,适用范围广泛。
- 局部唯一。根据不同数据同步区域,区域内实现每个对象标识唯一,算法相对简单 ,仅适用于区域内。
-
变化跟踪
变化跟踪是指如何描述数据变化的方法。一般从三个维度分析考虑:变化颗粒大小、识别变化、冲突解决。
-
变化颗粒大小
变化颗粒度可大可小。颗粒越大,管理规模越小,实现更为简单,但是每个变更同步的颗粒也就越大,意味着同步量相对越大;颗粒越小,管理规模越大,实现上相对复杂,但每次同步颗粒相对较小,意味着同步量相对较小。一般变化颗粒度可细分:
- 单个字段:颗粒度较小,单个字段变化,仅同步单个字段。
- 整个对象:颗粒度较大,任意信息变化,整个对象全量同步。
在设计过程中,可以结合实际应用场景,适时取舍。简单同步场景,按大颗粒粒度设计即可,复杂高性能要求 场景,可以按小颗粒粒度设计。
-
识别变化
在确定好变化颗粒大小之后,需要进一步描述该信息的变化,一般需要从两个维度去描述变化:
- 变化标识。变化标识用以唯一标识该变化,标识的目的有两个:变化的时间有效性、变化的唯一性。一般可以通过时间戳、版本号去标识。
- 变化过程。变化过程用以描述变化发生过程。从通用性角度来看,一般通过变化前后的标识去描述变化,而不会描述具体的变化内容。具体指变化前标识、变化后标识。
-
冲突解决
在数据变化同步过程中,不可避免会出现冲突,如何有效地系统性地解决冲突,是非常重要和必须的,设计过程中需要考虑两个维度:
- 解决方式。当冲突产生时,可以由人工接入或者系统自动解决。从易用性上来看,优先由系统自动解决更为妥当。当然,当冲突数据涉及资金、认证等非常重要时,此时优先考虑人工解决可能更为安全可靠。
- 解决算法。当本地处理数据同步记录时,此时本地版本比同步记录中版本更新,冲突发生。当由系统自动解决时,可以参考如下几类常见的算法:
- 最新变更优先。两个数据版本,以最新变更优先,进行自动冲突合并。
- 上一次更新优先。对比两个数据版本,前一次更新版本,以上一次谁新优先,进行自动冲突合并。
-
参考:https://www.objc.io/issues/10-syncing-data/data-synchronization/
- 点赞
- 收藏
- 关注作者
评论(0)