如何系统性认知分布式软件中的数据同步

举报
冰释流水 发表于 2021/08/18 17:31:13 2021/08/18
【摘要】 前言:​ 程序与数据在计算机世界里面是相生相克,随着分布式系统流行,数据也不再保持单一区域,随着并行并发逐步流行,大量数据需要在系统中多点存在,数据同步显得越来越重要,如何做好数据同步,是每个分布式软件开发的同学所需要了解的,借此一起深入研究一下数据同步问题。 理论知识图谱 同步方向 确定性的同步方向确定性的同步方向一般指同步双方在数据同步过程中,所承担的角色是特定的。以C/S架构为例,...

前言:

​ 程序与数据在计算机世界里面是相生相克,随着分布式系统流行,数据也不再保持单一区域,随着并行并发逐步流行,大量数据需要在系统中多点存在,数据同步显得越来越重要,如何做好数据同步,是每个分布式软件开发的同学所需要了解的,借此一起深入研究一下数据同步问题。

理论知识图谱

同步方向

  1. 确定性的同步方向

    确定性的同步方向一般指同步双方在数据同步过程中,所承担的角色是特定的。以C/S架构为例,Server端一般担当数据源和同步发起者角色,而Client一般担当同步接收者的角色,所有Client接收来自Server的副本数据。

  2. 不确定性的同步方向

    不确定的同方方案一般指系统中没有明确和固定的角色之分,所有人既可以是同步发起者,也可以是同步接收者,一般P2P的系统中就是这样的,每一个对端都拥有完整的数据,互相同步备份。

同步方式

  1. 同步通信

    同步地方式进行同步时,可以保证数据同步的实时性,作为同步方来看,编程相对简单一些,可以直接对同步结果进行处理,因为同步过程中,会占用线程资源,所以一般需要额外的技术方式解决性能问题。

  2. 异步同步

    异步地方式进行同步时,相对来看,需要经过一次线程切换才可以触发同步,数据实时性上相对差一些,编程上需要考虑各种故障场景下的可靠性处理,如:重试、校验等等。但由于是异步处理,吞吐量相对较大。

同步要素

​ 同步的各个要素描述了同步的数据内容,包含变更源、变更对象标识、变化跟踪等具体要素。

  1. 变更源

    变更源是指数据变更的源头,此次的变更是由变更源发起的,具体的变更实施者。对象可能在生命周期中,有一个或者多个变更源。包含了两层含义:

    • 时间维度,同一个字段可能由一个或者多个变更源发起;
    • 空间维度,一个对象的多个字段可能由一个或者多个变更源发起。
  2. 变更对象标识

    该标识用以区分变更对象。假设系统由多个子系统组成,每个子系统拥有自治的数据同步关系,那么对象标识可以被设计为:

    • 全局唯一。不区分具体同步区域,每个对象标识,在全局是唯一的。一般采用uuid相关算法实现,算法相对复杂,适用范围广泛。
    • 局部唯一。根据不同数据同步区域,区域内实现每个对象标识唯一,算法相对简单 ,仅适用于区域内。
  3. 变化跟踪

    变化跟踪是指如何描述数据变化的方法。一般从三个维度分析考虑:变化颗粒大小、识别变化、冲突解决。

    • 变化颗粒大小

      变化颗粒度可大可小。颗粒越大,管理规模越小,实现更为简单,但是每个变更同步的颗粒也就越大,意味着同步量相对越大;颗粒越小,管理规模越大,实现上相对复杂,但每次同步颗粒相对较小,意味着同步量相对较小。一般变化颗粒度可细分:

      • 单个字段:颗粒度较小,单个字段变化,仅同步单个字段。
      • 整个对象:颗粒度较大,任意信息变化,整个对象全量同步。

      在设计过程中,可以结合实际应用场景,适时取舍。简单同步场景,按大颗粒粒度设计即可,复杂高性能要求 场景,可以按小颗粒粒度设计。

    • 识别变化

      在确定好变化颗粒大小之后,需要进一步描述该信息的变化,一般需要从两个维度去描述变化:

      • 变化标识。变化标识用以唯一标识该变化,标识的目的有两个:变化的时间有效性、变化的唯一性。一般可以通过时间戳、版本号去标识。
      • 变化过程。变化过程用以描述变化发生过程。从通用性角度来看,一般通过变化前后的标识去描述变化,而不会描述具体的变化内容。具体指变化前标识、变化后标识。
    • 冲突解决

      在数据变化同步过程中,不可避免会出现冲突,如何有效地系统性地解决冲突,是非常重要和必须的,设计过程中需要考虑两个维度:

      • 解决方式。当冲突产生时,可以由人工接入或者系统自动解决。从易用性上来看,优先由系统自动解决更为妥当。当然,当冲突数据涉及资金、认证等非常重要时,此时优先考虑人工解决可能更为安全可靠。
      • 解决算法。当本地处理数据同步记录时,此时本地版本比同步记录中版本更新,冲突发生。当由系统自动解决时,可以参考如下几类常见的算法:
        • 最新变更优先。两个数据版本,以最新变更优先,进行自动冲突合并。
        • 上一次更新优先。对比两个数据版本,前一次更新版本,以上一次谁新优先,进行自动冲突合并。

参考:https://www.objc.io/issues/10-syncing-data/data-synchronization/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。