说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

首席工程师揭秘:LinkedIn大数据后台是如何运作的

HTML文档下载 WORD文档下载 PDF文档下载
“不懂得日志,你就不可能完全懂得数据库”Jay Kreps说道,Jay Kreps是LinkedIn公司首席工程师,本文介绍他本人对于日志的心得体会,包括日志是什么,如何在数据集成、实时处理和系统构建中使用日志等。

编者按: Jay Kreps是来自LinkedIn的首席工程师,他表示日志几乎在计算机产生的时候就存在,除了可用在分布式计算或者抽象分布式计算模型内部之外,还有广泛的用途。本文中他讲述的日志的原理和通过把日志用做单独服务来实现数据集成、实时数据处理以及分布式系统设计。文章内容非常干货,值得学习。

以下是原文:

我在六年前的一个令人兴奋的时刻加入到LinkedIn公司。从那个时候开始我们就破解单一的、集中式数据库的限制,并且启动到特殊的分布式系统套件的转换。这是一件令人兴奋的事情:我们构建、部署,而且直到今天仍然在运行的分布式图形数据库、分布式搜索后端、Hadoop安装以及第一代和第二代键值数据存储。

从这一切里我们体会到的最有益的事情是我们构建的许多东西的核心里都包含一个简单的理念:日志。有时候也称作预先写入日志或者提交日志或者事务日志,日志几乎在计算机产生的时候就存在,同时它还是许多分布式数据系统和实时应用结构的核心。

不懂得日志,你就不可能完全懂得数据库,NoSQL存储,键值存储,复制,paxos,Hadoop,版本控制以及几乎所有的软件系统;然而大多数软件工程师对它们不是很熟悉。我愿意改变这种现状。在这篇博客文章里,我将带你浏览你必须了解的有关日志的所有的东西,包括日志是什么,如何在数据集成、实时处理和系统构建中使用日志等。

第一部分:日志是什么?

日志

日志是一种简单的不能再简单的存储抽象。它是一个只能增加的,完全按照时间排序的一系列记录。日志看起来如下:

我们可以给日志的末尾添加记录,并且可以从左到右读取日志记录。每一条记录都指定了一个唯一的有一定顺序的日志记录编号。

日志记录的排序是由“时间”来确定的,这是因为位于左边的日志记录比位于右边的要早些。日志记录编号可以看作是这条日志 记录的“时间戳”。在一开始就把这种排序说成是按时间排序显得有点多余 ,不过 ,与任何一个具体的物理时钟相比,时间 属性是非常便于使用的属性。在我们运行多个分布式系统的时候,这个属性就显得非常重要。

对于这篇讨论的目标而言,日志记录的内容和格式不怎么重要。另外提醒一下,在完全耗尽存储空间的情况下,我们不可能 再给日志添加记录。稍后我们将会提到这个问题。

日志并不是完全不同于文件或者数据表的。文件是由一系列字节组成,表是由一系列记录组成,而日志实际上只是按照时间顺序存储记录的 一种数据表或者文件。

此时,你可能奇怪为什么要讨论这么简单的事情呢? 不同环境下的一个只可增加的有一定顺序的日志记录是怎样与数据系统关联起来的呢?答案是日志有其特定的应用目标:它记录了什么时间发生了什么事情。 而对分布式数据系统许多方面而言, 这才是问题的真正核心。

不过,在我们进行更加深入的讨论之前,让我先澄清有些让人混淆的概念。每个编程人员都熟悉另一种日志记录-应用使用syslog或者log4j可能写入到本地文件里的没有结构的错误信息或者追踪信息。为了区分开来,我们把这种情形的日志记录称为“应用日志记录”。应用日志记录是我在这儿所说的日志的一种低级的变种。最大的区别是:文本日志意味着主要用来方便人们阅读,而我所说明的“日志”或者“数据日志”的建立是方便程序访问。

(实际上,如果你对它进行深入的思考,那么人们读取某个机器上的日志这种理念有些不顺应时代潮流。当涉及到许多服务和服务器的时候,这种方法很快就变成一个难于管理的方式,而且为了认识多个机器的行为,日志的目标很快就变成查询和图形化这些行为的输入了-对多个机器的某些行为而言,文件里的英文形式的文本同这儿所描述的这种结构化的日志相比几乎就不适合了。)

