一般,分布式系统需要支持以下特性:

  • 资源共享
  • 开放性
  • 并发性
  • 可伸缩性
  • 容错性
  • 透明性

下面分别讨论。

容易理解的

资源共享

一旦授权,可以访问环境中的任何资源

资源:包括硬件(e.g. printer, scanner, camera)、软件(服务)、数据(file, database, web page)。

如资源管理器控制资源的访问:

  • 提供命名机制
  • 控制并发访问

开放性

新共享资源添加并被各种客户程序使用的(难易)程度。

如支持异构资源的添加和使用:

  • 提供统一的通信机制
  • 发布访问共享资源的接口

并发性

分布系统中的各个组成部分可以在并发的过程中被执行。

如:

  • 多个用户同时访问(和更新)资源
  • 多个服务进程同时运行,相互协作

资源定义同上。

可伸缩性

主要强调“伸”;偶尔也强调“缩”。

在资源和用户数较大增长的情况下,系统性能仍能维持甚至提高。

通常表现为:

  • 利用网络环境可以为更多的用户服务、而且响应更快
  • 通常通过增加更多/更快的处理器,能实现更可靠、更完善的服务

如:

  • DNS的解析:一方面,不仅可以为每个根域名设置单独的服务器,还可以为访问量大的二级、更多级域名也单独设置服务器;另一方面,当访问量变小时,还可以将多个访问量小的根域名的解析合并到一台服务器上。

不容易理解的

容错性

错误发生时,系统能够继续工作的能力。

基于这样一个假设:硬件、软件、网络的错误不可避免。

要容错,就要先知道有哪些错误(故障),再针对故障类型一一解决。

故障类型

分布式系统中的典型故障如下:

其中,随意性故障是最严重的故障,也被称为拜占庭故障。当发生故障时,服务器可能产生它从来没有产生过的输出,但是又不能检测出错误。更坏的情况是,发生故障的服务器恶意的与其他服务器共同工作来产生恶意的错误结果。

容错方案

如果系统是容错的,那么它能做的最好的事情就是对其他进程隐藏故障的发生。由于故障无法避免,我们只能依靠冗余来掩盖故障,包括:

  • 信息冗余:添加额外的位可以监测出错误位甚至纠正。如在数据中增加checksum等。
  • 时间冗余:执行一个动作,如果需要就再次执行。如事务、超时重传等。
  • 物理冗余:添加额外的设备或进程使系统作为一个整体来容忍部分组件的故障。如HDFS的多备份、HA等等。

部分书籍将物理冗余与软件冗余分开,本质上无法完全分开,因为软件冗余可能在部署在单机或多机上。这里将二者统一为物理冗余。

则针对各故障,可取的主要解决方案为:

  • 崩溃性故障——时间冗余、物理冗余
  • 遗漏性故障——物理冗余
  • 定时故障——时间冗余、物理冗余
  • 响应故障——信息冗余、时间冗余、物理冗余
  • 随意性故障——信息冗余、时间冗余、物理冗余

透明性

网络环境对于用户和应用程序而言,应该是一个整体,而不是一个互相协作的简单的构件集合。包括多项性质:

  • 位置透明性:用户不必关心对象位于何处。
  • 如DNS、Consul等分布式命名系统。
  • 重定位透明性:对象的位置可以变化而不影响对它的调用。
  • 仍然如DNS、Consul等。
  • 迁移透明性:系统内部可以迁移对象的位置。
  • 仍然如DNS、Consul等。
  • 访问透明性:可用一致的方式访问不同类型的机器上的对象。
  • 如Yarn、Mesos等分布式资源调度系统。
  • 持久透明性:对象所处的状态既可以是活动的,也可以是静止的。
  • 如HBase的WAL,计算机中的cache、段表、页表等。
  • 失败透明性:屏蔽被访问对象的失败及恢复过程 (容错)。
  • 如MapReduce、Spark等分布式计算框架。
  • 事务处理透明性:与事务处理相关的调度、监控和恢复。
  • 如2PC等分布式事务协议。
  • 复制透明性:用户不知道有多少个对象副本存在。
  • 如HDFS、Tair等分布式存储系统。

位置透明性、迁移透明性、重定位透明性是对命名系统的基本要求。

带你认真了解一下Java分布式系统的基本特性的更多相关文章

  1. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  2. 十个问题带你了解和掌握java HashMap

    十个问题带你了解和掌握java HashMap 一.前言 本篇内容是源于 " 由阿里巴巴Java开发规约HashMap条目引发的故事",并在此基础上加了自己的对HashMap更多的 ...

  3. atitit. 文件上传带进度条 atiUP 设计 java c# php

    atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...

  4. 用java自带jdk开发第一个java程序

    [学习笔记] 1.用java自带jdk开发第一个java程序:   下面要讲的eclipse要想正常工作,需要先学会配置这里的jdk.jdk要想正常工作,需先学会配置JAVA_HOME和ClassPa ...

  5. 带你全面了解高级 Java 面试中需要掌握的 JVM 知识点

    目录 JVM 内存划分与内存溢出异常 垃圾回收算法与收集器 虚拟机中的类加载机制 Java 内存模型与线程 虚拟机性能监控与故障处理工具 参考 带你全面了解高级 Java 面试中需要掌握的 JVM 知 ...

  6. [转] Java 8的新特性

    简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子 ...

  7. Java 8的新特性—终极版

    作者:杜琪[译] 原文链接:http://www.jianshu.com/p/5b800057f2d8 1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本 ...

  8. Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字

    Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字 一丶Java中包的机制 首先包其实就是个文件夹.作用就是管理类. Java中每次定义一个类的时候.通过Java编译之后.都会生 ...

  9. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

随机推荐

  1. 【小技巧】启动Tomcat 提示端口被占用 怎么办?一句命令解决

    windows环境: 方法1: 1.win+r 打开黑界面 2.输入命令 netstat -ano|findstr 8080 3.输入命令 taskkill /pid xxxx /f Linux环境: ...

  2. big data-1

  3. chemfig化学式转换为pdf

    SMILES 与 chemfig 针对化学分子结构,可以用SMILES (用ASCII字符串明确描述分子结构的规范)来定义. SMILES(Simplified molecular input lin ...

  4. 技术博客:Azure 认知服务

    Azure 认知服务 1.概述 ​ 微软认知服务(Microsoft Cognitive Services)集合了多种智能API以及知识API,使每个开发人员无需具备机器学习的专业知识就能接触到 AI ...

  5. PSP初体验:求交点

    项目 内容 课程:北航2020春软件工程 博客园班级博客 作业:完成一个平面图形求交点的程序,体验PSP的过程 个人项目作业 我在这个课程的目标是 体验软件开发的全流程 这个作业在哪个具体方面帮助我实 ...

  6. 移动应用开发 第5讲 Activity课堂综合练习

    作业总要求使用附件"素材"压缩包中的素材完成下列任务: 1.完成小游戏主程序,如图mainActivity.png. 2.在主程序界面当按下游戏介绍按钮时进行游戏介绍界面如图gam ...

  7. 一看就懂的MySQL的聚簇索引,以及聚簇索引是如何长高的

    这一篇笔记我们简述一下 MySQL的B+Tree索引到底是咋回事? 聚簇索引索引到底是如何长高的. 一点一点看,其实蛮好理解的. 如果你看过了我之前的笔记,你肯定知道了MySQL进行CRUD是在内存中 ...

  8. Markdown使用概述

    Markdown使用概述 序言 作为一名编程学习的爱好者和初学者,由于学习编程的过程中总是存在遗忘以及很难动手写起来的问题,所以在看了许多关于编程学习方法的文章之后,选择使用typora作为我的笔记工 ...

  9. [转载]层叠与并排win10

    三. 层叠与并排 如果要排列的窗口超过4个,分屏就显得有些不够用了,这时不妨试一试最传统的窗口排列法.具体方法是,右击任务栏空白处,然后选择"层叠窗口"."并排显示窗口& ...

  10. Vim删除空行

    Vim删除空行 1 Vim删除空行 打开vim输入:g/^$/d :g将在与正则表达式匹配的行上执行命令. 正则表达式是'空行',命令是:d (删除)