经验:我所读过的最好的一篇分布式技术文章

优采云 发布时间: 2022-10-31 15:48

  经验:我所读过的最好的一篇分布式技术文章

  (点击上方公众号快速关注)。

  资料来源:foreach_break,

  前言

  这是一份学习笔记。

  该材料来自Jay Kreps关于Log的博客文章。

  原文很长,但我坚持阅读,收获颇丰,对 Jay 的技术能力、架构能力和对分布式系统的深刻理解印象深刻。同时,他有点沾沾自喜,因为他的一些理解与周杰伦的观点相吻合。

  Jay Kreps是LinkedIn的前首席参谋工程师,现在是Confluent的联合创始人兼首席执行官,也是Kafka和Samza的主要作者。

  所谓笔记,就是读文章做笔记,因为周杰伦哥自己在这一章里组织得太好了,他自己的科学素养和哲学素养也很高,所以他认为突出的也不会省略。

  一、来源

  日志:每个软件工程师都应该知道的关于实时数据的统一抽象()

  二、注意事项

  2.1 日志的值

  1)日志是以下系统的核心:

  2)日志可能与计算机一样古老,是分布式数据系统和实时计算系统的核心。

  3)日志有很多名称:

  4)不了解日志就无法完全理解日志

  2.2 什么是日志?

  2.2.1 概述

  记录的顺序定义了这样一个概念:时间。

  因为离记录越远,记录得越早。

  的概念

  条目的序列号可以用作时间戳,记录顺序作为时间的概念可能看起来很奇怪,但您很快就会发现,将“时间”与任何特定的物理时钟分离很容易。

  日志与普通文件和表没有太大区别。

  这样,你可能会觉得日志这么简单,还有需要讨论的吗?

  其实日志的核心含义是:

  日志记录发生了什么以及何时发生。

  而这个通常是分布式系统最核心的东西。

  请注意,这里有必要澄清几个概念:

  2.2.2 数据库中的日志

  Log的起源未知,就像发明二进制搜索的人一样,很难意识到这项发明是一项发明。

  日志记录早在IBM的System R中就出现了。

  在数据库中,您需要在数据库崩溃时保持不同的数据结构和索引同步。

  为了确保原子性和持久性,数据库需要在提交对数据结构和索引的更改之前记录要修改的内容。

  因此,日志记录了何时发生的情况,每个表和索引本身就是此历史信息的映射。

  由于日志会立即持久化,因此它们成为在发生崩溃时还原其他持久性结构的可靠来源。

  日志已从 ACID 特征的实现演变为数据库之间的数据复制方式。

  显然,数据库中发生的一系列数据更改成为保持数据库之间同步的最需要的信息。

  Oracle,MySQL和PostgreSQL都收录一个日志传输协议,该协议将日志的一部分发送到用于维护复制的从属数据库。

  Oracle的XStreams和GoldenState使用日志作为通用数据订阅机制来提供非Oracle数据库订阅数据。

  MySQL和PostgreSQL提供了类似的组件,这些组件是数据系统架构的核心。

  面向机器的日志不仅可以用于数据库,还可以用于:

  2.2.3 分布式系统中的日志

  日志解决了分布式数据系统中的两个重要问题:

  1) 有序数据更改

  2) 数据分发

  所谓的状态机复制原理

  如果两个确定性过程(以相同的状态和相同的顺序开始)接收相同的输入,则它们将产生相同的输出并以相同的状态结束。

  这

  所谓确定性是指处理过程与时间无关,其处理结果不受额外输入的影响。

  可以通过非确定性示例来理解:

  所谓状态可以是机器上的任何数据,无论是在机器的内存中还是经过处理后的磁盘上。值得注意的是,相同的

  输入以相同的顺序产生相同的结果,这就是为什么日志如此重要的原因,这是一个直观的概念:如果你将相同的日志输入两个确定性程序,它们将产生相同的输出。

  在分布式系统的构建中,意识到这一点可以:

  让所有机器都做同样的事情,协议是:

  构建分布式、一致的日志系统,为所有处理系统提供输入。

  日志系统的作用是消除所有输入流的不确定性,并确保处理相同输入的所有复制节点保持同步。

  此方法的最佳部分是,您可以将索引日志的时间戳视为所有复制节点的时钟:通过使用复制节点处理的日志

  中最大的时间戳作为复制节点的唯一 ID,时间戳与日志相结合可以唯一地表示该节点的整个状态。

  应用此方法的方法也有很多:

  从理论上讲,我们可以记录一系列机器指令,或者被调用方法的名称和参数,只要数据处理过程的行为相同,这些过程就可以保证节点之间的一致性。

  经常玩数据库的人会以不同的方式处理逻辑日志和物理日志:

  对于分布式系统,通常有两种方法来处理复制和数据处理:

  1) 状态机模型(主动 – 主动)

  2) 主回模型(主动 – 被动)

  如下图所示:

  为了理解上述两种方式之间的区别,让我们看一个简单的例子:

  现在,集群需要提供一个简单的服务来执行算术运算,例如加法和乘法。最初,维护一个数字,例如 0。

  上面的例子还揭示了为什么顺序是复制节点之间一致性的关键因素,如果这些操作的顺序被打乱,将获得不同的结果。

  分布式日志,可以作为某些一致性算法的数据结构:

  表示有关下一个值的一系列决策的日志。

  2.2.4 更新日志

  从数据库的角度来看,记录数据更改的一组更改日志和表是双重且可互操作的。

  1)根据记录数据变化的日志,可以重构处于某种状态的表(也可以是非关系存储系统中带有键的记录)。

  2)相反,如果表发生变化,则可以在日志中计算更改。

  这正是您想要近乎实时复制的地方!

  这与版本控制的作用非常相似:管理分布式、并发和状态修改。

  版本控制工具维护反映更改的修补程序,该修补程序实际上是一个日志,并且您与分支的签出快照进行交互,该快照等效于数据库中的表。您会发现,在版本控制和分布式系统中,复制都是基于日志的:更新版本时,只需提取反映版本更改的修补程序并将其应用于当前分支快照。

  2.3 数据集成

  2.3.1 数据集成的含义

  数据集成是来自组织中所有服务和系统的数据。

  事实上,数据的有效利用非常符合马斯洛的层次需求理论。

  在金字塔的底部,数据被采集并集成到应用程序中(无论是实时计算引擎、文本文件还是 Python 脚本)。

  这些数据需要转换,以保持易于阅读和处理的统一、标准化和干净的格式。

  当满足上述要求时,就可以开始考虑各种数据处理方法,如map-reduce或实时查询系统。

  显然,如果没有可靠、完整的数据流,Hadoop 只是一个昂贵的、难以集成的加热器(集群是否昂贵?)。

  相反,如果可以确保数据流可靠、可用且完整,则可以考虑更高级的游戏玩法、更好的数据模型以及一致、更易于理解的语义。

  然后,重点可以转移到可视化、报告、算法和预测(挖掘深度)。

  2.3.2 数据集成的两种复杂性

  事件事件

  数据记录事件是如何发生的,而不仅仅是发生了什么,通常被视为应用程序日志,因为它通常由应用程序系统写入。但这实际上混淆了日志的功能。

  事实上,谷歌的财富是由建立在(用户)点击流和好恶(体验)上的关联管道产生的,点击流和展示是事件。

  各类专业数据系统的爆炸式增长

  这些系统存在的原因:

  显然,将数据集成到这样的系统中是极其困难的。

  2.3.3 基于日志结构的数据流

  每个逻辑数据源都可以根据日志进行建模。

  数据源可以是记录事件(命中和 PV)的应用程序,也可以是接受更改的数据库表。

  每个订阅服务器都会尽快从这些数据源生成的日志中获取新记录,将其应用于本地存储系统,并增加其在日志中的读取偏移量。订阅者可以是任何数据系统,例如缓存、Hadoop、另一个站点的数据库或搜索引擎。

  登录

  事实上,提供了一个逻辑时钟,可以测量不同订阅者响应数据变化的状态,因为这些订阅者在日志中具有不同且独立的读取偏移量,这就像时间意义上的“时刻”。

  

  考虑这样一个示例、数据库和一些缓存服务器:

  日志提供了同步所有缓存服务器并推送其“时刻”的能力。

  假设我们写了一个数字为 X 的日志,想要从缓存服务器读取数据,为了不读取旧数据,我们只需要确保在缓存服务器将数据(同步)复制到 X 位置之前,我们不会从这个缓存中读取任何内容。

  此外,log 还提供了充当缓冲区的功能,以异步方式支持生产者和使用者行为。

  支持异步的最关键原因之一是订阅系统可能会崩溃,脱机进行维护,然后重新联机,在这种情况下,每个订阅者都按照自己的节奏使用数据。

  批处理系统(如 Hadoop 或数据仓库)使用数据

  以小时或数天为单位,而实时系统通常在几秒钟内消耗数据。

  数据源或日志不知道使用数据的订阅者的任何信息,因此有必要在管道中无缝添加订阅者和删除订阅者。

  更重要的是,订阅者只需要知道日志,而不是他们使用的数据源,无论该数据源是RDBMS,Hadoop还是新流行的K-V数据库等。之所以说日志,而不是消息系统,是因为不同的消息系统

  保证了不同的特性,而使用word消息系统,很难全面准确地表达某种语义,因为消息系统更重要的重定向消息。

  但是,日志可以理解为提供持久性保证和强序语义的消息系统,这在通信系统中称为原子广播。

  2.4 LinkedIn

  LinkedIn目前的主要系统包括(注:2013年):

  每个系统在其专业领域都提供专门的高级功能。

  (这一段太长太长了,周杰伦哥很有口才,所以挑重点记住!

  1)引入数据流的概念,是因为需要在Oracle数据库的表之上建立一个抽象的缓存层,为搜索引擎索引构建和社交图谱更新提供扩展能力。

  2)为了更好的处理LinkedIn的一些推荐算法,我们开始构建Hadoop集群,但团队在这方面的经验还很浅,所以走了不少弯路。

  3)一开始,这只是一个粗略的想法,只是将数据从Oracle数据仓库中提取出来并将其扔到Hadoop中就可以了。首先,从 Oracle 数据仓库快速导出数据是一场噩梦;其次,也是更糟糕的是,数据仓库中的一些数据没有得到正确处理,导致Hadoop批处理任务无法按预期产生结果,并且通过Hadoop批处理执行任务通常是不可逆的,尤其是在报告发布之后。

  4)最后,团队放弃了将数据从数据仓库中提取出来的方式,直接进入数据库和日志作为数据源。然后建造了一个轮子:K-V 存储(伏地魔)。

  5)即使是数据复制这样的小任务,也会占用团队大量的时间来处理它,更糟糕的是,一旦数据处理管道中出现了一个点,Hadoop立即变得浪费,因为无论算法在错误的数据上运行多么出色,只有一个后果,那就是生成更多错误的数据。

  6)即使团队构建了一些具有高度抽象的东西,它也需要为每个数据源进行特定的配置,这是许多错误和失败的根源。7)大量的程序员想要

  跟进,每个程序员都有大量的想法,集成这个系统,添加这个功能,集成这个功能,或者想要自定义数据源。

  8)周杰伦弟兄开始意识到:

  首先,他们建造的管道仍然粗糙,但非常有价值。即使解决数据在Hadoop等新系统中可用的问题,也可以解锁大量可能性。以前困难的计算开始成为可能。只需从其他系统解锁数据并集成它们,即可轻松制作新产品和分析。其次,很明显,可靠的数据加载

  需要更坚实的支持,如果可以捕获所有结构,Hadoop数据加载就可以完全自动化,而无需添加新数据源或手动修改数据模式。数据神奇地出现在 HDFS 中,当添加新数据源时,Hive 的表会自动生成,并使用适当的列自适应地生成。

  第三,数据覆盖面远远不够。因为很难处理很多新的数据源。

  9)为了解决新数据源加入后的数据加载问题,团队开始了这样的尝试:

  很快,他们发现这行不通,因为发布和订阅,生产和消费,数据流通常仍然是双向的,这变成了O(n^2)问题。

  所以,他们需要的是这样的模型:

  每个使用者都需要与数据源隔离,理想情况下只与一个数据存储库进行交互,该存储库为他们提供对任意数据的访问权限。

  10)消息系统+日志=卡夫卡,卡夫卡诞生了。

  2.5 日志ETL与数据仓库的关系

  2.5.1 数据仓库

  1) 一个干净、结构化、集成的数据存储库,用于分析。

  2)虽然这个想法很棒,但获取数据的方式有点过时了:定期从数据库中获取数据并将其转换为更易读的格式。

  3)以前的数据仓库问题是干净数据和数据仓库的高度耦合。

  数据仓库应该是查询功能的集合,服务于上报、搜索、AD热分析,包括计数、聚合、过滤等操作,所以应该是批处理系统。

  但是干净数据和这样的批处理系统的高度耦合意味着这些数据不能被实时系统消费,例如搜索引擎索引构建、实时计算和实时监控系统等。

  2.5.2 ETL

  Jay弟兄认为ETL只做两件事:

  1)提取并清理数据以从特定系统中解锁数据

  2)重构数据,以便可以通过数据仓库进行查询。例如,将数据类型更改为关系数据库的类型,将架构转换为星形或雪花模式,或将其分解为面向列的存储格式。

  但是将这两件事结合在一起是一个大问题,因为集成的、干净的数据应该被其他实时系统、索引构建系统和低延迟处理系统使用。

  数据仓库团队是

  负责采集和清理数据,但这些数据的生成者经常输出难以提取和清理的数据,因为他们不清楚数据仓库团队的数据处理需求。

  同时,由于核心业务团队对跟上公司其他部门的步伐不敏感,真正可以处理的数据覆盖率低,数据流脆弱,难以快速响应变化。

  因此,更好的方法是:

  如果要在干净的数据集上做一些搜索、实时监控趋势图和实时告警,不宜使用原创数据仓库或 Hadoop 集群作为基础设施。更糟糕的是,ETL为数据仓库构建了一个数据加载系统,该系统对其他(实时)系统几乎没有用处。最好的模型是在数据发布者发布

  数据之前清理数据,因为只有发布者最了解其数据的外观。在此阶段完成的所有操作都应该是无损和可逆的。

  所有丰富的语义或附加值的实时转换都应在原创日志发布后进行后处理,包括为事件数据建立会话或添加一些感兴趣的字段。原创日志仍然可以单独使用,但此类实时应用程序也会派生新的参数化日志。

  最后,只有与特定目标系统对应的数据聚合操作才应作为数据加载的一部分执行,例如转换为星型或雪花型架构,以便在数据仓库中进行分析和报告。因为这个阶段,就像传统的ETL一样,由于非常干净和规范的数据流,(带有日志)现在非常简单。

  2.6 日志文件和事件

  以日志为中心的架构还有一个额外的好处,即易于实现非耦合的事件驱动系统。

  捕获用户活动和系统更改的传统方法是将此信息写入文本日志,然后将其提取到数据仓库或Hadoop集群中进行聚合和处理,这类似于前面描述的数据仓库和ETL问题:数据与数据仓库高度耦合。

  在LinkedIn,它构建了一个基于kafka的事件数据处理系统。为各种操作定义了数百种事件类型,从 PV、用户广告展示、搜索到服务呼叫和应用程序异常等。

  要了解上述事件驱动系统的好处,请看一个简单的事件示例

  在“职业”页面上,提供机会。此页面应仅负责如何呈现机会,不应收录太多其他逻辑。但是,您会发现,在相当大的网站中执行此操作很容易涉及越来越多的逻辑,而这些逻辑与展示的机会无关。

  例如,我们要集成以下系统功能:

  1)我们需要将数据发送到Hadoop和数据仓库进行离线处理。

  2)我们需要计算页面浏览量,以确保某些视图不是用于抓取Web内容或任何东西。

  3) 我们需要汇总有关此页面的浏览信息,以便在业务机会发布者的分析页面上显示。

  4)我们需要记录一个用户浏览这个页面的历史记录,以确保我们向这个用户提供任何有价值的、有适合这个用户的良好体验的工作机会,而不是一遍又一遍地为这个用户重复一个机会(想想只有老婆不在家的时候才能玩的游戏, 红绿蓝闪烁的特效,配上爆炸性的DJ风格舞曲,或是摇摆专注的事业巅峰和Qi X短裙的女生,再点进去才发现是标题派对的广告!)。

  5)我们的推荐系统需要记录此页面的浏览历史记录,以便正确跟踪此工作机会的受欢迎程度。

  很快,仅显示机会的页面逻辑变得复杂。虽然我们也增加了这个机会在移动设备上的展示,但我们也必须迁移逻辑,这增加了复杂性。还没有,困难的部分是在此页面上工作的工程师需要了解其他系统,以确保上述功能正确集成。

  这只是一个极其简单的例子,在实践中,情况只会更加复杂。

  事件驱动可以使这变得容易。负责展示机会的

  页面只需要展示机会并记录一些与演示相关的因素,例如与工作机会相关的属性、查看页面的人员以及与演示文稿相关的其他有用信息。页面不需要维护其他系统的知识和知识,例如推荐系统、安全系统、机会发布者分析系统和数据仓库,所有这些系统只需要订阅者、订阅事件,然后独立处理它们,而呈现机会的页面不需要在新订阅者或消费者加入时进行修改。

  2.7 构建可扩展日志

  分离发布者和订阅者并不是什么新鲜事,但日志系统很难确保多个订阅者可以实时处理消息,同时确保可扩展性。

  如果日志不是构建

  速度快,开销低,可扩展性强,那么在这个日志系统上构建的所有美妙之处就不多说了。

  许多人可能认为日志系统在分布式系统中是一项缓慢而昂贵的工作,并且仅用于处理 ZooKeeper 更适合的一些信息,例如元数据。

  但是现在LinkedIn(注:2013年)每天在kafka中处理600亿次不同的消息写入(如果算上数据中心镜像,则为数千亿次写入)。

  周杰伦兄弟,他们是怎么做到的?

  1) 对日志进行分区

  2) 通过批量读取和写入优化吞吐量

  3) 避免不必要的数据复制

  通过将日志切片为多个分区来提供可扩展性:

  1)每个分区都是有序日志,但分区之间没有全局顺序。

  2)将消息写入哪个分区完全由编写器控制,通过某种类型的键(例如user_id)对其进行拆分。

  3)分段允许在分片之间不协调的情况下执行额外的日志操作,并确保系统的吞吐量与Kafka集群的大小呈线性相关。

  4)虽然没有提供全局订单(有

  实际上是成千上万的消费者或订阅者,讨论它们的全局顺序通常没有什么价值),Kafka 提供了一个保证,即发送方以什么顺序将消息发送到分区,消息以什么顺序(以什么顺序,以什么顺序)从该分区传递。

  5)每个分区按照配置的编号进行复制,如果一个领导节点挂断,其他节点将成为新的主节点。

  6)一个日志,和文件系统一样,线性读写模式可以优化,小的读写日志可以形成更大的、高吞吐量的操作。卡夫卡正在激烈地做这件事。批处理用于各种场景,例如客户端向服务器发送数据、将数据写入磁盘、服务器之间的数据复制、向消费者传输数据、确认提交数据等。

  7)最后,Kafka对内存日志、磁盘日志和通过网络发送的日志采用了非常简单的二进制格式,以方便使用各种优化技术,例如零拷贝数据传输。

  许多优化技术相结合,允许您以磁盘或网络可以提供的最大容量读取和写入数据,即使内存已满也是如此。

  2.8 日志和实时处理

  你认为周杰伦提供了一种如此漂亮的方法来复制数据并复制它吗?

  你!错!完成!日志是

  流式处理的另一种说法,日志是流处理的核心。

  2.8.1 什么是流处理

  周杰伦哥认为:

  1)流处理是连续数据处理的基础设施。

  2)流处理的计算模型,如MapReduce或其他分布式处理框架,只需要保证低延迟。

  3)批量数据采集模式导致批量数据处理模式。

  4)采集数据的连续模式导致连续的数据处理模式。

  5)杰伊弟兄谈到了美国人口普查局解释批处理的方式。

  在LinkedIn,活动数据和数据库中的变化是连续的。

  

  每天批处理数据,连续计算将窗口设置为一天以重合。

  因此,流处理是一个这样的过程:

  6)在处理数据时,有了时间的概念,不需要维护数据的静态快照,因此可以按照用户定义的频率输出结果,而无需等待数据集达到某个“结束”状态。

  7)从这个意义上说,流处理是批处理的泛化,鉴于实时数据的普及,这是一个极其重要的泛化。

  8)许多商业公司无法构建流处理引擎,通常是因为他们无法构建流数据采集引擎。

  9) 流处理弥合了实时响应服务和离线批处理基础设施之间的差距。

  10)日志系统解决了流处理模式下的许多关键问题,其中最大的问题是如何在实时多订阅者模式下提供可用数据(流数据采集)。

  2.9 数据流图

  关于流处理最有趣的事情是它扩展了源的概念。

  无论是日志、源还是事件,逐行数据记录,都来自应用程序的活动。

  但是,流处理还允许我们处理来自其他源的数据,这些数据与原创数据到使用者没有什么不同,并且这些派生源可以收录任何程度的复杂性。

  流处理任务应如下所示:从日志中读取数据并将输出写入日志或其他系统。

  作为输入和输出日志,将这些进程本身与其他进程连接起来,形成一个图形。

  事实上,以日志为中心的系统允许您将组织中的数据捕获、转换和数据流视为日志和写入它们的处理的组合。

  流处理程序不必很大:它可以是一个进程或一组进程,但它可以提供一些额外的基础结构和支持,以便更轻松地管理用于处理的代码。

  引入日志有两个目的:

  1)确保数据集可以支持多种订阅者模式,并且有序。

  2)可以用作应用程序的缓冲区。这很重要,因为在异步数据处理过程中,如果上游生产者可以更快地生成数据,而使用者无法跟上,在这种情况下,要么处理过程被阻塞,要么引入缓冲区,要么删除数据。

  丢弃数据似乎不是一个好的选择,阻塞处理过程会导致所有数据流的处理图中的处理过程卡住。另一方面,Log 是一个大的、超大的、非常大的缓冲区,它允许重新启动处理进程,以便在进程失败后,它不会影响流处理图中的其他进程。这对于大型组织扩展数据流至关重要,因为不同的团队有不同的处理任务,显然整个流处理过程不会因为一个任务中的错误而卡住。

  Storm 和 Samza 就是这样的流处理引擎,它们都使用 kafka 或其他类似的系统作为它们的日志系统。

  (注:周杰伦哥哥挺凶悍的,卡夫卡在前,萨马扎在后。

  2.10 有状态实时处理

  许多流处理

  引擎是无状态的,一次记录,但许多用例需要在一定大小的特定时间窗口内进行复杂的计数、聚合和联接操作,以进行流处理。

  例如,在点击流中,联接用户信息。

  然后,这种用例需要状态支持。在处理数据时,需要维护一段数据的状态。

  问题是,当处理器可能挂断时,如何保持正确?

  在内存中维护状态可能是最简单的,但它经不起崩溃。

  如果仅在某个时间窗口内保持状态,当发生挂断或故障时,则可以将处理直接重播到窗口的开头,但如果窗口长达 1 小时,这可能不起作用。

  另一种简单的解决方案是将状态存储在远程存储系统或数据库中,但这会丢失数据的局部性并产生大量的网络往返。

  回想一下上面提到的数据库中表和日志的双重性。

  可以使用本地存储或索引维护状态的流处理组件:

  通过记录有关本地索引的更改日志,它用于在崩溃后还原状态。此机制实际上揭示了一种通用状态,该状态可以存储为任意索引类型,并与输入流同时进行共分区。

  当处理进程崩溃时,它可以从更改日志中恢复索引,更改日志充当角色,将本地状态转换为基于基于时间的备份的某种增量记录。

  这种机制还提供了将进程本身的状态记录为日志的优雅功能,其他进程显然可以订阅该日志。

  结合数据库中的日志技术,对于数据集成的场景,往往可以做非常强大的事情:

  通过从数据库中提取日志并在各种流处理系统中为它们编制索引,可以加入不同的事件流。

  2.11 日志合并

  显然,不可能使用日志来记录全时状态更改信息。

  Kafka 使用日志合并或日志垃圾回收

  1) 对于事件数据,Kafka 只保留一个时间窗口(可以按时间配置为天或按空间配置)。

  2)对于键控更新,Kafka使用压缩技术。这种类型的日志可用于通过另一个系统中的重放技术重建源系统的状态。

  如果始终保留完整的日志数量,数据会随着时间的推移变得越来越大,重放过程也会越来越长。

  Kafka 不是简单地丢弃旧的日志消息,而是通过合并来丢弃过时的记录,例如,如果消息的主键最近已更新。

  2.12 系统构建

  2.12.1 分布式系统

  日志,在分布式数据库的数据流系统中所扮演的角色是一致的:

  您可以将组织中的应用程序和数据流视为单个分布式数据库。

  将面向查询的独立系统(如 Redis、SOLR、Hive 表等)视为特殊的顶级数据索引。

  将 Storm 和 Samza 等流处理系统视为设计良好的触发器或具体化视图机制。

  各种数据系统的爆发式涌现,其实这种复杂性早已存在。在关系数据库

  的辉煌时期(鼎盛时期),公司或组织有多种关系数据库。

  显然,不可能将所有内容都放入Hadoop集群并期望它解决所有问题。那么,如何构建一个好的系统,可能是这样的:

  构建一个分布式系统,其中每个组件都是一个小集群,每个组件不一定提供完整的安全性、性能隔离或良好的可扩展性,但每个问题都可以(专业地)解决。

  Jay认为,各种系统之所以爆炸式增长,是因为构建一个强大的分布式系统非常困难。如果将用例限制为简单的场景(例如查询),则每个系统都有足够的能力来解决问题,但很难集成这些系统。

  Jay认为未来构建系统有三种可能性

  1)维持现状。在这种情况下,数据集成仍然是最大的问题,因此外部日志系统很重要(kafka!

  2)一个强大的(如辉煌时期的关系数据库)似乎不太可能解决所有问题。

  3)新一代系统大多是开源的,这就揭示了第三种可能:数据基础设施可以离散化成一组服务,还有面向应用的系统API,各种服务各做各司其职,每一种都不完整,但可以专业解决专门的问题,其实现有的Java技术栈可见一斑:

  从某种角度来看,构建这样的分布式系统就像某种版本的乐高积木。这显然与更关心API的最终用户没有太大关系,但它揭示了构建健壮系统并保持简单状态的途径:

  显然,如果构建分布式系统的时间从数年减少到数周,那么自行构建大型系统的复杂性将消失,而这一定是由于出现了更可靠、更灵活的“构建块”。

  2.12.2 登录系统构建状态

  如果系统受外部日志系统支持,

  那么每个独立的系统都可以通过共享一个日志来降低自身的复杂性,Jay 认为日志的作用是:

  1)处理数据一致性。通过序列化节点上的并发操作可以实现即时和最终一致性。

  2) 提供节点间的数据复制。

  3)提供“提交”的语义。例如,如果您认为写入操作不会丢失,则为操作确认。

  4) 提供可由外部系统订阅的源。

  5) 提供在节点因故障而丢失数据时恢复或重建新复制节点的功能。

  6) 处理节点之间的负载均衡。

  以上,可能是应该在完整的分布式系统中提供的大部分功能(Jay brother真的很喜欢Log!其余的是客户端的 API 和构建索引之类的东西,例如需要提取所有分区的全文索引,以及针对只需要提取分区中的数据的主键的查询。

  (那就解释其余的,周杰伦哥哥很厉害!

  该系统可以分为两个逻辑组件(这是强大的理解和技能):

  1) 日志层

  2) 服务层

  日志层以序列化和有序的方式捕获状态更改,而服务层存储外部查询所需的索引,例如可能需要 B 树和稳定索引的 K-V 存储,以及需要倒排索引的搜索服务。

  写入操作可以直接输入到日志层中,也可以通过服务层代理。写入日志会生成逻辑时间戳(日志的索引),例如数字 ID,如果系统已分区,则服务层和日志层将具有相同的分区(但它们各自的计算机编号可能不同)。

  服务层订阅日志层,以

  最快的速度按照日志存储的顺序追逐日志,将数据和状态变化同步到自己的本地索引中。

  客户端将获得读写语义:

  通过携带查询时任何节点写入时间的时间戳,服务的节点

  Layer 接收此查询,将时间戳与其本地索引进行比较,如有必要,为了防止返回过期的旧数据,将请求的执行推迟到服务节点的索引与时间戳同步。

  服务层的节点可能需要也可能不需要知道领导者的概念。在许多简单的用例中,服务层无法构建领导节点,因为日志是事实的来源。

  还有一个问题是如何处理节点故障后的恢复。为此,可以在日志中保留固定大小的时间窗口,同时维护数据的快照。您也可以让日志保留数据的完整备份,并使用日志合并技术完成日志本身的垃圾回收。这种方法将服务层的大部分复杂性转移到日志层,因为服务层是特定于系统的,并且日志层可以是通用的。

  基于日志系统,可以提供一套完整的API供开发和使用,可以作为其他系统的ETL数据源,供其他系统订阅。

  全栈 ! :

  显然,以日志为核心的分布式系统立即成为可以为其他系统提供数据加载支持和数据流处理的角色。同样,流处理系统也可以同时使用多个数据流,并通过索引这些数据流然后输出另一个系统来向外界提供服务。

  构建系统

  基于日志层和服务层,使查询相关因素与系统的可用性和一致性脱钩。

  也许很多人认为在日志中单独备份数据,尤其是制作数据的完整副本,太浪费和奢侈,但事实并非如此:

  1)LinkedIn(注:2013)Kafka生产集群每个数据中心维护75TB的数据,应用程序集群比kafka集群需要更高的存储空间和存储条件(SSD+更多内存)。

  2)全文搜索索引最好加载到内存中,日志都可以使用,因为它们都是线性读写,所以可以使用廉价的大容量磁盘。

  3)由于Kafka集群实际上是在多订阅者模式下运行的,多个系统消耗数据,因此日志集群的成本是摊销的。

  4)由于上述所有原因,外部日志系统(kafka或类似系统)的开销变得非常小。

  2.13 结论

  最后,周杰伦哥不仅大方地留下了大量有价值的学术和工程论文和参考链接,还虚心留下了这样一句话:

  如果你做到了这一步,你就知道我对日志的大部分了解。

  发现这篇文章对您有帮助吗?请与更多人分享

  关注“*敏*感*词*新品”,看科技干货

  事实:要大量文章,内容伪原创工具哪个好用?

  1.我使用的文章伪原创工具是ATM AI批量写入工具。

  功能:在线伪原创、批量伪原创、自定义文本替换等。

  优点:伪原创之后的文章可读性强,文章流畅,原创率高,伪原创易操作,伪原创文章 速度快,免费使用

  此外,ATM AI 批写助手公众号近日观察到,3.0 版本将会更新。似乎在之前版本的基础上增加了更多的功能。有兴趣的朋友可以了解一下。

  1.在线伪原创:

  

  

  2. 批处理 伪原创:

  

  2.我使用的文章采集工具是优采云采集器和优采云

  1. 优采云采集

  功能:网站各类网站的大部分内容都可以实现采集,采集中的文章支持本地编辑,也支持在线发布到网站

  优点:文章采集速度不错,可以抓取各种网站数据采集,这个采集工具功能非常多,喜欢的朋友需要它可以自己研究。

  

  

  2. 优采云采集

  与上面提到的优采云采集相比,这个优采云采集工具操作起来更简单,设置的地方也不多,相当有一个傻瓜式采集工具,采集的文章速度一样快,文章的内容干净(文本模式下不会出现多余的标签码)在优采云,需要自己设置是否保留标签,比设置复杂一点。

  功能:静态页面内容采集

  优点:采集速度快,操作简单,采集的文章干净(优采云采集不支持在线发布,但是优采云还有各种网站内容更新器,需要另外下载)

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线