/images/hugo/avatar.png

12. 流处理系统

派生数据

1. 流处理系统

前面讨论的批处理系统存在一个重要的假设: 输入是有界的,是已知的有限大小,所以批处理知道何时读完他们。比如MapReduce 核心的排序操作必须读取整个输入,然后才开始生成输出。

11. 批处理系统

派生数据

1. 组合的数据系统

前面我们讨论了分布式系统所有主要注意事项,但是这些讨论都只包含一个数据库。事实上数据系统是复杂的,通常需要以多种方式访问和处理数据,并且一个数据库往往无法同时满足所有不同的需求。因此应用程序需要使用若干不同的数据存储区、索引、高速缓存、分析系统等的组合,并实现数据从一个存储系统移动到另一个存储系统。

10. 一致性与共识

一致性与共识

1. 共识算法的概述

本节我们将讨论构建容错式分布式系统的相关算法和协议。这里我们假设第 8 章中所有的故障都可能发生: 网络会丢失、顺序紊乱、重复发送或延迟;时钟也有一定偏差,节点可能发生暂停甚至随时崩溃。为了构建容错系统,最好先建立一套通用的抽象机制与之对应的技术保证,这样只需实现一次,其上的各种应用程序都可以安全的信赖底层的保证。这与引入事务是一样的道理。

9. 分布式系统的挑战

分布式系统面临的挑战

1. 分布式系统中的故障

在分布式系统中,故障来自于下面的方方面面:

  1. 网络分区不可避免 – 网络不可靠
  2. 时钟和时序问题,时钟无法精确同步 — 时钟不可靠
  3. 分布式系统中的一个节点必须假设,执行过程中的任何时刻都可能被暂停相当长一段时间,包括运行在某个函数中间。暂停期间,整个集群其他部分都照常运行,甚至会一致将暂停的节点宣告为故障节点,最终暂停的节点可能会回来继续执行,除非再次检查时钟,否则对刚刚过去的暂停毫无意识

让系统容忍失效并不容易,在典型的分布式环境下,没有全局变量,没有共享内存,没有约定的尝试或其他跨节点的共享状态。节点甚至不太清楚现在的准确时间。信息的流动只能通过不可靠的网络来发送。

8. 事务

事务

1. 为什么需要事务

事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑单元,要么全部成功(提交)、要么失败(中止或回滚)。如果失败,应用程序可以安全地重试。这样无需担心部分失败的情况。事务存在的目的是简化应用层的编程模型。有了事务,应用程序可以不用考虑某些内部潜在的错误以及复杂的并发性问题,这些都交给数据库负责处理(称之为安全性保证)。

7. 分区

数据分区

1. 分区

分区的存在为了存储海量数据集或者分摊非常大的查询压力。分区通常是这样定义的,每一条数据(记录)只属于某个特定分区。每个分区都可以视为一个完整的小型数据库。采用数据分区通过将负载分摊到更多的机器上来提高系统的可扩展性。分区和复制通常结合使用,即每个分区在多个节点上都存有副本。