实时数据的处理一致性如何保证?

news2025/1/14 18:13:09

实时数据一致性的定义以及面临的挑战

数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中,一致性包括但不限于数据的准确性、完整性、时效性和顺序性。


下图是典型的实时/流式数据处理的流程:
image

  • 流式数据以各种方式推送到kafka中
  • flink流式数据处理引擎将数据处理
  • 处理完成的数据写入到Mpp数据库

由于整个数据链条是动态变化,因此,实时数据的一致性面临一些挑战。


高并发处理:实时系统需要处理大量并发数据流,增加了一致性维护的难度。主要是在分布式数据库端,如何处理高并发的写入?
网络延迟和故障:网络问题可能导致数据传输中断或延迟,影响数据同步。主要是在数据处理过程中如何保障数据处理的一致性?


实时数据处理系统如何保障一致性

数据源和数据处理之间采用消息队列

缓冲机制:使用消息队列作为缓冲,平衡数据生产者和消费者之间的速度差异。

顺序保证:确保消息按照发送顺序被处理。


Flink引擎在故障下保持数据一致性策略

数据重放(Data Replay)

  • 概念:数据重放是指在发生故障后,系统能够重新处理之前已经处理过的数据,以确保数据的完整性和一致性。
  • 实现:Flink 通过保存输入数据流的快照(snapshots),在发生故障时,可以从快照中恢复数据,并重新处理从故障点之后的数据。

状态恢复(State Recovery)

  • 概念:Flink 作业由多个操作符组成,每个操作符可能有自己的状态(例如,计数器、聚合结果等)。状态恢复是指在故障发生后,能够恢复这些状态到故障前的状态。

  • 实现:Flink 定期对操作符的状态进行快照(checkpointing),并将快照存储在持久化存储中。如果作业失败,Flink 可以从最近的快照中恢复状态,并从故障点继续处理。


通过状态恢复和数据重放,Flink 确保即使在发生故障的情况下,也能保持数据处理的端到端一致性。并且Flink 提供了端到端的精确一次(exactly-once)处理语义,确保每条数据在系统中只被处理一次,即使在故障发生时也是如此。


故障处理流程

  • 故障检测:Flink 监控作业的运行状态,一旦检测到节点故障,立即启动故障恢复流程。
  • 状态恢复:Flink 从最近的快照中恢复作业的状态,包括每个操作符的内部状态。
  • 数据重放:Flink 重新处理从故障点之后的数据,确保所有数据都被正确处理。
  • 作业重启:在状态和数据恢复之后,Flink 重启作业,从故障点继续执行。

Flink引擎在网络延迟下保持数据一致性策略

Flink 引擎解决数据延迟到达的现象主要通过以下几种策略:

  • 时间语义:Flink 支持不同的时间语义(事件时间、处理时间和摄取时间),允许开发者根据业务需求处理数据的时效性问题。

  • 水印机制(Watermarks):Flink 使用水印来处理事件时间的数据流。水印是一种用于表示时间进度的机制,可以告诉 Flink 在特定时间之前的所有事件都已到达,可以进行处理。这允许系统处理乱序事件或延迟到达的数据。

  • 窗口技术:Flink 提供了多种窗口操作,如滚动窗口(tumbling windows)、滑动窗口(sliding windows)和会话窗口(session windows),这些窗口可以对数据进行分组并在指定的时间范围内聚合,从而处理数据到达的延迟。

  • 状态管理:Flink 允许操作符维护状态,即使数据延迟到达,也可以在状态中保留必要的信息,直到数据真正到达时再进行处理。

  • 允许乱序和延迟的 API:Flink 提供了 allowedLateness 参数,允许在窗口操作中指定一定的延迟容忍度,窗口会为延迟数据保留状态,直到延迟数据到达后进行处理。


MPP数据库在高并发情况下保持数据一致性策略

分布式数据库在设计的时候会考虑高并发情况下保持数据一致性的策略,主要有使用事务管理,数据分区分片,数据版本控制,以及采用最终一致性原理。

  • 使用事务管理:MPP数据库一般会提供ACID事务属性,确保事务具有原子性,一致性、隔离性和持久性,另外在分布式系统中支持分布式事务,使用两阶段提交等协议来维护事务一致性。

  • 数据分区分片:将数据分布到不同的分区或分片上,减少单个节点的负载,提高并发处理能力。数据分区分片时采用一致性哈希算法来分配数据到不同的节点,即使在节点增减的情况下也能保持数据分布的一致性。

  • 数据版本控制:当多个事务或操作可能同时对同一数据进行修改时,数据版本控制可以确保数据库的一致性和完整性。另外,数据版本控制可以实现多版本并发控制(MVCC),允许在不锁定资源的情况下执行读取和写入操作,从而提高系统的并发性能。在分布式系统中,不同节点可能会对同一数据产生冲突的更新,版本控制机制可以帮助识别和解决这些冲突。

  • 采用最终一致性模型:大部分分布式数据库采用CAP定理,接受短暂的数据不一致,最终一致性。


