数据流(data flow)
实时计算
2.2.3 分布式系统中的logs
Log解决了两个很重要的分布式数据系统中的问题:
1) 有序的数据变化
2) 数据分布式化
所谓的状态机复制原理(State Machine Replication Principle):
如果两个确定的处理过程,从相同的状态开始,按照相同的顺序,接收相同的输入,那么它们将会产生相同的输出,并以 相
同的状态结束。
所谓确定的(deterministic),是指处理过程是时间无关的,其处理结果亦不受额外输入的影响。
可以通过非确定的例子来理解:
多线程的执行顺序不同导致不同的结果
执行getTimeOfDay()方法
其它的不能重复的处理过程
所谓状态,可以是机器上的任意数据,无论在处理结束后,是在机器的内存中还是磁盘上。
相同的输入按照相同的顺序,产生相同的结果,这一点值得引起你的注意,这也是为什么log会如此重要,这是一个直觉性的
概念:如果你将同一个log输入两个确定性的程序,它们将产生相同的输出。
在分布式系统的构建中,意识到这一点,可以使得:
让所有的机器做同样的事,规约为:
构建分布式的、满足一致性的log系统,以为所有处理系统提供输入。
Log系统的作用,就是将所有的输入流之上的不确定性驱散,确保所有的处理相同输入的复制节点保持同步。
这种方法的最妙之处在于,你可以将索引日志的时间戳,作为所有复制节点的时钟来对待:
通过将复制节点所处理过的log中最大的时间戳,作为复制节点的唯一ID,这样,时间戳结合log,就可以唯一地表达此节点的
整个状态。
应用这种方法的方式也很多:
在log中记录对一个服务的请求
在回复请求的前后,记录服务状态的变化
或者,服务所执行的一系列转换命令,等等。
理论上来讲,我们可以记录一系列的机器指令,或者所调用方法的名称及参数,只要数据处理进程的行为相同,这些进程就可
以保证跨节点的一致性。
常玩儿数据库的人,会将逻辑日志和物理日志区分对待:
物理日志:记录了所有的行内容的变化。
逻辑日志:不是记录内容的变化,而是Insert , update , delete等导致行内容变化的SQL语句。
对分布式系统,通常有两种方式来处理复制和数据处理:
1) State machine model(active – active)
2) Primary-back model (active – passive)
如下图所示: