zoukankan      html  css  js  c++  java
  • 分布式系统学习总结

    前言  

        随着大型网站的各种高斌发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题。大型网站的架构也在不断发展。提高大型网站的高可用架构,就不得不提分布式系统(Distributed Systems)。下面说一下分布式系统及其相关的概念

        在学习分布式系统之前,先了解一下与之相对应的集中式系统是什么样的。

    集中式系统

        集中式系统,主要指IBM、HP一个主机带多个终端。终端没有数据处理能力,仅负责数据的录入和输出。而运算、存储等全部在主机上进行,也就是我们平常说的单机服务器。

        集中式系统的最大特点就是不熟结构非常简单,底层一般采用IBM、HP等厂商购买的昂贵的大型主机。因此无需要考虑如何对服务进行多节点的部署,也就不用考虑各节点的分布式协作问题。但是,由于采用单机部署、和可能带来系统大而复杂、难于维护、发生单点故障(单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪)、扩展性差等问题。

        说完集中式系统,再来说一个与分布式很相似的概念-集群

    集群

        集群是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。用来提供比集中式系统更具扩展性与可用性的服务平台。集群有两个关键的特性:

    • 可扩展性,集群的性能不限于单一的服务实体,新的服务实体可以动态地添加到集群,从而增强集群的性能。
    • 高可用性,集群通过服务实体冗余使客户端免于单点故障。在集群中,同样的服务可以有多个服务实体来提供。如果一个服务实体挂了,那另一个服务实体就会接管失效的服务实体。集群提供从一个出错的服务实体切换到另一个正常的服务实体,从而增加了应用的可用性。

        为了具有可扩展性和高可用性特点,集群必须具备以下两大能力:

    • 负载均衡,能把任务交均衡地分布到集群环境下的各个服务实体
    • 错误恢复,由于某种原因,执行某个任务的资源出现故障,另一个服务实体接过哪个任务,接着执行剩下的任务

        负载均衡和错误恢复都要求各服务实体中有执行统一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息上下文必须是一样的。即,资源透明。

        实现集群务必要有一下两大技术:

    • 集群地址,集群由多个服务实体组成,集群客户端通过访问集群的集群地址获取集群内部各个服务实体的功能。维护集群地址的设置被称为负载均衡器。负载均衡器内部负责管理各个服务实体的加入和退出,外部负责集群地址相内部服务实体地址的转换。有的负载均衡器实现真正的均衡负载算法,有的只支持任务转换。只是先任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境,在那里,集群中只有一个服务实体工作,当正在工作的服务实体发生故障时,负载均衡器再把后来的任务切换到另一台服务器实体。
    • 内部通信,为了能协同工作、实现负载均衡和错误恢复,集群各个实体必须时常通信。比如,负载均衡器对服务实体心跳测试、服务实体间任务执行上下文信息的通信。

        集群主要分为三大类

    • 高可用集群(High Availability Cluster),俗称“双机热备”,就是两个节点做成的集群。
    • 负载均衡集群(Load Balance Cluster),检测集群中节点的活动状态,分摊系统的工作负载。
    • 科学计算集群(High Performance Computing Cluster),这类集群致力于提供单个计算机所不能提供的强大的计算能力。

        说完集群回到正题-分布式系统。

    分布式系统

        分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

        简单来说就是一群独立计算机集合功能对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。分布式意味着可以采用更多的普通计算机(相对昂贵的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。

        从分布式系统的概念中我们知道,各个主机之间通信和协调主要通过网络进行,所以,分布式系统中的计算机在空间上没有任何限制,这些计算机可能被放在不同的机柜上,也可能是放在不同的机房中,还可能是不同的城市,甚至是不同的国家和地区。但是,无论空间上如何分布,一个标准的分布式系统应该具备以下几个主要特征:

    • 分布性,分布式系统中的多肽计算机之间的空间位置上可以随意分布,系统中的多肽计算机之间没有主从之分,即没有控制整个系统的主机,也没有受控的从机。
    • 透明性,资源被所有计算机共享。每台计算机的用户不仅可以使用本机的资源,还可以使用本分不是系统中的其他计算机的资源。
    • 同一性,系统中的若干台计算机可以互相协作来完成一个共同的任务,或者说一个程序可以分布在计算机上并行地运行。
    • 通信性,系统中任意两台计算机都可以通过通信来交换信息。

        分布式在解决了网站的高并发问题的同时也带来了其他问题。首先,分布式的必要条件就是网络,这可能对性能甚至服务能力造成一定的影响。其次,一个集群中的服务器数量越多,服务器宕机的概率也就越大。另外,由于服务在集群中分布式部署,用户的请求只会落到其中一台机器上,所以,一旦处理不好就很容易产生数据一致性的问题。

        常用的分布式方案

    • 分布式应用和服务,讲应用和服务进行分层和分割,然后将应用和服务模块进行分布式部署。这样做不仅可以提高并发访问能力、减少数据库连接和资源消耗,还能使用不同应用复用共同的服务,使业务易于扩展。
    • 分布式静态资源,对于网站的静态资源如js、css、图片等资源进行分布式部署可以减轻应用服务器的负载压力,提高访问速度。
    • 分布式数据和存储,大型网站常常需要处理海量的数据,单台计算机往往无法提供足够的内存空间,可以对这些数据进行分布式存储。
    • 分布式计算,随着计算计算的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当changer的时间来完成。分布式计算将应用分解成许多小的部分,分配给多台计算机处理。这样可以节约整体计算时间,大大提高计算效率。

        分布式系统与集群的区别与联系

        从狭义上来说,分布式系统就是集群,它有许多与集群相似的特性,比如,由多台不同的服务器组成,资源透明,通过消息通信等。但是它又不同于集群,从结构上来说,它的结构比较松散,不像集群那样有一定组织性,分布式系统的每个节点都可以用来做集群;从部署上来说,集群是多台不同的服务器中部署相同的应用或模块,分布式则是多台不同的服务器中部署不同的应用或模块;从业务上来说,集群是讲多台服务器执行的是相同的任务,分布式系统是将一个任务分布到多台不同的服务器中,通过相互协作来完成这一任务

    CAP理论

        一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)、和分区容错性(Partition tolerance)这三项中的两项。

    image

    Consistency 一致性

        一致性指更新操作成功并返回客户端完成后,所有的节点在同一时间的数据完全一致。

    Availability 可用性

        可用性指服务一致可用,而且是正常响应

    Partion Tolerance 分区容错性

        分区容错性指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供服务。

    BASE理论

        BASE是指基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventual Consistency)。
        BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采取合适的方式达到最终一致性(Eventual Consitency)

    基本可用(Basically Available)

        基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
        电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

    软状态(Soft State)

        软状态是指允许系统存在中间状态,而该状态不会影响系统整体可用性。分布式存储一般一份数据至少会有三个副本,允许不同节点间副本同步的延迟这就是软状态的体现。MySQL Replication的异步复制也是一种体现。

    最终一致性(Eventual Consistency)

        最终一致性是指系统中的所有数据副本经过一段时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的特殊情况。

    ACID和BASE的区别与联系

        ACID是传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。ACID和BASE代表了两种截然相反的设计哲学。在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE会结合着来用。

    参考资料:
    大神

  • 相关阅读:
    es5中,一个在js中导入另一个js文件。
    移动端字体小于12号字的时候,line-height居中的问题
    初学者都能懂得 Git 说明
    一探 Vue 数据响应式原理
    文件的命名规则
    Vue 的 watch 和 computed 有什么关系和区别?
    MVC 与 Vue
    博客园皮肤设置
    java使用run和start后的线程引用
    Python改变一行代码实现二叉树前序、中序、后序的迭代遍历
  • 原文地址:https://www.cnblogs.com/Khadron/p/Distributed_Learning.html
Copyright © 2011-2022 走看看