数据库日志

我不知道日志概念起源于何处-可能它就像二进制搜索一样:发明者认为它太简单而不能当作一项发明。它早在IBM的系统R出现时候就出现了。数据库里的用法是在崩溃的时候用它来同步各种数据结构和索引。为了保证操作的原子性和持久性,在对数据库维护的所有各种数据结构做更改之前,数据库把即将修改的信息誊写到日志里。日志记录了发生了什么,而且其中的每个表或者索引都是一些数据结构或者索引的历史映射。由于日志是即刻永久化的,可以把它当作崩溃发生时用来恢复其他所有永久性结构的可信赖数据源。

随着时间的推移,日志的用途从实现ACID细节成长为数据库间复制数据的一种方法。利用日志的结果就是发生在数据库上的更改顺序与远端复制数据库上的更改顺序需要保持完全同步。

Oracle,MySQL 和PostgreSQL都包括用于给备用的复制数据库传输日志的日志传输协议。Oracle还把日志产品化为一个通用的数据订阅机制,这样非Oracle数据订阅用户就可以使用XStreams和GoldenGate订阅数据了,MySQL和PostgreSQL上的类似的实现则成为许多数据结构的关键组件。
正是由于这样的起源,机器可识别的日志的概念大部分都被局限在数据库内部。日志用做数据订阅的机制似乎是偶然出现的,不过要把这种 抽象用于支持所有类型的消息传输、数据流和实时数据处理是不切实际的。

分布式系统日志

日志解决了两个问题:更改动作的排序和数据的分发,这两个问题在分布式数据系统里显得尤为重要。协商出一致的更改动作的顺序(或者说保持各个子系统本身的做法,但可以进行存在副作用的数据拷贝)是分布式系统设计的核心问题之一。

以日志为中心实现分布式系统是受到了一个简单的经验常识的启发,我把这个经验常识称为状态机复制原理:如果两个相同的、确定性的进程从同一状态开始,并且以相同的顺序获得相同的输入,那么这两个进程将会生成相同的输出,并且结束在相同的状态。

这也许有点难以理解,让我们更加深入的探讨,弄懂它的真正含义。

确定性意味着处理过程是与时间无关的,而且任何其他“外部的“输入不会影响到处理结果。例如,如果一个程序的输出会受到线程执行的具体顺序影响,或者受到gettimeofday调用、或者其他一些非重复性事件的影响,那么这样的程序一般最有可能被认为是非确定性的。

进程状态是进程保存在机器上的任何数据,在进程处理结束的时候,这些数据要么保存在内存里,要么保存在磁盘上。

以相同的顺序获得相同输入的地方应当引起注意-这就是引入日志的地方。这儿有一个重要的常识:如果给两段确定性代码相同的日志输入,那么它们就会生成相同的输出。

分布式计算这方面的应用就格外明显。你可以把用多台机器一起执行同一件事情的问题缩减为实现分布式一致性日志为这些进程输入的问题。这儿日志的目的是把所有非确定性的东西排除在输入流之外,来确保每个复制进程能够同步地处理输入。

当你理解了这个以后,状态机复制原理就不再复杂或者说不再深奥了:这或多或少的意味着“确定性的处理过程就是确定性的”。不管怎样,我都认为它是分布式系统设计里较常用的工具之一。

这种方式的一个美妙之处就在于索引日志的时间戳就像时钟状态的一个副本——你可以用一个单独的数字描述每一个副本,这就是经过处理的日志的时间戳。时间戳与日志一一对应着整个副本的状态。

由于写进日志的内容的不同,也就有许多在系统中应用这个原则的不同方式。举个例子,我们记录一个服务的请求,或者服务从请求到响应的状态变化,或者它执行命令的转换。理论上来说,我们甚至可以为每一个副本记录一系列要执行的机器指令或者调用的方法名和参数。只要两个进程用相同的方式处理这些输入,这些进程就会保持副本的一致性。

