SOFARegistry 源码|数据同步模块解析

JAVA 数据同步软件Sync源代码 该软件功能类似于360云盘同步版,但无需网络的支持,具体见文件内说明。可以供初学JAVA的同学参考。^_^ 立即下载

6e62089659eadd3f5b4834e9a678a40d.gif

文|宋国磊(GitHub ID:glmapper )

SOFAStack Committer

华米科技高级研发工程师

负责华米账号系统、框架治理方向的开发

本文 3024 字 阅读 10 分钟

|前言|

本文主要围绕 SOFARegistry 的数据同步模块进行了源码的解析。其中,对于注册中心的概念以及 SOFARegistry 的基础架构将不再做详细的阐述,有兴趣的小伙伴在《海量数据下的注册中心 - SOFARegistry 架构介绍》[1]一文中获取相关介绍。

本文主要的思路大致分为以下 2 个部分:


- 第一部分,借助 SOFARegistry 中的角色分类来说明哪些角色之间会进行数据同步;

- 第二部分,对数据同步的具体实现进行解析。

PART. 1

SOFARegistry 的角色分类

f9fd57dddefd165724b4b20e619364a7.png

如上图所示,SOFARegistry 包含以下 4 个角色:

Client

提供应用接入服务注册中心的基本 API 能力,应用系统通过依赖客户端 JAR 包,通过编程方式调用服务注册中心的服务订阅和服务发布能力。

SessionServer

会话服务器,负责接受 Client 的服务发布和服务订阅请求,并作为一个中间层将写操作转发 DataServer 层。SessionServer 这一层可随业务机器数的规模的增长而扩容。

DataServer

数据服务器,负责存储具体的服务数据,数据按 dataInfoId 进行一致性 Hash 分片存储,支持多副本备份,保证数据高可用。这一层可随服务数据量的规模的增长而扩容。

MetaServer

元数据服务器,负责维护集群 SessionServer 和 DataServer 的一致列表,作为 SOFARegistry 集群内部的地址发现服务,在 SessionServer 或 DataServer 节点变更时可以通知到整个集群。

在这 4 个角色中,MetaServer 作为元数据服务器本身不处理实际的业务数据,仅负责维护集群 SessionServer 和 DataServer 的一致列表,不涉及数据同步问题。

Client 与 SessionServer 之间的核心动作是订阅和发布,从广义上来说,属于用户侧客户端与 SOFARegistry 集群的数据同步,详情可以见:

https://github.com/sofastack/sofa-registry/issues/195,因此不在本文讨论范畴之内。

SessionServer 作为会话服务,它主要解决海量客户端连接问题,其次是缓存客户端发布的所有 pub 数据。Session 本身不持久化服务数据,而是将数据转写到 DataServer。DataServer 存储服务数据是按照 dataInfoId 进行一致性 Hash 分片存储的,支持多副本备份,保证数据高可用。

从 SessionServer 和 DataServer 的功能分析中可以得出:

SessionServer 缓存的服务数据需要与 DataServer 存储的服务数据保持一致。

c1e8ac2bbe62e9e012f19697675b0374.png

DataServer 支持多副本来保证高可用,因此 DataServer 多副本之间需要保持服务数据一致。

a592a95e48cbedc112b8fc0d6ea02fe8.png

SOFARegistry 中,针对上述两个对于数据的一致性保证就是通过数据同步机制来实现的。

PART. 2

数据同步的具体实现

了解了 SOFARegistry 的角色分类之后,我们开始深入数据同步具体的实现细节。我将主要围绕 SessionServer 和 DataServer 之间的数据同步,以及 DataServer 多副本之间的数据同步两块内容来展开。

「SessionServer 和 DataServer 

之间的数据同步」

SessionServer 和 DataServer 之间的数据同步,是基于如下推拉结合的机制:

推:DataServer 在数据有变化时,会主动通知 SessionServer,SessionServer 检查确认需要更新(对比 version) 后主动向 DataServer 获取数据。

拉:除了上述的 DataServer 主动推以外,SessionServer 每隔一定的时间间隔,会主动向 DataServer 查询所有 dataInfoId 的 version 信息,然后再与 SessionServer 内存的 version 作比较。若发现 version 有变化,则主动向 DataServer 获取数据。这个“拉”的逻辑,主要是对“推”的一个补充,若在“推”的过程中出现错漏的情况可以在这个时候及时弥补。

推和拉两种模式检查的 version 会有一些差异,这部分内容详见下面“推模式下的数据同步”和“拉模式下的数据同步”中的具体介绍。

