一致性是非常重要的分布式技术。众所周知,分布式系统有很多特性,如可用性、可靠性等,这些特性多多少少会与一致性产生关系,受到一致性的影响。要全面研究、掌握分布式技术,一致性是绕不开的一个话题,也是最难解决的一个问题。本书主要介绍GFS、HDFS、BigTable、MongoDB、RabbitMQ、ZooKeeper、Spanner、CockroachDB系统与一致性有关的实现细节,以及非常重要的Paxos、Raft、Zab分布式算法;本书还介绍了事务一致性与隔离级别、顺序一致性、线性一致性与强一致性相关内容,以及架构设计中的权衡等。
从分布式技术的角度来说,本书讲解了分布式领域比较高阶的内容,但是从分布式一致性的角度来说,本书仍然是一致性的入门书。
高并发高可用系统实战||||复杂系统核心特性精解
前 言
我对一致性的研究起源于一段负责基础架构的工作经历,当时负责公司的ZooKeeper事宜,所以对ZooKeeper进行了比较深入的研究。我在阅读ZooKeeper的官方文档和与ZooKeeper相关的论文时,看到了顺序一致性和线性一致性。在此之前的工作中,我凭借多年的工作经验,每当遇到陌生的概念时,基本上都可以望文生义,很快就能体会到其中的含义。但顺序一致性和线性一致性却成了我的反例,很长时间都没有搞清楚其含义。在此之后,我在负责公司自研的一个key-value数据库时,参考了Google公司的Spanner系统,在深入研究Spanner系统时,发现该系统中也存在线性一致性的概念。所以我开始系统地研究顺序一致性和线性一致性,从而进入分布式系统一致性的领域。
在研究过程中我发现,行业内还没有一本能够理论联系实际、系统化讲解分布式系统一致性的著作。当前讲系统一致性的文献往往专注于理论的定义,而分布式系统的官方文档和相关著作对一致性又往往都是简单地一笔带过。因此,我萌生了一个想法:写一本既有实际例证又有理论定义的一致性方面的书,也就是《分布式存储与一致性》这本书。本书讲解8个分布式系统,主要关注这些系统与一致性相关的实现,并对其中一些分布式系统中用到的关键的分布式算法做了详细的讲解,力争做到把分布式系统的一致性相关内容讲透。最后再介绍几个关于一致性的理论定义,并且结合前面的实例加以分析。
在实际的工作中,一致性往往没有受到重视,行业从业人员将更多的精力放在了可用性、性能等分布式系统的特性上。的确,从所带来的影响和出现的概率上讲,可用性和性能导致的问题更大一些。而一致性问题更隐蔽,出现的概率也比较小,并且往往能通过一些简单的手段解决掉,导致对一致性的要求不是那么强烈。甚至在某些应用场景下,一致性问题是用户可以接受的。
但是,一致性仍然是非常重要的分布式技术。众所周知,分布式系统有很多特性,如可用性、可靠性、性能等,这些特性多多少少会与一致性产生关系,受到一致性的影响。要全面研究、掌握分布式技术,一致性是绕不开的一个话题,也是最难解决的一个问题。
行业内部对一致性的讨论比较少,导致很多从业者对一致性的理解比较片面,这也是因为一致性其实是非常复杂、难懂的概念,甚至有些从业者对一致性以及一致性相关理论的理解有些偏差。本书力争对一致性给出一个全面的介绍。
本书仅仅讲解分布式系统的一致性的一部分内容,也是在实际的工作中可能遇到的内容,还有很大一部分本书没有涉及——本书仅讲解7种一致性模型,但笔者所知的一致性模型就有50多种。分布式领域专家对一致性进行的非常深入的研究,本书不能完全覆盖。此外,虽然本书讲解了Spanner、CockroachDB这样的分布式系统,但是对分布式系统领域与数据库领域的交汇点,也就是分布式数据库的讲解仍然不够全面,全面的讲解需要额外阐述数据库领域的很多内容,而这些内容并未包含在本书之中,读者需要另行查看其他相关资料。
本书主要面对有志进入分布式领域或者进入分布式领域不长时间的初学者。如果你是分布式领域的老手,已经读过或研究过各种分布式系统的经典著作和典型系统,那么本书讲解的内容可能都是你熟知的。但是本书仍然有一定的阅读要求,特别是对涉及数据库领域的相关内容,铺垫较少,有一定的阅读难度。从分布式技术的角度来说,本书讲解了分布式领域比较高阶的内容,但是从分布式一致性的角度来说,本书仍然是一致性的入门书籍。
本书中对重要的概念或者定义采用黑体书写,并且在可能的情况下,同时在概念后面的圆括号中给出其英文名称,方便读者以后在扩展阅读英文文献时可以准确地建立对应关系。在之后的内容中,如果这个概念在中文材料中已经被广泛接受并且使用,则会使用其中文名称;否则,为了不产生歧义,会使用其英文名称。
本书主要讲解的是计算机技术理论,这需要较长时间的沉淀和准备,而成书比较仓促,加之一致性是分布式系统的核心特性,涉及面又比较广阔,错误之处在所难免,希望各位读者给予指正。
位置:第20页,3.1.2 HDFS的架构,图3.1
勘误内容:图中Nameonde拼写错误,应为Namenode