数据血缘 Data Lineage 基础概念

数据血缘 (Data Lineage) ,又称数据血统、数据起源、数据谱系,是指数据的全生命周期中,数据从产生、处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。其记录了数据产生的链路关系,这些关系与人类的血缘关系比较相似,所以被成为数据血缘关系。它是数据治理的重要组成部分。

数据血缘 (Data Lineage) ,又称数据血统、数据起源、数据谱系,是指数据的全生命周期中,数据从产生、处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。其记录了数据产生的链路关系,这些关系与人类的血缘关系比较相似,所以被成为数据血缘关系。它是数据治理的重要组成部分。

  1. 血缘系统评价标准是什么?
  2. 如何构建数据血缘系统?
  3. 数据血缘落地有哪些方式?

一、数据血缘是什么

数据血缘是在数据的加工、流转过程产生的数据与数据之间的关系。

提供一种探查数据关系的手段,用于跟踪数据流经路径。

二、数据血缘的组成

1、数据节点

数据血缘中的节点,可以理解为数据流转中的一个个实体,用于承载数据功能业务。例如数据库、数据表、数据字段都是数据节点;从广义上来说,与数据业务相关的实体都可以作为节点纳入血缘图中,例如指标、报表、业务系统等。

按照血缘关系划分节点,主要有以下三类:流出节点->中间节点->流入节点

  • 流出节点: 数据提供方,血缘关系的源端节点。
  • 中间节点: 血缘关系中类型最多的节点,既承接流入数据,又对外流出数据。
  • 流入节点: 血缘关系的终端节点,一般为应用层,例如可视化报表、仪表板或业务系统。

2、节点属性

当前节点的属性信息,例如表名,字段名,注释,说明等。

3、流转路径

数据流转路径通过表现数据流动方向、数据更新量级、数据更新频率三个维度的信息,标明了数据的流入流出信息:

  • 数据流动方向: 通过箭头的方式表明数据流动方向
  • 数据更新量级: 数据更新的量级越大,血缘线条越粗,说明数据的重要性越高。
  • 数据更新频率: 数据更新的频率越高,血缘线条越短,变化越频繁,重要性越高。

4、流转规则-属性

流转规则体现了数据流转过程中发生的变化,属性则记录了当前路径对数据的操作内容,用户可通过流转路径查看该路径规则与属性,规则可以是直接映射关系,也可以是复杂的规则,例如:

  • 数据映射: 不对数据做任何变动,直接抽取。
  • 数据清洗: 表现数据流转过程中的筛选标准。例如要求数据不能为空值、符合特定格式等。
  • 数据转换: 数据流转过程中,流出实体的数据需要进行特殊处理才能接入到数据需求方。
  • 数据调度: 体现当前数据的调度依赖关系。
  • 数据应用: 为报表与应用提供数据。

三、我们为什么需要数据血缘

1、日益庞大的数据开发导致表间关系混乱,管理成本与使用成本激增

数据血缘产生最本质的需求。大数据开发作为数据汇集与数据服务提供方,庞大的数据与混乱的数据依赖导致管理成本与使用成本飙升。

2、数据价值评估,数据质量难以推进

表的优先级划分,计算资源的倾斜,表级数据质量监控,如何制定一个明确且科学的标准。

3、什么表该删,什么表不能删,下架无依据

业务库,数仓库,中间库,开发库,测试库等众多库表,是否存在数据冗余(一定存在)。以及存储资源如何释放?

4、动了一张表,错了一堆表

你改了一张表的字段,第二天醒来发现邮件里一堆任务异常告警。

5、ETL任务异常时的归因分析、影响分析、恢复

承接上个问题,如果存在任务异常或者ETL故障,我们如何定位异常原因,并且进行影响分析,以及下游受影响节点的快速恢复。

6、调度依赖混乱

数据依赖混乱必然会带来调度任务的依赖混乱,如何构建一个健壮的调度依赖。

7、数据安全审计难以开展

针对银行、保险、政府等对安全关注度较高的行业,数据安全-数据泄露-数据合规性需要重点关注。
由于数据存在ETL链路操作,下游表的数据来源于上游表,所以需要基于数据全链路来进行安全审计,否则可能会出现下游数据安全等级较低,导致上游部分核心数据泄露。

