分布式数据系统 #
需要在多台机器上分布数据的原因:
- 扩展性:负载太大,单台机器无法承担,需要将负载分散至多台机器。
- 容错和高可用性:机器出现故障,我们仍然希望应用系统能够正常工作,这样就需要冗余的多机器。
- 延迟考虑:若考虑在全球范围内提供服务,方便用户就近访问,则也需要多机器集群部署应用服务。
系统扩展能力 #
当系统负载增加到需要更强的处理能力时,最简单的办法就是购买更强大的机器(垂直扩展,scale-up)。
共享内存架构(share memory arch):由一个操作系统管理更多的 CPU、内存和磁盘,通过高速内部总线使每个 CPU 都能访问所有的存储器和磁盘。所有组件的集合可以看作成一个大机器。
当然,共享内存架构的问题也很多:
- 成本增长的速度超过了线性:扩容一倍所产生的成本并不一定能带来一倍的性能收益,而且由于性能瓶颈,机器尽管拥有了两倍的性能指标,但却不一定能处理两倍的应用负载。
- 只能提供有限的容错能力:无法提供异地容错能力。
共享磁盘架构:拥有多台服务器,每台拥有独立的 CPU 和内存,而数据存储在可以共享访问的磁盘阵列上。服务器与磁盘阵列往往通过高速网络连接1。这种架构适合于数据仓库等负载,但由于资源竞争以及锁开销会限制其扩展能力。
无共享架构 #
无共享架构(share nothing),也称为水平扩展(scale-out)。在这种架构下,每个节点独立使用本地的 CPU、内存和磁盘资源。节点之间的所有协调通信全部建立在传统网络(以太网)之上,且核心逻辑主要依靠软件来实现。
无共享架构的优势:
- 不需要专门的硬件,具有较高的性价比(这其实是最大的商业优势)。
- 可以跨多个地理区域分发数据,降低用户的访问延迟。
- 提供高可用性:当整个数据中心发生灾难时还能继续工作。
- 降低服务门槛:使用云计算的部署方式,小公司也能轻松拥有跨区域的分布式架构和服务能力。
分布式无共享架构会给应用程序带来更多的复杂性,有时会限制实际可用的数据模型。只有充分理解了无共享架构,合理设计,也可以将其系统做得性能特别强大。
复制与分区 #
数据分布机制:
- 复制:多个节点上保存相同的数据副本。可以提供冗余并提高系统性能。
- 分区:一个大的数据块拆分为较小的子集(分区),不同的分区分配给不同的节点(分片技术)。
在错综复杂的分布式环境中,到处都是权衡之道(trade-off)。