何为分布式系统

分布式是个很大的概念和领域,它涉及到众多相关的知识,比如分布式锁,分布式事务,消息机制,数据库分片,复制,容灾,分布式文件系统等等。那么它为什么值得我们研究呢?以及未来还会有哪些发展趋势,和其他领域的知识有哪里是相通的呢?这篇文章将给你介绍一下。说起分布式,大家可能最熟悉不过的就是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来管理metadata2 文件使用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模型框架,在支持并发的方面上更上一个台阶。分布式管理留着下次再更新。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180821G07NNE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券