四、数据血缘可以做什么

1、流程定位,追踪溯源

通过可视化方式,将目标表的上下游依赖进行展示,一目了然。

2、确定影响范围

通过当前节点的下游节点数量以及类型可以确定其影响范围,可避免出现上游表的修改导致下游表的报错。

3、评估数据价值、推动数据质量

通过对所有表节点的下游节点进行汇总,排序,作为数据评估依据,可重点关注输出数量较多的数据节点,并添加数据质量监控。

4、提供数据下架依据

例如以下数据节点,无任何下游输出节点,且并无任何存档需求,则可以考虑将其下架删除。

5、归因分析,快速恢复

当某个任务出现问题时,通过查看血缘上游的节点,排查出造成问题的根因是什么。同时根据当前任务节点的下游节点进行任务的快速恢复。

6、梳理调度依赖

可以将血缘节点与调度节点绑定,通过血缘依赖进行ETL调度。

7、数据安全审计

数据本身具有权限与安全等级,下游数据的安全等级不应该低于上游的安全等级,否则会有权限泄露风险。

可以基于血缘,通过扫描高安全等级节点的下游,查看下游节点是否与上游节点权限保持一致,来排除权限泄露、数据泄露等安全合规风险。

五、数据血缘落地方案

目前业内常见的落地数据血缘系统以及应用,主要有以下三种方式:

1、采用开源系统:

Atlas、Metacat、Datahub等

采用开源系统最大的优点是投入成本较低,但是缺点主要包括

    1、适配性较差,开源方案无法完全匹配公司现有痛点。

    2、二开成本高,需要根据开源版本进行定制化开发。

2、厂商收费平台:

亿信华辰,网易数帆等

此类数据平台中会内置数据血缘管理系统,功能较为全面,使用方便。但是同样也有以下缺点:

    1、贵

    2、需要ALL IN平台,为保障数据血缘的使用,数据业务需要全部迁移到厂商平台中。

3、自建

通过图数据库、后端、前端自建数据血缘管理系统,此方案开发投入较大,但是有以下优点

    1、因地制宜,可根据核心痛点定制化开发元数据及数据血缘系统。

    2、技术积累,对于开发人员来说,从0-1开发数据血缘系统,可以更深刻的理解数据业务。

    3、平台解耦,独立于数据平台之外,数据血缘的开发不会对正常业务造成影响。

六、如何构建数据血缘系统

1、明确需求,确定边界

在进行血缘系统构建之前,需要进行需求调研,明确血缘系统的主要功能,从而确定血缘系统的最细节点粒度,实体边界范围。

例如节点粒度是否需要精确到字段级,或是表级。一般来说,表级粒度血缘可以解决75%左右的痛点需求, 字段级血缘复杂度较表级血缘高出许多,如果部门人数较少,可以考虑只精确到表级粒度血缘。

常见的实体节点包括:任务节点、库节点、表节点、字段节点、指标节点、报表节点、部门节点等。血缘系统可以扩展数据相关的实体节点,可以从不同的场景查看数据走向,例如表与指标,指标与报表的血缘关系。但是实体节点的范围需要明确,不可无限制的扩展下去。

明确需求,确定节点粒度与范围之后,才可根据痛点问题给出准确的解决方案,不至于血缘系统越建越臃肿,提高ROI(投入产出比)。

2、构建元数据管理系统

目前市面上所有的血缘系统都需要依赖于元数据管理系统而存在。

元数据作为血缘的基础,
    一是用于构建节点间的关联关系,
    二是用于填充节点的属性,
    三是血缘系统的应用需要基于元数据才能发挥出最大的价值。

所以构建血缘系统的前提一定是有一个较全面的元数据。

3、技术选型:图数据库

目前业内通常采用图数据库进行血缘关系的存储。

对于血缘关系这种层级较深,嵌套次数较多的应用场景,关系型数据库必须进行表连接的操作,表连接次数随着查询的深度增大而增多,会极大影响查询的响应速度。

而在图数据库中,应用程序不必使用外键约束实现表间的相互引用,而是利用关系作为连接跳板进行查询,在查询关系时性能极佳,而且利用图的方式来表达血缘关系更为直接。

