存储 系列 分布式存储概述

...

Posted by lichao modified on September 1, 2019

数据系统

数据系统是用于数据存储和处理的工具。

系统软件核心设计目标

  1. 可靠性(容错与高可用性):容忍硬件、软件失效和人为错误。即使发生了某些错误,系统仍可以继续正常工作。
  2. 可扩展性:指负载增加时,有效保持系统性能的相关技术策略。评测负载与性能、延迟百分位数、吞吐量。
  3. 可维护性:可运维、简单和可演化性。
    1. 可运维性:方便运营团队来保持系统平稳运行
    2. 简单性:简化系统复杂性,使新工程师能够轻松理解系统。
    3. 可演化性:后续工程师能够轻松地对系统进行改进,并根据需求变化将其适配到非典型场景,也称为可延伸性、易修改性或可塑性。

系统可应对某些特定类型的错误则称为容错(Fault tolerant)或者弹性(Resilient)。 故障通常被定义为组件偏离其正常规格,而失效意味系统作为一个整体停止,无法向用户提供所需的服务。我们不太可能将故障概率降低到零,因此通常设计容错机制来避免从故障引发系统失效。 消除「复杂性」最好手段之一是抽象。一个好的设计抽象可以隐藏大量的实现细节,并对外提供干净、易懂的接口。一个好的设计抽象可用于各种不同的应用程序。这样,复用远比多次重复实现更有效率;另一方面,也带来更高质量的软件,而质量过硬的「抽象组件」所带来的好处,可以使运行其上的所有应用轻松获益。 数据模型可能是开发软件最重要的部分,它们不仅对软件的编写方式,而且还对如何思考待解决的问题都有深远的影响。

可靠性

当单台机器(或者多台,以及网络甚至整个数据中心)出现故障,还希望应用系统可以继续工作,这时需要采用多台机器提供冗余。这样某些组件失效之后,冗余组件可以迅速接管。

数据系统可靠方案-复制

复制主要指通过互联网络在多台机器上保存相同数据的副本(每个保存数据库完整数据集的节点称之为副本)。数据复制方案的好处:

  • 提供冗余,提高可用性:如果某些节点发生不可用,则可以通过其他节点继续提供数据访问服务。
  • 扩展至多台机器以同时提供数据访问服务,从而提高读吞吐量
  • 使数据在地理位置上更接近用户,从而降低访问延迟。

当有了多副本,不可避免地会引人一个问题:如何确保所有副本之间的数据是一致的?针对持续更改的数据,有三种流行的复制数据变化的方法:主从复制、多主节点复制和无主节点复制。几乎所有的分布式数据库都使用上述方法中的某一种,而三种方法各有优缺点。

复制技术存在许多需要折中考虑的地方,例如采用同步复制还是异步复制,以及如何处理失败的副本等。数据库通常采用可配置选项来调整这些处理策略,虽然在处理细节方面因数据库实现而异,但存在一些通用的一般性原则。

扩展性

当数据量或者读写负载巨大,严重超出了单台机器的处理上限,需要将负载分散到多台机器上。从单机的数据存储转向跨机器的分布式系统,这是扩展性的重要一步。系统扩展方式分为两种:

  • 垂直扩展(即升级到更强大的机器,有共享体系架构):例如共享内存架构、共享磁盘架构
  • 水平扩展(即将负载分布到多个更小的机器,无共享体系架构):每个节点独立使用本地的CPU、内存和磁盘。节点之间的所有协调通信等任务全部运行在传统网络(以太网)之上且核心逻辑主要依靠软件来实现。

共享内存架构的问题在于,成本增长过快甚至超过了线性:即如果把一台机器内的 CPU 数量增加一倍,内存扩容一倍,磁盘容量加大一倍,则最终总成本增加不止一 倍。井且由于性能瓶颈因素,这样一台机器尽管拥有了两倍的硬件指标但却不一定能处理两倍的负载。 延迟考虑: 如果客户遍布世界各地,通常需要考虑在全球范围内部署服务,以方便用户就近访问最近数据中心所提供的服务,从而避免数据请求跨越了半个地球才能到达目标。

数据扩展方案-分区

将一个大块头的数据库拆分成多个较小的子集即分区,不同的分区分配给不同的节点(也称为分片)。「分布式存储系统」对数据分区一般有两种方式:Hash 分区和 Range 分区。Range 分区能够支持更丰富的访问模式,使用起来更加灵活。

  • Hash 分区对每条数据算一个哈希值,映射到一个逻辑分区上,然后通过另外一层映射将逻辑分区映射到具体的机器上,很多数据库中间件、缓存中间件都是这样做的。这种方式的优点是数据写入一般不会出现热点,缺点是原本连续的数据经过Hash后散落在不同的分区上变成了无序的,那么,如果需要扫描一个范围的数据,需要把所有的分区都扫描一遍。
  • Range分区对数据进行范围分区,连续的数据是存储在一起的,可以按需对相邻的分区进行合并,或者中间切一刀将一个分区一分为二。业界典型的系统像HBase。这种分区方式的缺点是一、对于追加写处理不友好,因为请求都会打到最后一个分片,使得最后一个分片成为瓶颈。优点是更容易处理热点问题,当一个分区过热的时候,可以切分开,迁移到其他的空闲机器上。

更多

参考文献

字节跳动自研强一致在线 KV &表格存储实践-上篇

字节跳动自研强一致在线 KV &表格存储实践-下篇

推荐一个raft算法的动画演示,便于理解,感觉挺好玩的!