一千个人眼中有一千种日志的用法。数据库工作者通常区分物理日志和逻辑日志。物理日志就是记录每一行被改变的内容。逻辑日志记录的不是改变的行而是那些引起行的内容被改变的SQL语句(insert,update和delete语句)。

分布式系统通常可以宽泛分为两种方法来处理数据和完成响应。“状态机器模型”通常引用一个主动-主动的模型——也就是我们为之记录请求和响应的对象。对此进行一个细微的更改,称之为“预备份模型”,就是选出一个副本做为leader,并允许它按照请求到达的时间来进行处理并从处理过程中输出记录其状态改变的日志。其他的副本按照leader状态改变的顺序而应用那些改变,这样他们之间达到同步,并能够在leader失败的时候接替leader的工作。

日志

为了理解两种方式的不同,我们来看一个不太严谨的例子。假定有一个算法服务的副本,保持一个独立的数字作为它的状态(初始值为0),并对这个值进行加法和乘法运算。主动-主动方式应该会输出所进行的变换,比如“+1”,“*2”等。每一个副本都会应用这些变换,从而得到同样的解集。主动-被动方式将会有一个独立的主体执行这些变换并输出结果日志,比如“1”,“3”,“6”等。这个例子也清楚的展示了为什么说顺序是保证各副本间一致性的关键:一次加法和乘法的顺序的改变将会导致不同的结果。

日志

分布式日志可以理解为一致性问题模型的数据结构。因为日志代表了后续追加值的一系列决策。你需要重新审视Paxos算法簇,尽管日志模块是他们最常见的应用。 在Paxos算法中,它通常通过使用称之为多paxos的协议,这种协议将日志建模为一系列的问题,在日志中每个问题都有对应的部分。在ZAB, RAFT等其它的协议中,日志的作用尤为突出,它直接对维护分布式的、一致性的日志的问题建模。

我怀疑的是,我们就历史发展的观点是有偏差的,可能是由于过去的几十年中,分布式计算的理论远超过了其实际应用。在现实中,共识的问题是有点太简单了。计算机系统很少需要决定单个值,他们几乎总是处理成序列的请求。这样的记录,而不是一个简单的单值寄存器,自然是更加抽象。

此外,专注于算法掩盖了 抽象系统需要的底层的日志。我怀疑,我们最终会把日志中更注重作为一个商品化的基石,不论其是否以同样的方式 实施的,我们经常谈论一个哈希表而不是纠结我们 得到是不是具体某个细节的哈希表,例如线性或者带有什么什么其它变体哈希表。日志将成为一种大众化的接口,为大多数算法和其实现提升提供最好的保证和最佳的性能。

变更日志101: 表与事件的二相性。

让我们继续聊数据库。数据库中存在着大量变更日志和表之间的二相性。这些日志有点类似借贷清单和银行的流程,数据库表就是当前的盈余表。如果你有大量的变更日志,你就可以使用这些变更用以创建捕获当前状态的表。这张表将记录每个关键点(日志中一个特别的时间点)的状态信息。这就是为什么日志是非常基本的数据结构的意义所在:日志可用来创建基本表,也可以用来创建各类衍生表。同时意味着可以存储非关系型的对象。

八卦

这个流程也是可逆的:如果你正在对一张表进行更新,你可以记录这些变更,并把所有更新的日志发布到表的状态信息中。这些变更日志就是你所需要的支持准实时的克隆。基于此,你就可以清楚的理解表与事件的二相性: 表支持了静态数据而日志捕获变更。日志的魅力就在于它是变更的完整记录,它不仅仅捕获了表的最终版本的内容,它还记录了曾经存在过的其它版本的信息。日志实质上是表历史状态的一系列备份。

这可能会引起你对源代码的版本管理。源代码管理和数据库之间有密切关系。版本管理解决了一个大家非常熟悉的问题,那就是什么是分布式数据系统需要解决的— 时时刻刻在变化着的分布式管理。版本管理系统通常以补丁的发布为基础,这实际上可能是一个日志。您可以直接对当前 类似于表中的代码做出“快照”互动。你会注意到, 与其他分布式状态化系统类似,版本控制系统 当你更新时会复制日志,你希望的只是更新补丁并将它们应用到你的当前快照中。