4、血缘关系录入:自动解析and手动登记

自动解析:

    获取到元数据之后,首先可以根据元数据表中的SQL抽取语句,通过SQL解析器可自动化获取到当前表的来源表【SQL解析器推荐jsqlparse】,并进行血缘关系录入。

手动登记:

    如果当前表无SQL抽取语句,数据来源为手动导入、代码写入、SparkRDD方式等无法通过自动化方式确定来源表的时候,我们需要对来源表进行手动登记,然后进行血缘关系的录入。

5、血缘可视化

血缘系统构建完成后,为了能够更好的体现血缘价值,量化产出,需要进行血缘可视化的开发,分为两步:

 (1) 链路-属性展示:

    根据具体节点,通过点击操作,逐级展示血缘节点间的链路走向与涉及到的节点属性信息。

 (2)节点操作:

    基于可视化的血缘节点与当前节点附带的元数据属性,我们可以设想一些自动化操作例如:

        - 节点调度:直接基于血缘开启当前表节点的调度任务

        - 属性修改:通过前端修改当前节点的元数据属性并保存

6、血缘统计分析

数据血缘构建完成后,我们可以做一些统计分析的操作,从不同层面查看数据的分布与使用情况,从而支撑业务更好更快更清晰。

例如:
1. 数据节点下游节点数量排序,用于评估数据价值及其影响范围
2. 查询当前节点的所有上游节点,用于业务追踪溯源
3. 数据节点输出报表信息详情统计,用于报表的上架与更新
4. 查询孤岛节点,即无上下游节点的节点,用于数据删除的依据

7、血缘驱动业务开展

数据血缘构建完成,统计分析结果也有了,业务痛点也明确了,接下来我们即可利用数据血缘驱动业务更好更快开展。

落地的血缘相关业务有以下几点:

(1)影响范围告警:

    将血缘关系与调度任务打通,监测当前血缘节点的调度任务,如果当前节点调度出现异常,则对当前节点的所有下游节点进行告警。

(2)异常原因探查:

    还是将血缘关系与调度任务打通,监测当前血缘节点的调度任务,如果当前节点调度出现异常,则会给出当前节点的直接上游节点,用于探查异常原因。

(3)异常链路一键恢复:

    基于上一应用,异常原因定位并且修复完成之后,可以通过血缘系统,一键恢复当前数据节点的所有下游节点调度任务,真正实现一键操作。

(4)支撑数据下架:

    根据探查孤岛节点即无上下游节点的节点,归档数据表,节省存储空间。

(5)数据质量监控:

    对当前血缘中所有节点输出的下游节点数量进行排序,可以精确的判断某张表的影响范围大小,从而可以根据此对高排序表进行数据质量的监控。

(6)数据标准化监控:

    如果当前公司制定了基于库、表、字段的命名规范,我们可以通过探查血缘中的所有数据节点,并命名规范进行匹配,得到不符合规范的库、表、字段进行整改。

    当然了,此业务仅基于元数据也可实现。

(7)数据安全审计:

    团队基于用户职级、部门、操作行为等权重对目前的库表进行了数据权限等级划分,权限等级越高,当前表的安全级别越高。

    团队基于血缘进行数据全链路的安全等级监测,如果发现下游节点安全等级低于上游节点,则会进行告警并提示整改。确保因为安全等级混乱导致数据泄露。

七、血缘系统评价标准

在推动数据血缘落地过程中,经常会有用户询问:

  • 血缘质量如何?
  • 覆盖场景是否全面?
  • 能否解决他们的痛点?
  • 做出来好用吗?

市面上血缘系统方案那么多,我们自建系统的核心优势在哪里,血缘系统的优劣从哪些层次进行评价,于是量化出了以下三个技术指标:

1、准确率

定义: 假设一个任务实际的输入和产出与血缘中该任务的上游和下游相符,既不缺失也不多余,则认为这个任务的血缘是准确的,血缘准确的任务占全量任务的比例即为血缘准确率。

准确率是数据血缘中最核心的指标,例如影响范围告警,血缘的缺失有可能会造成重要任务没有被通知,造成线上事故。

