我所读过的最好的一篇分布式技术文章 学习笔记:The Log( 六 )


非常多人可能觉得log系统在分布式系统中是个非常慢、重型开销的活儿,而且仅用来处理一些相似于更适合处理的元数据等信息 。
可是如今(注:2013年),在kafka中每天处理600亿条不同的消息写入(假设算数据中心的镜像的话 。那就是几千亿条写入) 。
Jay哥他们怎么做到的呢?
1) 对log进行切割( the log)
2) 通过批量读写优化吞吐量
3) 避免不必要的数据拷贝
通过将log切为多个来提供扩展能力:
1) 每一个都是有序的log,可是之间没有全局的顺序 。
2) 将消息写入哪个全然由写入者控制 。通过依照某种类型的key(如)进行切割 。
3) 切割使得log的附加操作 。能够不用在分片()之间进行协调就进行 。同一时候,保证系统的吞吐量和kafka集群的规模呈线性关系 。
4) 尽管没有提供全局顺序(实际上消费者或者订阅者成千上万,讨论它们的全局顺序一般没有啥价值),可是kafka提供了这样一种保证:发送者依照什么顺序将消息发给某个,从这个递交出去的消息就是什么顺序(什么顺序进,什么顺序出) 。
5) 每一个都依照配置好的数目进行复制 。假设一个节点挂了,其他的节点会成为新的 。
6) 一条log 。同文件系统一样 。线性的读写模式可被优化,将小的读写log能够组成更大的、高吞吐量的操作 。Kafka在这件事上做的非常猛 。
批处理用在了各种场景之下 。比方将数据发送到服务端、将数据写入磁盘、之间的数据复制、将数据传送给消费者,以及确认提交数据等场景 。
7) 最后,kafka在内存log、磁盘log、网络中发送的log上,採用了非常easy的二进制格式 。以利于利用各种优化技术 。比方零拷贝传输数据技术(zero-copy data ) 。
诸多的优化技术,汇聚起来 。能够让你即使在内存爆满的情形下 。也能依照磁盘或网络能提供的最大能力进行数据读写 。
2.8 Logs和实时处理
你以为Jay哥提供了这么个漂亮的方法把数据复制来复制去就完了?
你!
错!了!
Log是流的还有一种说法 。logs是流处理的核心 。
2.8.1 什么是流处理
Jay哥觉得:
1)流处理是连续数据处理的基础设施 。
2)流处理的计算模型,就如同或其他分布式处理框架一样,仅仅是须要保证低延迟 。
3)批处理式的收集数据模式 。导致了批处理式的数据处理模式 。
4)连续的收集数据模式,导致了连续的数据处理模式 。
5)Jay哥讲了个美国人口普查的方式来解释批处理 。
在 。不管是活动数据还是数据库的变化 。都是连续的 。
批处理按天处理数据,和连续计算将窗体设为一天雷同 。

我所读过的最好的一篇分布式技术文章  学习笔记:The Log

文章插图
所以,流处理是这样一种过程:
6)在处理数据时,带了一个时间的概念,不须要对数据保持一个静态的快照,所以能够在用户自己定义的频率之下 。输出结果,而不必等数据集到达某种“结束”的状态 。
7)从这个意义上讲 。流处理是批处理的一种泛化,而且考虑到实时数据的流行程度,这是一种极其重要的泛化 。
8)很多商业公司无法建立流处理引擎,往往由于无法建立流数据收集引擎 。
9)流处理跨越了实时响应式服务和离线批处理的基础设施之间的鸿沟 。
10)Log系统,攻克了非常多流处理模式中的关键问题,当中最大的一个问题就是怎样在实时的多个订阅者模式下 。提供可用数据的问题(流数据收集) 。
2.9 数据流图谱
流处理中最有趣的地方在于 。其拓展了什么是数据源(feeds)这一概念 。