最近,有些人从Datomic –一家销售日志数据库的公司得到了一些想法。这些想法使他们对如何 在他们的系统应用这些想法有了开阔的认识。 当然这些想法不是只针对这个系统,他们会成为 十多年分布式系统和数据库文献的一部分。

这可能似乎有点过于理想化。但是不要悲观!我们会很快把它实现。


以“ 云计算大数据 推动智慧中国 ”为主题的 第六届中国云计算大会 将于5月20-23日在北京国家会议中心隆重举办。产业观察、技术培训、主题论坛、行业研讨,内容丰富,干货十足。票价优惠,马上 报名

将RichTextBox 之中被选取的内容复制到剪贴簿-VB资料 将我的程序的文本直接送到WORD中(不用粘贴)-VB资料 开启文件属性窗口 -VB资料 快速读取 TextBox 第 N 行的资料 -VB资料 快速选择里List全部项目-VB资料 VB利用 App.Path 读取「应用程序所在之目录」 VB利用 EM_LINESCROLL 信息控制 TextBox 的卷动。 命名的技巧 -VB资料 目录所占的字节数-VB资料 VB判断文件是否在IE的缓存中 屏蔽文本框的右键菜单-VB资料 VB取得长文件名 VB取得临时文件名 VB取得某个目录底下所有文件大小总和 VB取得文件的扩展名 VB取得文件内容 确定 TextBox 有几行-VB资料 确定是 WINDOWS 的可执行文件-VB资料 让打印机只打印一行-VB资料 VB如何把批处理文件转换成EXE文件? VB如何调用 Office VB如何将文件删除到回收站 VB如何快速移动文件? VB如何让文本框输入完后,直接跳入下一行? VB如何使用vb取得一个文件的控制权 VB如何使用文件复制对话框? VB如何使用资源文件 VB如何用Dir()函数来列出C下所有TMP文件并且用文本框输出 VB如何在 VB 中使用 Winzip 来压缩文件? VB如何在DOS程序结束执行时,自动将其关闭? VB如何在VB中实现Undo(撤消)功能? 请问各位高手,有没有现成的软件代码?可不可有借来看一下。 如何从delphi中调用word文档 如何察看当前数据库内都有哪些表??? 大家都来看看这个奇怪的问题,好像是算法的问题又不像。 怎么今天一关闭IE窗口,就要求我发错误信息到微软,是不是网站的问题呀? 明天中國對比賽,但是不放假,怎麼辦! ∴如何改變數據窗口中編輯風格為radio的值 请大家为我们的爱祝福(我知道可能不应该发表在这里,但这里是我们的论坛) data report 问题? 怎样实现两个程序之间的相关? 如何把查询到的结果付给一个数组!再由数组调出数据显示到一个文当中? 请问奔腾3有几种封装的形式 怎么获得CPU的信息??(sysinfo.dwProcessorType不太对头!) 关于AppendMenu的问题!!! win98中的asp的运行环境是pws,那么他的最高版本是多少? 那有下载? 关于字段类型的问题 谁会用Treeview 请问哪里有数据结构的书下载???? 阿猫请进!我冤枉啊!!!!! 在delphi中如何创建线程,终止线程!我是菜鸟! 一个数据库存储图片问题 system ifle process 什么进程,怎么限制其cpu占用率--它老让我宕机,怎么整它????? 請教一個循環語句 用datareport报表控件怎样实现类似履历表的多表联合打印? 有关打印中的位置控制问题~100分~~~~~~~~~~~~~~~~ 请问如何将参数传递到层中所包含的ASP文件中如下例中的something.asp.(因本人可用分为10分,只好下次补上100分。xx) flexgrid控件中rowheihgt是什么意思?? 大家好,请问如何能让管理员远程管理linux服务器呢? 请问在delphi中,把一个窗口变成一个图标放在任务栏右角上,要用到什么函数。 那位有用delphi开发的进销存管理系统的源代码借我参考一下。高分酬谢!!! Phyon net_lover请看 有人说是没有设置sql server的权限,可是该怎么设置呢 我对好女人的看法,欢迎大家提意见! 设置BDE 关于移动的label的问题???? 版主.... sql触发器小问题 谁能帮我解释一下运行时 list index out of bounds(0)这句语句的意思 在一些资料上看到"光栅数据"(raster data)是甚莫数据?与bitmap有何关系? HELP HELP! DataSet中的Tables?? 在一些资料上看到"光栅数据"(raster data)是甚莫数据?与bitmap有何关系? 高手请帮忙---无法删除文件 如何在DELPHI中处理MS Access中的自动编号字段 300分请教:求一公钥/私钥的加密算法 用VB打包的程序未何不能在98下使用 怎么样才能把新闻从一个网站A捉到一个网站B里? 高手进来帮忙! bcb如何创建数据库访问日志? 高手来帮忙 请教:java转换成unicode的方法 净水器有哪些技术及怎么区分到底是超滤的好还是反渗透的好呢? 苯与液溴在铁粉(实为FeBr3)催化条件下的反应为什么实质是FeBr3 现在我国对全球变暖做了些什么呢?我们又能做些什么呢?我们又能做些什么呢? 甲,乙两地相距900km,一列货车和一列客车分别同时从甲,乙两地相对开出.货车每小时行80km,客车每小时行120km,经过多少小时两车可在途中相遇的? 客车从甲地到乙地需6小时,货车需8小时,同时从两地相对出发,相遇时货车行了240千米.甲乙两地相距多少? 生物——实验证明修正液对人体有害材料:小白鼠6只,修正液,白鼠的食物——米饭,水和装鼠的笼子 ______________________________ 做出假设:______________________________ __________________________________________ 7.4v输入.二个led串联并加一棵68Ω电阻 问限流电阻是几w〔led总数量是122棵〕 LED是高亮15000CDM-18000CDM电压是3.0-3.67.4v输入.二个led串联并加一棵68Ω电阻 问限流电阻是几w〔led总数量是122棵某中需 为什么改变小车质量不需要重新平衡摩擦力有公式的 生物实验只拿一个生物做实验有什么坏处 在一个泡酒方里面有:气桃子,气笋子,气杏子,气柑子是什么? 一汽车的额定功率为P,向东运动,受到向的力F和摩擦力,如何求最大速度 锌和盐酸反应生成氢气和氯化锌.实验室用3.7g锌与足量的盐酸反应,可制的氢气和氯化锌的质量各是多少?很多的答的一点都不详细而且答案还不一样 欧柏数字显示表的显示驱动电路中限流电阻的主要作用是什么?若不用限流电阻,则会出现什么? 生物醇油是真的吗使用时温度能达到多少度对人体有害吗广告免进 锌和盐酸反应生成氢气和氯化锌.实验室里用3.7g锌和足量的盐酸反应,可制的氢气和氯化锌的质量各是多少?初入化学界,请把格式写好. 爽气这个词什么意思啊 为什么乙醛和氢氧化铜的反应要在碱性条件下进行? 锌和盐酸反应生成氢气和氯化锌 ,实验室里用3.7g锌和足量的盐酸反应,可制取氢气和氯化锌的质量各是多少? 甲乙两地相距520千米,货车从甲地开往乙地要8小时,客车从乙地开往甲地要10小时,两车同时从甲乙两地相向而行,经过几小时两车相距52千米? 电阻标称功率的W数,是足额的吗我要用1/4W的电阻,实际使用时,其功率最大可以高于还是低于它的标称功率.可以超过或低于多少 乙醛和新制的氢氧化铜的反应为什么在碱性环境中? 甲乙两地相距520千米,货车从甲城到乙城需要8小时,客车从乙城行至甲城需要10小时,两车同时从两地出发,相向而行.几小时后两车还相距52千米? 爽气这个词什么意思啊如题 谢谢了 锌 铝 镁 活动性顺序现有锌粉 镁粉 和铜粉 要研究他们的活动性顺序 需要的试剂A 硝酸银溶液 B 氯化镁溶液 C 硫酸铜溶液 D 硫酸锌溶液 C D中选哪个 我觉得都对啊C 硫酸铜可以先和ZN反应 得出 自来水净水器哪个牌子好?哪种类型好? 那朋友可以告知怎么样求电阻(W)数 设计实验比较镁铜锌的活动性.如果把氢也放入其中,应如何排列? 由于p=FV,当机车的输出功率一定,而速度很小时,它的牵引力不就无穷大了吗? 离开武汉久了,都看不懂武汉话了. 全球变暖将如何影响中国 人们把这种不玻璃叫做“自动窗帘”,引号的作用是什么噪音像一个来无影去无踪的“隐身人”.引号的作用是什么看你干的“好事”,让我的功夫全废了.引号的作用是什么人们把这种玻璃叫做 “闰气”这个词是什么意思?如题 多重含义更好 为什么食物燃烧后会产生水 【 】变色玻璃会调节室内的光线,【 】人们把这种玻璃叫做“自动窗帘”【 】这里填关联词语 镜子的问题,和汽车后车镜的问题两个镜子照自己哪个更真实? 全球变暖将如何影响中国全球气温变暖将怎样影响中国的阅读理解.1对我国生产,资源产生有哪些影响.2分析第二段使用的说明方法及作用. 一列客车从甲地开往乙地,同时一列货车从乙地出发开往甲地.12小时后客车距乙地还有1/9的的路程...今晚一列客车从甲地开往乙地,同时一列货车从乙地出发开往甲地.12小时后客车距乙地还有1/ 客车从甲地开往乙地需要8小时,货车从乙地开往甲地需10小时,两车分别从甲乙两地同时相向开出,客车中途因故停开2小时后继续行驶,货车从出发到相遇共用多少小时? 什么东西在水里会飘, 用气组词最好是两字的,越多越好, 客车从甲地到乙地要6小时;货车从乙地到甲地要8小时.两车从甲,乙两地出发,相向而行,3小时后能否相遇? 全球变暖对中国有何影响? 用"气"的组词能表达人的一些情绪化的“气”字组词,如怨气、怒气.与人的有关气组词就行了……还 有个是鬼怨气最后形成那个叫什么 客车与货车从甲乙两地相向而行,12小时相遇,相遇之后,客车8小时到达乙地,问货车多少小时到达甲地? 如何才能让水燃烧?怎么做才可以让水燃烧?注意:我说的是让水本身燃烧,不是借助别的化学药剂撒在水上然后去燃烧其化学药剂,看似吧水点燃了,而是水这种物质自己燃烧.谁知道? 气怎么组词好像有一个气lei lei怎么写 I=U/R的话当电阻一定时,电压升高的时候,电流也会增大.为什么电阻能限流呢?还有电阻越大发热越多,W=U的平方/R,那一个1000欧姆的电阻在电流100微安电路中的耗能就好大了,而有的电路中有好多 水要怎米哦 才能燃烧 、、 一个水池,甲、乙两个水管同时打开,5小时可以灌满全池;如果甲管打开8小时后关闭,然后打开乙管,再工作3小时也可以灌满全池.如果甲先工作2小时,然后关闭,乙管再工作几小时,可以灌满全池? 词语“同气”是指什么关系 如何让水燃烧 一个水池,甲乙两个水管同时打开,5小时可以灌满全池,如果甲管打开8小时后关闭,然后打开乙管,在工作3小时也可以灌满全池,如果甲管先工作2小时,然后关闭,乙管在工作几小时,能灌满全池 年什么气什么词语 锌和稀盐酸反应时反应速度为什么会变化 R 是限流电阻.这个电路的输出电流很小,它的输出电压等于稳压管的稳定电压值 VZ.限流电阻的作用? 液溴和苯在铁粉存在下制溴苯 是吸热反应? 铝和锌可以用稀盐酸来区别么 不同类型净水器的功能有什么区别 苯与液溴混合后撒入铁粉方程式苯与液溴混合后撒入铁粉,有没有反应方程式? 20g锌和20g铝分别与100g7.3%的稀盐酸反应后生成氢气质量之比?20g的锌和20g铝与足量7.3%稀盐酸反应生氢气之比?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