大家普遍对分布式系统的印象是难设计,难理解,难操作,而集中式系统相对更加简洁易懂。那么,为什么我们需要分布式系统呢?
分布式系统提供更好的可用性。集中式系统的可用性受制于于运行它的硬件的可用性,尽管如今的高端硬件非常可靠,结合对机房的科学管理,服务器的年故障率 (AFR)会达到个位数,但是,依旧存在限制。第一,集中式系统中单机不可用会导致系统整体不可用;第二,系统吞吐量受限于单机的计算能力。分布式系统消除这两个限制的方法是用多机来存储数据的多个副本,负责更新的客户端会同时更新数据的多个副本。分布式系统可以避免任何一个服务器成为单点故障,修复系统的过程对于生产环境来说是无感知的。分布式系统也可以放置在更靠近需要它们的用户的位置,更方便客户端访问,提高了网络环境的可用性。尽管有CAP定理的限制,分布式系统的灵活性在很多场景仍然优于集中式系统。
分布式系统提供更好的持久性。持久性是指在一段时间内保持数据不丢失的能力。来自Backblaze的数据表明一个机房中一年大约1.6%的数据会丢失。对于某些场景来说,这个持久性就足够了。但对于大部分企业来说,事实并非如此。集中式系统有两种选择。第一是RAID,使用多个磁盘,并在它们发生故障时替换它们。RAID 只能防止一些驱动器故障,无法应对大规模故障。第二是备份。备份更可靠,但要求也更多。备份要求您选择两件事:运行备份的频率(频率越低恢复的数据越不可靠,频率越高消耗的资源越高)以及还原备份所需的时间。对于个人笔记本电脑上的东西,每日备份和数小时的还原就足够了。但对于业务关键型数据,显然不行。分布式存储系统将一段数据的多个副本分散在不同地方,从而在成本、恢复时间、持久性等方面提供了极大的灵活性。通过合理构建,可以对故障具有极高的容忍度。
分布式系统提供更好的可扩展性。可扩展性描述的是通过增减硬件来调节系统某些指标的能力。例如,通过增加磁盘来提高存储系统的容量,通过增加节点来增加存储系统的吞吐率。无状态系统相对容易扩展,像HTTP负载均衡器这样的基本技术非常适合很多用例。有状态系统更难扩展,因为需要决定如何传播状态,并且需要弄清楚如何将用户发送到正确的位置以获取状态。这两个问题是大部分分布式系统文献的核心,几乎每天都有新的解决方案。好消息是,许多解决方案确实很好。它们可作为服务(如在云中)提供,也可作为软件(开源和其他方式)提供。用户可以直接使用这些方案而不用重头去研究。
分布式系统提供更好的效率。工作负载经常是波动的。计算机喜欢按小时、每天或每分钟做事。但是人类的节奏不是这样的,如睡觉和放假,有些人只想在工作日的白天做事,有些人喜欢在晚上或深夜做事。这一切都意味着大多数系统上的负载会随机或周期性地变化。大型分布式系统,如云,可以自动分配负载,并按需付费。比较影响成本的所有因素时,会发现计算机保持忙碌与保持空闲相比,耗费的成本差不多,但产出却天差地别。这意味着,让计算机尽可能忙碌具有很大的经济意义,集中式系统很难做到这一点。
例如,内容存储网络CSN的核心就是一个横跨全国的分布式系统,它可以在任何地点提供高可用、强一致性的存储服务。CSN将数据存储的位置信息整合成了一张分布式网:全局元数据。逻辑上单一的一张表在物理上分布存在于不同的机房,从而可以就近提供访问服务,使所有的读写请求都会就近访问离用户最近的机房,数据在本地直接返还给用户,或者通过专网从其他地方拉过来给用户。究其根本,CSN高性能、低成本,就是通过良好的分布式系统设计来实现的。