我们在实践中通过两种途径,尽早发现有问题的血缘节点:

    人工校验: 通过构造测试用例来验证其他系统一样,血缘的准确性问题也可以通过构造用例来验证。实际操作时,我们会从线上运行的任务中采样出一部分,人工校验解析结果是否正确。

    用户反馈: 全量血缘集合的准确性验证是个漫长的过程,但是具体到某个用户的某个业务场景,问题就简化多了。实际操作中,我们会与一些业务方深入的合作,一起校验血缘准确性,并修复问题。

2、覆盖率

定义: 当有数据资产录入血缘系统时,则代表数据血缘覆盖了当前数据资产。被血缘覆盖到的数据资产占所有数据资产的比例即为血缘覆盖率。

血缘覆盖率是比较粗粒度的指标。作为准确率的补充,用户通过覆盖率可以知道当前已经支持的数据资产类型和任务类型,以及每种覆盖的范围。

在内部,我们定义覆盖率指标的目的有两个,
    一是我方比较关注的数据资产集合,
    二是寻找当前业务流程中尚未覆盖的数据资产集合,以便于后续血缘优化。

当血缘覆盖率低时,血缘系统的应用范围一定是不全面的,通过关注血缘覆盖率,我们可以知晓血缘的落地进度,推进数据血缘的有序落地。

3、时效性

定义: 从数据资产新增和任务发生修改的时间节点,到最终新增或变更的血缘关系录入到血缘系统的端到端延时。

对于一些用户场景来说,血缘的时效性并没有特别重要,属于加分项,但是有一些场景是强依赖。不同任务类型的时效性会有差异。

例如:故障影响范围告警以及恢复,是对血缘实时性要求很高的场景之一。如果血缘系统只能定时更新T-1的状态,可能会导致严重业务事故。

提升时效性的瓶颈,需要业务系统可以近实时的将任务相关的修改,以通知形式发送出来,并由血缘系统进行更新。

参考地址:https://www.aboutyun.com/forum.php?mod=viewthread&tid=33811&highlight=%26%231130%3B%26%231333%3B

数据治理 Data Governance 基础概念

数据架构、数据标准、数据质量、主数据管理、元数据管理、数据安全、数据生命周期、数据基础平台、数据应用、数据需求与规划 、外部数据采购、数据运维等;数据治理的6个基本原则:职责、策略、采购、绩效、符合和人员行为;数据管理组织的构成分为三个层次,自上而下划分为决策层、管理协调层以及执行层。

数据治理涉及到哪些方面?

数据架构、数据标准、数据质量、主数据管理、元数据管理、数据安全、数据生命周期、数据基础平台、数据应用、数据需求与规划 、外部数据采购、数据运维等

数据治理的6个基本原则:职责、策略、采购、绩效、符合和人员行为

数据管理组织的构成分为三个层次,自上而下划分为决策层、管理协调层以及执行层。

企业数据架构管理应该遵循 可信数据源原则;数据分布减法原则;数据完整性原则

数据治理过程中用到的工具

  1. 数据生命周期管理相关工具
  2. 数据安全相关工具
  3. 主数据管理工具
  4. 数据清洗工具
  5. 数据资产管理工具
  6. 数据共享交换平台或工具
  7. 数据质量管理工具
  8. 元数据管理工具
  9. 数据标准化工具

数据治理参考标注或方法论

SMART的:Specific(具体的)、Measurable(可衡量的)、Actionable(可操作的)、Relevant(相关的)、Timely(及时的)。

  1. GB/T36073-2018《数据管理能力成熟度评估模型》 —- 《数据管理能力成熟度评估模型》DCMM
    • DCMM按照组织、制度、流程、技术对数据管理能力进行了分析和总结, 提炼出组织数据管理的8个过程域,即数据战略、数据治理、数据架构、数据应 用、数据安全、数据质量、数据标准、数据生存周期
  2. GB/T 34960《信息技术服务治理 数据治理规范》
  3. DAMA DMBOK — DAMA数据管理知识体系指南(原书第2版)
  4. DGI
  5. COBIT 5
  6. TOGAF 9

DAMA数据管理知识体系、DCMM数据管理能力成熟度评估、DGI数据治理框架

DMBOK 简述

  • 数据治理(Data Governance):通过建立一个能够满足企业需求的数据决策体系,为数据管理提供指导和监督。这些权限和责任的建立应该考虑到组织的整体需求。(参见第3章)
  • 数据架构(Data Architecture):定义了与组织战略协调的管理数据资产的“蓝图”,指导基于组织的战略目标,指定符合战略需求的数据架构。(参见第4章)
  • 数据建模和设计(Data Modeling and Design):以数据模型(data model.)的精确形式,进行发现、分析、展示和沟通数据需求的过程。(参见第5章)
  • 数据存储和操作(Data Storage and Operations):以数据价值最大化为目标,包括存储数据的设计、实现和支持活动,以及在整个数据生命周期中,从计划到销毁的各种操作活动。(参见第6章)
  • 数据安全(Data Security):这一活动确保数据隐私和安全,数据的获得和使用必须要有安全的保障。(参见第7章)
  • 数据集成和互操作(Data Integration and Interoperability):包括与数据存储、应用程序和组织之间的数据移动和整合相关的过程。(参见第8章)
  • 文档和内容管理(Document and Content Management):用于管理非结构化媒体的数据和信息的生命周期过程,包括计划、实施和控制活动,尤其是指支持法律法规遵从性要求所需的文档。(参见第9章)
  • 参考数据和主数据管理(Reference and Master Data Management):包括核心共享数据的持续协调和维护,使关键业务实体的真实信息,以准确、及时和相关联的方式在各系统间得到一致使用。(参见第10章)
  • 数据仓库和商务智能(Data Warehousing and Business Intelligence):包括计划、实施和控制流程,来管理决策支持数据,并使知识工作者通过分析报告从数据中获得价值。(参见第11章)
  • 元数据管理(Metadata Management):包括规划、实施和控制活动,以便能够访问高质量的集成元数据,包括定义、模型、数据流和其他至关重要的信息(对理解数据及其创建、维护和访问系统有帮助)。(参见第12章)
  • 数据质量管理(Data Quality Management):包括规划和实施质量管理技术,以测量、评估和提高数据在组织内的适用性。(参见第13章)

除了有关知识领域的章节外DAMA-DMBOK,车轮图以外的内容,包含以下主题章节:

  • 数据处理伦理(Data Handling Ethics):描述了关于数据及其应用过程中,数据伦理规范在促进信息透明、社会责任决策中的核心作用。数据采集、分析和使用过程中的伦理意识对所有数据管理专业人士有指导作用。(参见第2章)
  • 大数据和数据科学(Big Data and Data Science):描述了针对大型的、多样化数据集收集和分析能力的提高而出现的技术和业务流程。(参见第14章)
  • 数据管理成熟度评估(Data Management Maturity Assessment):概述了评估和改进组织数据管理能力的方法。(参见第15章)
  • 数据管理组织和角色期望(Data Management Organization and Role Expectations):为组建数据管理团队、实现成功的数据管理活动提供了实践提供和参考因素。(第16章)
  • 数据管理和组织变革管理(Data Management and Organizational Change Management ):描述了如何计划和成功地推动企业文化变革,文化的变革是将数据管理实践有效地嵌入组织中必然结果。(第17章)

DGI数据治理项目通用10个组成部分

分类 具体内容
与过程相关 ① 最终目标与愿景
② 短期目标、治理标准、评估标准、资金筹集策略
③ 数据规则与定义
④ 决策权
⑤ 问责制度
⑥ 控制措施
与员工与企业部门相关 ⑦ 数据利益相关方
⑧ 数据治理办公室
⑨ 数据管理小组
与过程相关 ⑩ 主动型、应对型与持续性的数据治理过程(项目)

DGI框架的5W1H法则

WHY,为什么需要数据治理?

DGI框架中的第1-2组件,数据治理愿景使命、数据治理目标。用这两个组件来定义企业为什么需要数据治理。它为企业数据治理指明了方向,是其他数据治理活动的总体策略。

WHAT,数据治理治什么?