「推模式下的数据同步流程」

推模式是通过 SyncingWatchDog 这个守护线程不断 loop 执行来实现数据变更检查和通知发起的:

c7a459b4bf3fefb8676bab6cf7135768.png

根据 slot 分组汇总数据版本。data 与每个 session 的连接都对应一个 SyncSessionTask,SyncSessionTask 负责执行同步数据的任务,核心同步逻辑在:

com.alipay.sofa.registry.server.data.slot.SlotDiffSyncer#sync 方法中完成,大致流程如下时序图所示:

8926d16af1ebaace8d0e1035db624830.png

上图圈红部分的逻辑第四步,根据 dataInfoId diff 更新 data 内存数据,可以看到这里仅处理了被移除的 dataInfoId,对于新增和更新的没有做任务处理,而是通过后面的第 5-7 步来完成。这么做的主要原因在于避免产生空推送而导致一些危险情况发生。

第 5 步中,比较的是所有变更 dataInfoId 的 pub version,具体比较逻辑可以参考后面 diffPublisher 小节中的介绍。

「数据变更的事件通知处理」

数据变更事件会被收集在 DataChangeEventCenter 的 dataCenter2Changes 缓存中,然后由一个守护线程 ChangeMerger 负责从 dataCenter2Changes 缓存中不断的读取,这些被捞到的事件源会被组装成 ChangeNotifier 任务,提交给一个单独的线程池(notifyExecutor)处理,整个过程全部是异步的。

7e8a588284ade29cc1a59799953344b6.png

「拉模式下的数据同步流程」

拉模式下,由 SessionServer 负责发起,

com.alipay.sofa.registry.server.session.registry.SessionRegistry.VersionWatchDog

默认情况下每 5 秒扫描一次版本数据,如果版本有发生变更,则主动进行一次拉取,流程大致如下:

bb60fa8e6826fe4bec3896f3ccbacbfb.png

需要注意的是,拉模式对推送流程的补充,这里的 version 是每个 sub 的 lastPushedVersion, 而推模式的 version 是 pub 的数据的 version。关于 lastPushedVersion 的获取可以参考:

com.alipay.sofa.registry.server.session.store.SessionInterests#selectSubscribers

e7c3e814ab92bc5bf7e1e4c726868042.png

「DataServer 多副本之间的数据同步」

主要是 slot 对应的 data 的 follower 定期和 leader 进行数据同步,其同步逻辑与 SessionServer 和 DataServer 之间的数据同步逻辑差异不大;发起方式也是一样的;data 判断如果当前节点不是 leader,就会进行与 leader 之间的数据同步。

52cc5b983fc0955116d14f3b8547f2a3.png

「增量同步 diff 计算逻辑分析」

不管是 SessionServer 和 DataServer 之间的同步,还是 DataServer 多副本之间的同步,都是基于增量 diff 同步的,不会一次性同步全量数据。

本节对增量同步 diff 计算逻辑进行简单分析,核心代码在:

com.alipay.sofa.registry.common.model.slot.DataSlotDiffUtils(建议阅读这部分代码时直接结合代码中的测试用例来看)。

主要包括计算 digest 和 publishers 两个。

diffDigest

用 DataSlotDiffUtils#diffDigest 方法接收两个参数:

- targetDigestMap 可以理解为目标数据

- sourceDigestMap 可以理解为基线数据

核心计算逻辑如下代码分析:

2c6a469a2150ee5aa64b9fbe25d4df70.png

那么根据上述 diff 计算逻辑,这里有如下几种场景(假设基线数据集数据中 dataInfoId 为 a 和 b):

1. 目标数据集为空:返回 dataInfoId 为 a 和 b 两项作为新增项;

2. 目标数据集与基线数据集相等,新增项、待更新项与待移除项均为空;

3. 目标数据集中包括 a、b、c 三个 dataInfoId,则返回 c 作为待移除项;

4. 目标数据集中包括 a 和 c 两个 dataInfoId,则返回 c 作为待移除项,b 作为新增项

diffPublisher

diffPublisher 与 diffDigest 计算稍有不同,diffPublisher 接收三个参数,除了目标数据集和基线数据集之外,还有一个 publisherMaxNum(默认 400),用于限制每次处理的数据个数;这里同样给出核心代码解释:

e70219d95b1d00892910e349d7e9f605.png

2ccd4582e922ba5bf8705e3c00e21f58.png