在实时数据处理流程中,从技术架构的设计到数据处理引擎的实现,再到分布式数据库在面对高并发、系统故障和网络异常等挑战时确保数据一致性的机制,都需要开发人员在开发和部署阶段进行精心的规划和应用。通过合理利用这些功能,可以有效地维护数据的完整性和一致性。


注:分布式数据库的设计和操作深受CAP定理的影响,该定理指出在分布式系统中,以下三个特性不可能同时得到完全满足:

  • 一致性(Consistency):在分布式系统中的所有数据副本上,对于任何更新操作,都能保证所有节点在同一时间看到最新的数据。

  • 可用性(Availability):每个请求接收到一个响应,无论是成功还是失败的响应。

  • 分区容错性(Partition Tolerance):在网络分区(即系统的一部分被网络故障隔离)发生的情况下,系统仍然能够继续运行。


在CAP定理的框架下,分布式数据库需要在这三个特性之间做出权衡:

  • 强一致性与可用性的权衡:如果一个分布式数据库优先考虑一致性,那么在更新数据时可能需要锁定相关的数据副本,直到所有副本都更新完毕。这可能会降低系统的可用性,因为在更新过程中,其他操作可能需要等待。

  • 最终一致性:在这种模型下,分布式数据库接受在数据更新后的短时间内数据可能不一致,但保证系统最终会达到一个数据一致的状态。这种模型通常通过版本控制、数据版本控制、冲突解决策略等技术实现,允许系统在更新过程中继续处理请求,但返回的数据可能是旧版本。

  • 分区容错性:对于分布式数据库来说,网络分区是一种常见情况,因此数据库需要设计为即使在分区发生时也能继续提供服务。这通常意味着牺牲一定程度的一致性或可用性,例如,通过使用最终一致性模型来保证系统的持续运行。


在实际应用中,分布式数据库可能采用以下策略来实现CAP定理中的权衡:

  • 数据副本和同步策略:选择合适的数据副本数量和同步方式,以平衡一致性和可用性。

  • 读写分离:通过分离读操作和写操作,可以在保持高可用性的同时,通过异步复制机制逐步达到数据一致性。

  • 冲突解决机制:在检测到数据冲突时,使用预定义的策略来解决冲突,如“最后写入胜出”或基于特定业务逻辑的自定义策略。

  • 智能路由和负载均衡:在网络分区发生时,智能地路由请求到可用的节点,并在后台同步数据,以保持系统的可用性和一致性。

  • 使用不同的一致性模型:根据业务需求,选择强一致性、最终一致性或其他一致性模型,以适应不同的应用场景。

最终,分布式数据库的设计者和运维人员需要根据具体的业务需求、系统特点和预期的工作负载来决定如何在CAP定理的三个特性之间做出最佳权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术速递|Java on Azure Tooling 5月更新 - Java 对 Azure 容器应用程序的入门指南支持

作者:Jialuo Gan 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具 5 月份更新。在本次更新中,我们将介绍 Java 在 Azure 上的容器应用程序的入门指南。希望您喜欢这些更新,并享受使用 Azure 工具包的流畅体验。请下…

鸿蒙轻内核A核源码分析系列七 进程管理 (3)

本文记录下进程相关的初始化函数,如OsSystemProcessCreate、OsProcessInit、OsProcessCreateInit、OsUserInitProcess、OsDeInitPCB、OsUserInitProcessStart等。 1、LiteOS-A内核进程创建初始化通用函数 先看看一些内部函数,不管是初始化用户态进程还…

助力618!你想便宜寄快递退换货吗?

家人们,姐妹们,马上就要到618了,每年一到这种重要的节日,我们都会买买买,但是我们有时候买了会发现这个商品不太满意,我们会选择退换货,或者给商家邮寄回去,但是这个运费可真的太贵了…

CRC计算单元

CRC计算单元 CRC是Cyclic Redundancy Check,循环冗余校验的缩写. 是一种检测数据错误的技术,主要用在数据通信和数据存储的方面. 但是这种技术只能检测到传输或存储的数据是否有误,没有将错误纠正的功能. 而CRC计算单元是一个独立的具备CRC计算功能的外设. AT32 MCU片上CRC计…