DGI框架中的3-6个组件,数据规则与定义、数据的决策权、数据问责制、数据管控,DGI框架这4个组件定义出了数据治理到底治什么。

  • 数据规则与定义,侧重业务规则的定义,例如:相关的策略、数据标准、合规性要求等;
  • 数据的决策权,侧重数据的确权,明确数据归口和产权为数据标准的定义、数据管理制度、数据管理流程的制度奠定基础。
  • 数据问责制,侧重数据治理职责和分工的定义,明确谁应该在什么时候做什么。
  • 数据管控,侧重采用什么样的措施来保障数据的质量和安全,以及数据的合规使用。

WHO,谁参与数据治理?

DGI框架中的7-9组件,定义数据治理的利益干系人,主要包括:数据利益相关者、数据治理办公室和数据专员。DGI框架对数据治理的主导、参与的职责分工定义给出了相关参考。

WHEN,什么时候开展数据治理?

DGI框架中的第10个组件,用来定义数据治理的实施路径、行动计划。

HOW,如何开展数据治理?

DGI框架中的第10组件,数据治理流程,描述了数据管理的重要活动和方法。

WHERE,数据治理位于何处?

DGI框架外的组件,虽然没有含在10大组件之列但却十分重要,强调明确当前企业数据治理的成熟度级别,找到企业与先进标杆的差距,是定义数据治理内容和策略的基础。

参考链接:https://blog.csdn.net/m0_56143415/article/details/122706095

apache kafka 速度快的原理

kafka采用页缓存技术、顺序写入磁盘等技术来提升性能。在顺序读写的情况下,磁盘的顺序读写速度和内存相差无几,PageCache是系统级别的缓存,它把尽可能多的空闲内存当作磁盘缓存使用来进一步提高IO效率;所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手

apache kafka 采用页缓存技术、顺序写入磁盘等技术来提升性能。在顺序读写的情况下,磁盘的顺序读写速度和内存相差无几,PageCache是系统级别的缓存,它把尽可能多的空闲内存当作磁盘缓存使用来进一步提高IO效率;所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手

预备知识一: 页缓存(Page Cache)

缓存能提高I/O性能是基于以下2个重要的原理:

  1. CPU访问内存的速度远远大于访问磁盘的速度(访问速度差距不是一般的大,差好几个数量级)
  2. 数据一旦被访问,就有可能在短期内再次被访问(临时局部原理)
  • 文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问
  • 读写硬盘的速度比读写内存要慢很多,为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存。
  • 为了提升对文件的读写效率,Linux 内核会以页大小(4KB)为单位,将文件划分为多数据块。当用户对文件中的某个数据块进行读写操作时,内核首先会申请一个内存页(称为 页缓存 )与文件中的数据块进行绑定。
  • 页缓存,也称为磁盘缓存,是计算机随机存取存储器(RAM)的一个区域,用于保存并可能修改存储在硬盘或其他永久存储设备上的数据。
  • 页缓存,也称为磁盘缓存,是计算机随机存取存储器(RAM)的一个区域,用于保存并可能修改存储在硬盘或其他永久存储设备上的数据。
    1. 当从文件中读取数据时,如果要读取的数据所在的页缓存已经存在,那么就直接把页缓存的数据拷贝给用户即可。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把页缓存的数据拷贝给用户。
    2. 当向文件中写入数据时,如果要写入的数据所在的页缓存已经存在,那么直接把新数据写入到页缓存即可。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把新数据写入到页缓存中。对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。

预备知识二:「写缓存」常见的有3种策略

  1. 不缓存(nowrite) :: 也就是不缓存写操作,当对缓存中的数据进行写操作时,直接写入磁盘,同时使此数据的缓存失效
  2. 写透缓存(write-through) :: 写数据时同时更新磁盘和缓存
  3. 回写(copy-write or write-behind) :: 写数据时直接写到缓存,由另外的进程(回写进程)在合适的时候将数据同步到磁盘

预备知识三:通用页缓存流程

# DMA direct memory access:直接存储器访问,也就是直接访问RAM,不需要依赖CPU的负载
# CPU :中央核心处理器,主要用于计算,如果用于拷贝就太浪费资源
磁盘文件 ==DMAcopy=> 页缓存 ==CPUcopy=> 用户空间缓存 ==CPUcopy=> Socket缓存 ==DMAcopy=>> 网卡

页缓存减少了连续读写磁盘文件的次数,操作系统自动控制文件块的缓存与回收生命周期,用访问RAM的缓存代替访问磁盘区域的机制,增强查询效率。