这里同样对几种场景做一下分析(下面指的是更新 dataInfoId 对应的 publisher,registerId 与 publisher 一一对应):

1. 目标数据集与基线数据集相同,且数据没有超过 publisherMaxNum,返回的待更新和待移除均为空,且没有剩余未处理数据;

2. 需要移除的情况:
基线中不包括目标数据集 dataInfoId 的 registerId (移除的是 registerId,不是 dataInfoId)

3. 需要更新的情况:
- 目标数据集中存在基线数据集不存在的 registerId
- 目标数据集和基线数据集存在的 registerId 的版本不同

PART. 3

总结

本文主要介绍了 SOFARegistry 中的数据同步模块。在整个过程中,我们首先从 SOFARegistry 角色分类阐述不同角色之间存在的数据同步问题,并针对其中 SessionServer 与 DataServer 之间的数据同步 和 DataServer 多副本之间的数据同步进行了展开。

在 SessionServer 与 DataServer 数据同步分析中,着重分析了推和拉两种场景下数据同步的整体流程。最后对 SOFARegistry 中数据增加的 diff 计算逻辑进行了介绍,并结合相关核心代码描述了具体的场景。

整体来看,SOFARegistry 在数据同步上的处理上有如下三点可以对我们有所启发:

1. 在一致性方面,SOFARegistry 基于 ap,满足了最终一致性,并在实际的同步逻辑处理上,结合事件机制,基本都是异步化完成的,这样一来就有效弱化了数据同步对于核心流程的影响;

2. 在拉模式和数据变更通知两个部分,内部采用了类似“生产-消费模型”,一方面是对于生产和消费逻辑的解耦,从代码上更独立;另一方面通过缓存或者队列来消除生产和消费速度不同而导致的相互阻塞的问题;

3. 拉模式对推模式的补充;我们知道推模式是 server -> client,发生在数据变更时,如果出现一些异常,导致某条 server -> client 链路推送失败,则会导致不同 client 持有的数据不一致的情况;拉模式的补充,让 client 能主动去完成对于数据一致性的检查。

【参考链接】

[1]《海量数据下的注册中心 - SOFARegistry 架构介绍》:https://www.sofastack.tech/blog/sofa-registry-introduction/

项目原文地址:https://www.sofastack.tech/projects/sofa-registry/code-analyze/code-analyze-data-synchronization/

 了解更多...

SOFARegistry Star 一下✨:
https://github.com/sofastack/sofa-registry

   本周推荐阅读  

6e57c1f33823e924b2e44c1862bcc471.png

SOFARegistry 源码|数据分片之核心-路由表 SlotTable 剖析

5b1e6493ee33e88167b73ce854134e9d.png

探索 SOFARegistry(一)|基础架构篇

4fb32252f17a9ceffde42db6046a5ed8.png

MOSN 构建 Subset 优化思路分享

b3177ed552d592212d38de35b383f13e.png

Nydus —下一代容器镜像探索实践

928190784e065645f8570dea60d004b4.png

数据同步 立即下载

相关推荐

LMS Virtual.Lab二次开发:声学仿真结果导出方法(VBScript、Python)

Siemens LMS Virtual.Lab 提供一套集成软件平台用以模拟机械系统的品质属性,如结构完整性、振动噪声、耐久性、系统动力学特性、驾驶的平顺性及操纵的稳定性等。

爱看书的小沐 6021

registry私有仓库搭建

DockerHub为我们提供了很多官方镜像和个人上传的镜像,我们可以下载机构或个人提供的镜像,也可以上传我们自己的本地镜像,但缺点是: ● 由于网络的原因,从DockerHub下载和上传镜像速度可能会比较慢;● 在生产上使用的镜像可能包含我们的代码、配置信息等,不想被外部人员获取,只允许内网的开发人员下载。为了解决以上问题,Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。

VcanVAC的博客 1349

C#集成Bartender:动态图片标签打印的实战与优化

本文详细介绍了在C#程序中集成Bartender实现动态图片标签打印的实战方法与优化策略。通过具名数据源绑定、图片对象尺寸控制等核心技巧,解决了动态图片显示/隐藏的难题,并提供了从模板设计、代码架构到性能优化、错误处理的全流程指南,帮助开发者构建稳定高效的工业级标签打印系统。

weixin_29216957的博客 431

echarts制作的数据实时同步,监控,数据可视化html页面前端源码

本源码编码:10185,需要的朋友,关注文末公众号,搜索10185,即可获取。

mazai5080的博客 951