Web应用安全测试-认证功能缺陷

Web应用安全测试-认证功能缺陷 存在空口令 漏洞描述:认证登录环节允许空口令 测试方法: 找到网站登录页面,尝试输入用用户名,密码为空进行登录。 风险分析:攻击者可利用该漏洞登录网站后台,操作敏感数…

Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.

问题:在代码中使用jest进行单元测试时,报错如下: 解决思路: 根据报错提示出来的 react-dom/test-utils 进行全局搜索,发现没有该引用,故进入该代码块中分析。发现代码中引入testing-library/react &#…

C++ 28 之 类对象作为类成员

#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std;class Phone { public:string s_p_name;Phone(string p_name) {s_p_name p_name;cout << "phone的构造函数调用" << endl;}~Phone(){cout &…

BitMEX 联合创始人 Arthur Hayes 加入 Covalent 担任战略顾问

Arthur Hayes 加入 Covalent Network&#xff08;CQT&#xff09;&#xff0c;成为其战略顾问。 Hayes 认为 Covalent 与其竞争对手如 The Graph 相比&#xff0c;Covalent Network 的 CQT 代币一直被相对低估&#xff0c;他希望帮助 Covalent Network&#xff08;CQT&#x…

【Three.js】知识梳理二十一:Three.js性能优化和实践建议

Three.js 是一个功能强大的 3D 引擎&#xff0c;用于创建 WebGL 应用。尽管它功能强大&#xff0c;但在复杂的 3D 场景中保持高性能是一个挑战。本文将分享一些在使用 Three.js 时的性能优化提示&#xff0c;帮助你提高应用的运行效率。 1. 使用 stats.js 监视性能 在进行任何…

苦日子开始了,普通人应该怎么做?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 以为疫情后&#xff0c;我们的收入会好起来&#xff0c;谁曾想连工作都快保不住了&#xff0c;这几年大家日子过的比较苦&#xff0c;很多人想多一份收入。 面对这种情况&#xff0c;我们普通人应该怎么办?如何多…

【秋招突围】2024届秋招笔试-阿里系列笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

C++ 27 之 初始化列表

c27初始化列表.cpp #include <iostream> #include <string.h> using namespace std;class Students06{ public:int s_a;int s_b;int s_c;Students06(int a, int b, int c){s_a a;s_b b;s_c c;}// 初始化列表写法1&#xff1a;// Students06():s_a(4),s_b(5),s_…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

【RabbitMQ】初识 RabbitMQ

初识 RabbitMQ 1.认识 RabbitMQ1.1 介绍1. 2.使用场景1.2.1 推送通知1.2.2 异步任务1.2.3 多平台应用的通信1.2.4 消息延迟1.2.5 远程过程调用 1.3 特性 2.基本概念2.1 生产者、消费者和代理2.2 消息队列2.3 交换机2.3.1 direct2.3.2 topic2.3.3 headers2.3.4 fanout 2.4 绑定2…

Downie for Mac v4.7.17 在线视频下载软件 安装(简单易学,小白轻松搞定)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;进行设置2、下载视频&#xff0c;测试3、根据需要选…

关于unbuntu的终端自动退出的解决方案

输入sudo vim /etc/profile 将下面的TMOUT的时间注释掉 source /etc/profile使得更改生效

打破数据分析壁垒:SPSS复习必备(一)

一、数据录入与数据获取 1.变量的测量尺度 &#xff08;1&#xff09;定类尺度 顾名思义&#xff0c;是对事物的类别或属性的一种测度&#xff0c;按照事物的某种属性对其进行分类或分组。 该类变量只能计算频数和频率&#xff0c;用表示 &#xff08;2&#xff09;定序尺…

人生感悟 | 我们为什么贫穷?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 我们为什么贫穷&#xff1f; 因为我们都在局中并坦然的按着规则制定者循规蹈矩的生活。 01 负债导致贫穷 最近同事买房&#xff0c;总价一百多万&#xff0c;月供四千多&#xff0c;讲话&#xff1a;已入坑&#xff0…

python反序列化知识点学习

最近遇到了python反序列化的题目&#xff0c;简单学习一下相关的知识点 基础知识 Python 的序列化指的是将 Python 对象转换为一种格式&#xff0c;以便可以将其存储在文件或通过网络传输。Python 中最常用的序列化模块是 pickle 模块。 序列化使用的是pickle.dumps方法&…

qt仿制qq登录界面

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {// 设置窗口大小this->resize(window_width, window_heigth);// 固定窗口大小this->setFixedSize(window_width, window_heigth);// 设置窗口图标this->se…