分布式的如今和将来

分布式是个很大的概念和领域,它涉及到众多相关的知识,好比分布式锁,分布式事务,消息机制,数据库分片,复制,容灾,分布式文件系统等等。
那么它为何值得咱们研究呢?以及将来还会有哪些发展趋势,和其余领域的知识有哪里是相通的呢?这篇文章将给你介绍一下。

提及分布式,你们可能最熟悉不过的就是2PC和3PC了,2PC即二阶段提交,它是为了解决分布式环境下,数据的强一致性衍生出的概念。具体实现原理是第一阶段用于确认每一个节点是否都处于准备阶段,确认完成后再进行提交。这样虽然保证了每一个节点数据的强一致性,却带来了吞吐量的降低和阻塞,并且还会有问题。假如在第一阶段完成以后,中心节点挂了,那么其余节点返回的状态必然得不到确认,那也就无从谈及下一阶段的事情了。
后来又衍生出了著名的Raft和Paxos,利用选举和提案的方法才解决了这个问题,可是性能损耗过大致使它不能应用于高并发且性能要求高的场景之下。
这些都属于为了知足CAP原理而创造出的理论,而分布式领域还有一个很重要的原理就是BASE,也就是最终一致性原理。它只须要保证在分布式环境下,数据的最终一致性就能够,能够忍受一时的不一致,就比方支付订单后,客户只须要等待东西送上门便可,而这背后的银行入帐,减库存,记录订单,打印发票,配送服务对接这些都不须要马上就让客户看到,能够“缓慢”在后台进行。

以后可能会想到redis实现的分布式锁,其实相比较于数据库锁,zk的分布式锁,redis的实现比较简单,主要实现了加锁和解锁的是同一个requestId。

固然还有数据库领域的水平扩展和垂直扩展,也属于分布式的领域问题,典型的当属MySQL的水平扩展,咱们都知道其分为分库,复制以及sharding。

总结的话,分布式系统分为三个方向:
1 分布式存储
2 分布式计算
3 分布式管理

***分布式存储***
分布式存储中又分为几个子方向:
1 结构化存储
2 非结构化存储
3 半结构化存储
4 In-memory存储

除了这四个子方向外,分布式存储还有一系列算法和理论支撑,例如前文提到的Paxos,CAP,ConsistentHash,Timing,2PC,3PC等等。
结构化存储最多提到的就是关系型数据库(RDBMS)。你们最熟悉的就是MySQL,PostgreSQL了,然而结构化存储的可扩展性都不是很好。
非结构化存储最典型的系统就是分布式文件系统,好比谷歌推出的GFS,主要思想是:
1 用master来管理metadata
2 文件使用64MB的chunks来存储,而且在不一样的server上保存多个副本
3 自动容错,自动错误恢复
谷歌设计其的目的就是为了存储海量日志和网页等文本信息,并对其进行批量处理。虽然分布式文件系统可扩展性和吞吐量都很是好,但他们不支持随机访问,只能对文件进行追加操做。这使得非结构化存储很难面对低延迟,实时性强的应用。
半结构化存储是为了解决非结构化存储随机访问性能差的问题。其中以NoSQL、K-V Store、thrift(一种对象存储)为表明。NoSQL不只具有分布式文件系统的可扩展性,并且延续告终构化存储的随机访问能力,能够简单K-V进行存储,而摒弃了SQL查询和ACID事务,比较表明的产品是谷歌的Bigtable,Amazon的Dynamo,HBase等。他们的底层都是采用比较成熟的存储引擎,好比LevelDB,底层数据结构采用LSM-tree。
最后讲到的是In-memory存储。因为业务并发愈来愈高以及低延迟的需求,同时内存价格不断降低,基于内存的存储系统也开始普及。比较出名的是Memecached,Redis。主要目的是为基于磁盘的存储系统作cache。
另外须要提到的一点是,前文说过结构化存储在可扩展性方面作的不是太好,非结构化存储又不具有关系模型。综合这两点,在2012年谷歌发表了Spanner以及2013年的F1奠基了NewSQL的基础,但打造这样的NoSQL和RDBMS的融合的大型数据中心必须获得大公司的支持。

***分布式计算***

那么首先思考这个问题:分布式计算和并行计算有什么区别吗?
一句话归纳:并行计算追求的是速度,而分布式计算追求的是数据量
分布式计算能够分为如下几个方向:
1 传统基于msg的系统
2 MapReduce-like系统
3 图计算系统
4 基于状态的系统
5 Streaming系统

基于msg的系统比较有表明性的要属MPI(Message Passing Interface)。它除了提供消息传递接口以外,其框架还实现了资源管理和分配以及调度的功能。
MR-like系统又叫作dataflow系统,以Hadoop和Spark为表明。这一类系统的特色是将计算抽象称为high-level operator好比map,reduce,filter等等。它比MPI最有优点的地方就是他具有比较完备的容错机制,在任什么时候候的出错系统框架均可以从上一个状态恢复。但缺点也比较明显,支持的机器学习模型一般都不是很大且集群效率很低。
最后要讲的是Streaming系统,这里比较典型的系统是Storm、Spark和Flink等。Flink经过jobClient、jobManager和taskManager实现了任务在工做流中的状态变换和控制,以及工做流程的调度,效率很高,并且在最近的发布版本中引入了Akka做为其Actor模型框架,在支持并发的方面上更上一个台阶。
分布式管理留着下次再更新。