STM32双ADC同步采样实战:FFT测量相位差的5个关键细节

本文深入探讨了利用STM32双ADC同步采样结合FFT算法精确测量信号相位差的实战技巧。文章聚焦五个关键细节:确保ADC时钟同源、优化DMA缓冲区设计、信号调理与窗函数选择、精确的相位提取与解缠绕,以及系统误差校准与验证。这些细节是提升相位差测量精度、确保系统稳定性的核心,尤其强调了STM32配置中易被忽视的时钟同步问题。

oauth7security的博客 594

批处理脚本手动双击可以执行,但计划任务中执行失败

问题现象: 使用批处理脚本从linux端(samba server) 备份一些数据,设置计划任务每天凌晨两点定时备份。 1)、windows系统中映射共享文件夹为S:盘,需要输入共享用户名和密码 2)、脚本中使用xcopy命令复制共享目录中的文件到windows本地目录中。 脚本如下: set Name=%date:~0,4%%date:~5,2%%date:~8,2% chcp 65001 REM chcp防止中文乱码 mkdir "E:\脚本备份\bakscripts%Name%" xco

独孤清扬玩DB 4312

[从源码学设计]蚂蚁金服SOFARegistry之程序基本架构

之前我们通过三篇文章初步分析了 MetaServer 的基本架构,MetaServer 这三篇文章为我们接下来的工作做了坚实的铺垫。本系列我们接着分析 Data Server,顺带会涉及一些 Session Server。因为 DataServer 和 MetaServer 代码实现和架构的基本套路类似,所以我们主要关心差异点和DataServer的特点。本文会分析DataServer程序的基本架构。

罗西的思考 1003

Windows 上安装 OpenCode 完全指南:从零到成功,人人能看懂!

