第二部分:分布式数据
如果 多台机器 参与数据的存储和检索,会发生什么?
出于各种各样的原因,希望将数据库分布到多台机器上
- 可伸缩性:负载分散到多台计算机;
- 容错 / 高可用性:单台机器(或多台机器,网络或整个数据中心)出现故障的情况下仍然能继续工作
- 延迟:全球范围部署多个服务器,从地理上最近的数据中心获取服务。
伸缩到更高负载
最简单的方法就是购买更强大的机器(有时称为 垂直伸缩,即 vertical scaling,或 向上伸缩,即 scale up),即 共享内存架构(shared-memory architecture)。
- 问题:成本的增长速度快于负载的线性增长;提供有限的容错能力
另一种是共享磁盘架构(shared-disk architecture)“:多台具有独立处理器和内存的机器
- 数据存储在机器之间共享的磁盘阵列上,这些磁盘通过快速网络连接
- 竞争和锁定的开销限制了共享磁盘方法的可伸缩性\(^{[1]}\)
无共享架构
无共享架构\(^{[2]}\)(shared-nothing architecture,有时被称为 水平伸缩,即 horizontal scaling,或 向外伸缩,即 scaling out)
- 运行数据库软件的每台机器 / 虚拟机都称为 节点(node);
- 每个节点只使用各自的处理器,内存和磁盘,节点间使用网络进行通信和协调;
虽然分布式无共享架构有许多优点,但它通常也会给应用带来额外的复杂度,有时也会限制你可用数据模型的表达力。
- 某些情况下,一个简单的单线程程序可以比一个拥有超过 100 个 CPU 核的集群表现得更好\(^{[3]}\)
复制 vs 分区
数据分布在多个节点上有两种常见的方式:
- 复制(Replication):几个不同的节点上保存数据的相同副本,提供冗余;
- 分区 (Partitioning):将一个大型数据库拆分成较小的子集,从而不同的分区可以指派给不同的 节点(nodes,亦称 分片,即 sharding);
复制和分区是不同的机制,但它们经常同时使用。
参考文献
- Ben Stopford: “Shared Nothing vs. Shared Disk Architectures: An Independent View,” benstopford.com, November 24, 2009.
- Michael Stonebraker: “The Case for Shared Nothing,” IEEE Database EngineeringBulletin, volume 9, number 1, pages 4–9, March 1986.
- Frank McSherry, Michael Isard, and Derek G. Murray: “Scalability! But at What COST?,” at 15th USENIX Workshop on Hot Topics in Operating Systems (HotOS),May 2015.