Linux操作系统中的vm.dirty_background_ratio参数用来指定当脏页数量达到系统内存的百分之多少之后就会触发pdflush/flush/kdmflush等后台回写进程的运行来处理脏页,一般设置为小于10%的值即可,但不建议设置为0.与这个参数对应的还一个vm.dirty_ratio参数,它用来指定当脏页数量达到系统内存的百分之多少之后就不得不开始对脏页进行处理,在此过程中,新的I/O请求会被阻挡直至所有脏页被冲刷到磁盘中。

kafka页缓存技术如何实现

Kafka中大量使用了页缓存,

  • 消息都是先被写入页缓存,然后由操作系统负责具体的刷盘任务
  • 在Kafka中同样提供了同步刷盘及间断性强制刷盘(fsync)的功能,可以通过log.flush.interval.message、log.flush.interval.ms等参数来控制。
  • 同步刷盘可以提高 消息的可行性,防止由于机器掉电等异常造成处于页缓存而没有及时写入磁盘的消息丢失。
  • 一般不建议做同步刷盘,刷盘任务就应交由操作系统去调配,消息的可靠性应该由多副本机制来保障,而不是由同步刷盘这种严重影响性能的行为来保障

MMFile (Memory Mapped File):

  • (简称 mmap)也被翻译成内存映射文件 ,在 64 位操作系统中一般可以表示 20G 的数据文件,它的工作原理是直接利用操作系统的 Page 来实现文件到物理内存的直接映射。
  • 完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。
  • 通过 mmap,进程像读写硬盘一样读写内存(当然是虚拟机内存),也不必关心内存的大小,有虚拟内存为我们兜底。

kafka的零拷贝是什么意思?

场景描述:把磁盘中的某个文件内容发送到远程服务器上,那么他必须经过几个拷贝过程

  1. 从磁盘中去读取目标文件的内容拷贝到内核缓冲区中
  2. 把内核缓冲区的数据拷贝到用户空间的缓冲区中
  3. 在应用程序中调用write()方法把用户空间缓冲区的数据拷贝到内核空间的socket Buffer中
  4. 把在内核模式下的socket Buffer中的数据赋值到网卡缓冲区,
  5. 最后网卡缓冲区再把数据传输到目标服务器上。

在这个过程中我们发现数据从磁盘到最终发送出去要经历4次拷贝,而在这4次拷贝过程中,有两次拷贝是浪费的,

1. 从内核空间拷贝到用户空间
2. 从用户空间再次拷贝到内核空间。

所谓的零拷贝就是把这两次多余的拷贝忽略掉。应用程序可以直接把磁盘中的数据从内核中直接传输到socket.

零拷贝是一种为了解决数据从内核缓存到用户缓存的CPU拷贝产生的性能消耗的技术。

原理:当数据从磁盘经过DMA copy到页缓存(内核缓存)后,为了减少CPU拷贝的性能损耗,操作系统会将该内核缓存与用户层进行共享,减少一次CPU copy过程,同时用户层的读写也会直接访问该共享存储,本身由用户层到Socket缓存的数据拷贝过程也变成了从 内核到内核的CPU拷贝过程,更加的快速。

磁盘文件 ==DMAcopy=> 【页缓存并共享作为用户空间缓存】 ==CPUcopy=> Socket缓存 ==DMAcopy=>> 网卡

kafka的顺序读写

  • 硬盘是机械结构,每次读写都会“寻址”,其中寻址是一个“机械动作”,是最耗时的;顺序I/O比随机I/O快,为了提高读写硬盘的速度,Kafka 就是使用顺序 I/O
  • 在顺序读写的情况下,磁盘的顺序读写速度和内存相差无几;

顺序写磁盘就是在一个磁道连续的写入,数据都排在一起,分布在连续的磁盘扇区,主需要一次寻址就能找到对应的数据,而kafka本身的数据是不需要删除数据的,是已追加的方式写到磁盘,所以这样就能保证磁盘数据连续紧凑,同时kafka是以segment log flie进行分段存储的,每次访问磁盘文件的时候只需要寻址最后一个segment file的磁盘空间,能够保证写入和读取的效率。