跟着这篇教程,你应该已经成功在 Windows 上安装并运行了 OpenCode。步骤操作要点1安装 Chocolatey必须以管理员身份运行 PowerShell2安装 OpenCode3验证安装关闭并重新打开终端,输入4进入项目目录必须是 Git 仓库(git init5配置模型输入/connect,输入 API Key6开始使用输入问题测试最后的小建议如果没有 API Key,可以从 DeepSeek 或 Kimi 开始,有免费额度初次使用建议先在简单项目上测试。

专注于编程、AI、人工智能等多个领域内容研究和分析 3889

[从源码学设计]蚂蚁金服SOFARegistry之配置信息

SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。本系列文章重点在于分析设计和架构,即利用多篇文章,从多个角度反推总结 DataServer 或者 SOFARegistry 的实现机制和架构思路,让大家借以学习阿里如何设计。本文为第十六篇,介绍SOFARegistry网络操作之配置信息如何处理。

罗西的思考 910

Obsidian与RAG:知识管理的未来之战

摘要: 本文对比了传统RAG、Obsidian和llm-wiki-skill三种知识管理方案。传统RAG依赖查询时临时检索,知识无法积累;Obsidian需人工整理,成本高但结构化强;llm-wiki-skill通过AI在摄入时自动编译知识为结构化Wiki,实现持续增值。核心差异在于知识处理时机——llm-wiki-skill将"查询时检索"转变为"摄入时编译",通过三层Markdown结构(sources/concepts/entities)和自动双向链接构建可进化

ZhangJiqun&191cm&85kg 620

VN1640 CH5 I/O通道终极指南:【从硬件原理—>工程实战—>自动化测试实战】

摘要:本文详细解析Vector VN1640 CH5 I/O通道的硬件原理与工程应用,涵盖模拟输入(AIN)、数字输入(DIN)和数字输出(DOUT)三大功能模块的配置指南。通过硬件隔离设计实现高精度信号采集与驱动控制,重点分析开漏输出特性及保护机制。提供PWM控制、ECU上电时序测试、传感器闭环控制等实战案例的CAPL脚本代码,并强调多设备同步采集的精准性(时间偏差<1µs)。适用于汽车电子HIL测试、ECU信号监测等场景,所有方案均通过实际项目验证。

汽车控制器系统开发、VIL测试、HIL测试、MIL测试、EMS电喷系统标定与开发、热管理系统标定 759

数据同步神器——DataX 的源码学习

DataX的源码学习

明月朗,潇水寒 4815

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】

Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink CCI-500。它在 big.LITTLE 处理器集群之间提供完整的缓存一致性,并为其他代理(如 Mali GPU、网络接口或加速器)提供 I/O 一致性。CoreLink CCI-550 提供可扩展和可配置的互连,使 SoC 设计人员能够以尽可能小的面积和功耗满足性能目标,并且还增加了可降低整体系统延迟的监听滤波器。

CodingCos的博客 2210

HAVE FUN | SOFARegistry 源码解析

源码解析SOFARegistry 源码解析活动是由 SOFAStack 团队主办的开源活动,我们基于 GitHub 协作,打造一个人人皆可参与的积极透明的开源活动。本次活动旨在增强大家对 ...

金融级分布式架构 298

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[从源码学设计]蚂蚁金服SOFARegistry之服务上线

SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。本系列文章重点在于分析设计和架构,即利用多篇文章,从多个角度反推总结 DataServer 或者 SOFARegistry 的实现机制和架构思路,让大家借以学习阿里如何设计。本文为第十三篇,介绍从SessionServer角度看的服务上线。

罗西的思考 926

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HAVE FUN | SOFARegistry、Layotto 源码解析活动最新进展

源码解析源码解析活动发布已经五周啦,项目由最开始的 SOFARegistry 到 Layotto 。两个项目共计发布了 14 篇源码解析任务,那么活动如今进展到哪个程度了呢?快向下看吧!源码解析活动任务进展有了新变化,有新放出的任务哦,快来看看有没有适合你的任务,赶快认领走吧~活动仍在进行中...源码解析活动进展# 01 #来看看 SOFARegistry 与 Layot...

金融级分布式架构 240

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SOFARegistry监控与运维:关键指标与问题排查技巧

SOFARegistry 是由蚂蚁集团开发的生产级、低延迟、高可用服务注册中心,在分布式系统中扮演着关键角色。有效的监控与运维是保障其稳定运行的核心,本文将详细介绍 SOFARegistry 的关键监控指标、实用运维工具及常见问题排查方法,帮助新手用户快速掌握运维技能。 ## 一、核心监控指标解析 📊 SOFARegistry 内置了完善的指标采集机制,通过 JVM 指标、系统负载和业务指标

gitblog_00007的博客 417

蚂蚁金服服务注册中心数据分片和同步方案详解 | SOFARegistry 解析

SOFAStack(Scalable OpenFinancialArchitecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构...

金融级分布式架构 908

[从源码学设计]蚂蚁金服SOFARegistry 之 如何与Meta Server交互

SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。本系列文章重点在于分析设计和架构,即利用多篇文章,从多个角度反推总结 DataServer 或者 SOFARegistry 的实现机制和架构思路,让大家借以学习阿里如何设计。本文为第十篇,主要是<u>从业务角度进行梳理</u>。看看DataServer如何与MetaServer交互。

罗西的思考 486

蚂蚁金服服务注册中心 SOFARegistry 解析

SOFAStack (Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件...

weixin_45727359的博客 1605

蚂蚁金服服务注册中心 MetaServer 功能介绍和实现剖析 | SOFARegistry 解析

SOFAStack (ScalableOpenFinancialArchitecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架...

金融级分布式架构 2646

蚂蚁金服服务注册中心 Session 存储策略 | SOFARegistry 解析

SOFAStack(Scalable OpenFinancialArchitecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构...

金融级分布式架构 734

SOFARegistry完全指南:从0到1搭建高性能服务注册中心

SOFARegistry是蚂蚁金服开源的生产级、低延迟、高可用服务注册中心,采用AP架构设计,支持毫秒级实时推送和无限水平扩展。作为微服务架构的核心组件,它能帮助开发者轻松实现服务注册与发现,确保分布式系统的稳定运行。 ## 📌 核心优势:为什么选择SOFARegistry? SOFARegistry经过十年技术演进,已发展至第六代架构,具备以下关键特性: - **高可用性**:支持多副本

gitblog_00023的博客 373

社区会议回顾|大家一起聊聊 SOFARegistry

SOFA 社区在 2022 年 4 月 12 日组织了本次社区会议,和大家一起聊聊 SOFARegistry。本次社区会议共计 38 人参加,那么大家都聊了些什么呢?看下方回顾吧...SOFARegistry近一年的规划SOFARegistry 在 2022 年预计会发布 6.1 和 6.2 版本。源码解析心得分享- corey 分享《源码解析|延迟推送 trace》的...

金融级分布式架构 268
上一篇: 【活动推荐】云原生、产业互联网、低代码、Web3、元宇宙……哪个是 2022 年架构热点?...
下一篇: SOFARegistry 源码|数据同步模块解析
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值