/images/hugo/avatar.png

9. 分布式系统的挑战

分布式系统面临的挑战

1. 分布式系统中的故障

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

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

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

8. 事务

事务

1. 为什么需要事务

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

7. 分区

数据分区

1. 分区

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

6. 复制

系统可扩展性

1. 系统的可扩展性

当负载增加需要更强的处理能力时,我们有两种扩展系统的方式:

  1. 垂直扩展: 购买更强大的机器
  2. 水平扩展: 组合更多数量的机器

垂直扩展通过共享内存和共享磁盘的方式,让操作系统管理更多的 CPU、内存和磁盘,从何获取更强劲的性能。但是这种方式有明显的缺陷:

5. 数据编码与演化

构建可适应变化的系统

1. 数据的演化

应用程序不可避免的需要随时间而变化,大多数情况下,应用程序的更改也需要更改其存储的数据: 增删字段或者以新的方式呈现数据。当数据格式或模式发生变化时,同样也需要对应用程序代码进行相应调整。

4. 数据存储和检索

数据如何存储,如何检索

1. 存储引擎

上一节我们讨论了数据模型和查询语言,即应用开发人员向数据库执行数据格式并在之后如何查询的机制。接下来我们从数据的角度在此探讨同样的问题,即如何存储输入的数据,并在收到查询请求时,如何重新找到数据。