本文来自作者在GitChat(ID:GitChat_Club)上分享「如何学习分布式系统?」,优快云独家合作发布。
分布式系统在互联网公司中的应用已经非常普遍,开源软件层出不穷。hadoop生态系统,从hdfs到hbase,从mapreduce到spark,从storm到spark streaming, heron, flink等等,如何在开源的汪洋中不会迷失自己?本文将从基本概念、架构并结合自己学习工作中的感悟,阐述如何学习分布式系统。由于分布式系统理论体系非常庞大,知识面非常广博,笔者能力有限,不足之处,欢迎讨论交流。
常见的分布式系统分为数据存储系统如hdfs,hbase;数据处理计算系统如storm、spark、flink;数据存储兼分析混合系统,这类系统在数据存储的基础上提供了复杂的数据搜索查询功能,如elastic search、druid。对于存储兼计算的系统,我们仍然可以分开分析,所以本文会从数据存储和计算两种系统来论述。
文章的大致结构:第一部分,分布式系统的基本概念;第二、三部分分别详细论述数据存储和数据计算系统;最后一部分总结。
概念
-
分布式系统:每个人都在提分布式系统,那么什么是分布式系统?其基本概念就是组件分布在网络计算机上,组件之间仅仅通过消息传递来通信并协调行动。
A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages. (摘自分布式系统概念和设计)
-
节点:节点可以理解为上述概念提到的组件,其实完成一组完整逻辑的程序个体,对应于server上的一个独立进程。一提到节点,就会考虑节点是有状态还是无状态的?判断标准很简单,该独立节点是否维护着本地存储的一些状态信息,或者节点是不是可以随时迁移到其他server上而保持节点的行为和以前一致,如果是的话,则该节点是无状态,否则是有状态的。
-
异常:异常处理可以说是分布式系统的核心问题,那么分布式异常处理相对于单机来说,有什么不同呢?在单机系统中,对于程序的处理结果是可以预知的,要么成功,要么失败,结果很明确。可在分布式环境中,处理结果除了明确返回成功或失败,还有另外一种状态:超时,那超时意味着处理结果完全不确定,有可能成功执行,也有可能执行失败,也有可能根本没执行,这给系统开发带来了很大的难度。其实各种各样的分布式协议就是保证系统在各种异常情形下仍能正常的工作,所以在学习分布式系统时,要着重看一下文档异常处理fault-tolerance章节。
-
CAP理论:学习分布式系统中需要重要理解的理论,同时在架构设计中也可以用到这个理论,例如在一些情形下我们可以通过降低一致性来提高系统的可用性,将数据的每次数据库更新操作变成批量操作就是典型的例子。
CAP理论,三个字母代表了系统中三个相互矛盾的属性:
-
C(Consistency):强一致性,保证数据中的数据完全一致;
-
A(Available):在系统异常时,仍然可以提供服务,注:这儿的可用性,一方面要求系统可以正常的运行返回结果,另一方面同样对响应速度有一定的保障;
-
P(Tolerance to the partition of network ):既然是分布式系统,很多组件都是部署在不同的server中,通过网络通信协调工作,这就要求在某些节点服发生网络分区异常,系统仍然可以正常工作。
CAP 理论指出,无法设计一种分布式协议同时完全具备CAP属性。
从以上CAP的概