分布式系统,顾名思义,就是让多台服务器、多计算单元,协同来完成整体的计算任务。它拥有多种组织方式。在分布式系统中,使用分层模型,路由和代理计算任务、存储任务,将不同的工作,划分到不同业务集群机器中,是常用的方法。一般来说,最基础的分布式系统,可以分为典型的三层结构:

  • 接入层:用来对接客户连接的第一层,负责用户业务处理的分发,和用户连接的负载均衡。

  • 逻辑层:处理系统不同业务的计算层,不同的业务可以划分到不同的计算集群当中,等待接入层分配任务,处理不同的业务单元。

  • 数据层:通过离散化的存储方式,提高整体数据的写入、读取、检索的速度。

相关工作示例,如图1所示:

图1 分布式系统基本三层结构这是最基本的分布式系统,在实际业务中,根据需求的不同,系统的分散和划分方法也会又很大的不同,不同的的业务层中,特别在复杂的分布式系统中,还会定义专门的代理网关Proxy和路由进程Router处理消息的分发和负载均衡。在基本的分布式系统中,为了支持更为庞大的系统能力,解决特定的分布式问题,分布式系统又总结了一些典型的分布式模型和技术方案。并发模型

一个服务器在处理用户请求的时候,可能会同时接受到非常多的用户请求,并且还需要为其他用户返回数据输出。在处理过程中,服务器系统经常会有“等待”或者“阻塞”的问题存在。系统如果去等待一个请求到下一个请求,会极大的降低系统效率,降低吞吐量。这就是分布式系统中,经常遇到的“并发问题”。在分布式的并发模型中,常用的是两种方案:多线程方案和异步方案。在早期时间,多线程多进程方案是最常用的技术。但是多线程技术在处理以下问题拥有一些弊端:

  • 多线程中,多个线程程序的执行顺序不可控制。

  • 同步数据和对象,不同线程之间同步处理,会造成不可估计的错误,或者死锁问题。

  • 多线程之间,不同CPU处理之间的数据来回拷贝,会造成CPU计算资源的浪费。

针对多线程方案的弊端,异步模型方案,逐步开始流行起来。异步模型方案,解决了多线程的死锁问题,也避免了数据拷贝之间的消耗。异步回调模型,就是最早的分布式计算中,并行计算的雏形。异步回调模型的实现,是基于非阻塞的I/O(网络和文件)模型,在函数读写的时候,不用等待当前函数调用的结果,立刻返回“空“或者”有“的结果。最常用的异步回调模型,是Linux的epoll模型,它使用底层内核,快速查找到数据,读写连接或者文件,当计算完成以后,再通过连接异步处理、并且返还结果。它的每个操作都是非阻塞的,一个进程就可以使用这种方式,处理大量的并发消息。另一方面,由于异步模型是单个进程的,它的数据和处理逻辑都是固定的,不会出现多线程的不可预知错误,也不需要加锁。它大大简化了并行模型的开发过程,是现阶段高吞吐、高并发系统的首选。它的运作模型,如图2所示:

图2 epoll并发模型除了并发模型,在后面我们还会再继续详细介绍分布式中的并行计算方案。分布式中的数据缓冲在互联系统和智能设备的分布式系统中,为了具有良好的用户体验,需要在秒的级别之内,返还结果。分布式系统,它的运算遍布在各个分布式集群当中,为了提高系统效率,数据缓冲就成为了它的常用技术方案。分布式缓冲技术,应用最广泛的是CDN(Content Delivery Network)内容分发网络,它大量运用在视频、图片、直播等应用领域。它的原理,是使用大量的缓存服务器,将缓存服务器分布到用户集中访问的地区网络中,用于提高当地的数据延迟。在用户进行使用的时候,使用全局的接入层和负载技术,将用户指向它最近、最适合的缓存服务器中,通过这个服务器响应用户的消息请求。它的部署原理,如图3所示:

图3 非CDN缓存的分布式和CDN缓存的分布式方案除了CDN缓存技术,还有很多其他的分布式换从技术,比如反向代理缓存、本地应用缓存、数据库缓存、分布式共享缓存、内存对象缓存等,大家可以自行学习这些技术。分布式存储技术在分布式系统的时代,数据如何存放更大的数据、承载更多的连接、支持更多的并发检索,成为了新时代技术的跳转。在传统的MySQL数据库,逐渐无法承载大互联网时代的系统需求,数据存储的方式变得更加多样化,比如使用文件、数据条切片等方式。在这种情况下,分布式数据库NoSQL应运而生,用于支持高并发的分布式业务,其中的佼佼者有MangoDB、Redis、RadonDB等。分布式数据库,可以承载更大的、更快的数据能力,不同的数据,可以存放在不同的服务器上,通过特定的检索和应用方式,将机器集群联合起来。这也是分布式系统的一种,数据系统的分布式系统。在分布式数据系统中,根据数据的拆分和管理方式,主要可以分为以下几类:

  • 单数据库架构:不同的数据库服务器中,各自独立数据,相互不干预。

  • 主从数据库架构:由一台服务器处理数据写入,一台服务器处理读取查询,相互之间进行数据同步,如图4所示:

    图4 主从数据库架构

  • 垂直数据库切分架构:将每个单独垂直的数据库模块,和服务器逻辑层的模块联合起来,形成一个相对垂直的业务-数据模型,各个数据之间的耦合,只在逻辑层进行联合处理。

  • 水平数据切分架构:将大量的高段位的数据,进行水平的存储,并且进行拆分,拆分到不同表中,比如有个数据由10000条,我们可以切分为10条数据库,每个数据段存储1000条,再通过统一检索的方式,检索指向到不同的服务器数据库位置,其中大数据Hadoop中的HDFS是这种架构的佼佼者。

分布式系统管理

分布式系统,并不是简单的堆砌机器集群,如果没有良好的调度和管理方式,分布式系统可能还不如集中式系统,它的复杂性和容错性,可能还会降低效率。在分布式系统的管理上,我们可以关注以下几个主要指标:

  • 硬件故障率:分布式集群,拥有很多太服务器,每个服务器都有一定的硬件故障几率,我们设定为x。分布式系统拥有n台服务机器,作为一个整体集群,它出现硬件的故障几率,可以使用如下计算方式:SER(System Error Rate)=1 –(1-x)^n,可以看出,随着机器规模的增加,故障率会逐步上升。有效的硬件监控和故障预测,是分布式系统管理的重要组成。

  • 资源利用率:分布式系统在运作的时候,可能会出现这样一种情况:在某些时段,某些机器非常繁忙,而某些机器却出现闲置,甚至某些服务长期才会使用一次。这样造成了计算资源极大的浪费,也会让分布式系统产生了很多不必要的开销。一个高效的分布式系统管理,需要有高效和灵活的管理机制,既不会让某些机器高负载运转,也能在灵活调度计算资源的分配,让整个系统都能得到较好的使用效率,并且持续保持健康。另外,分布式系统集群的扩容、缩容,实时在线操作,都是需要非常复杂的技术处理,这也是分布式系统管理的重要研究对象。

  • 分布式系统的更新和扩展:在一个大型的分布式系统中,多个系统相互协作,相互影响,在更新某个系统或者模块的时候,不免会影响到其他系统的工作。如果停止整个系统的运营,会对用户造成极大的伤害。所以在分布式系统的设计当中,系统的更新和扩展,也是极其重要的考核指标。在这个方面,诞生了不少优秀的分布式框架,比如微服务框架EJB、WebService等。

  • 数据决策统计:在大型的分布式系统中,很多都伴随着大数据系统的运行,如何去使用分布式方案,进行数据的统计和决策,也是重要的技术方案。其中Google的MapReduce模型,如图5所示:

    图5 MapReduce分词处理模型

针对分布式系统的各项需求,在长期的发展中,在工业界和学术界,诞生了许多针对性的系统或者组件,具体可以归类如下所示:目录服务和中控系统分布式系统是由许多系统和进程共同组成,如何去响应每个服务所需要的功能模块,监听服务模块的负载情况,调配系统集群资源,应急突发的错误情况、扩展和恢复系统组件,是分布式系统的痛点需求。其中Hadoop的Zookeeper是比较优秀的开源项目,它能帮助系统处理数据发布/订阅、负载均衡、服务名称管理、配置信息维护、命名处理、分布式协调、Master选举、数据同步、消息队列、分布式业务锁等。它的运作方式,如图6所示:

图6 ZooKeeper集群结构在Zopper集群种,采用Paxos算法,主要包含三种节点角色:

  • Leader节点:表示被选区的机器节点,提供读写的服务,需要被选举。

  • Follow节点:集群的其他节点,提供对外逻辑服务和同步功能,参与Leader节点的选举策略。

  • Observer节点:集群的其他节点,提供对外逻辑服务和同步功能,不参与Leader节点的选举策略。

消息队列在分布式系统中,不同服务之间,需要进行协调沟通,消息的一致性也是非常重要的。对此产生了一些非常优秀的消息队列组件,比如Kafka、ActiveMQ、ZeroMQ、Jgroups等。消息队列模型,将抽象进程间的交互为消息处理,形成一个“消息队列的管道”,进行存储。其他的进程可以对队列进行访问,读取消息或者处理消息,消息的路由存放的队列管道进行决策,这样就静态化了复杂的消息路由问题,形成了易用的消息模型。具体模型示例,如图7所示:

图7 消息通道组件工作消息队列组件,类似一个邮箱,消息队列服务是一个独立的进程,相关的其他服务,可以通过消息队列组件,向队列进程投放消息,队列再进行消息的一致性分发,将它分发到预定的目标服务,让消息的分发更加简便、运维更加清晰。事务协调系统事务协调是分布式系统中最为复杂的技术问题,一个完全的业务流程,它可能关联着不同的服务进程,不同的进程之间协调工作,是一个复杂的流程。业务过程中还会有故障产生,相关的备用解决方案,也是重要的问题。自动化部署分布式系统是一个分散化的、高度复杂性的大型系统,对于它的部署和运维,是一项艰难的任务,如果通过人力进行工作,将会耗费极大精力和时间。自动化的部署,就成为了分布式系统的重要辅助系统,其中容器化Docker、“池管理”、RPM打包,都是优秀的部署系统。下面是Docker的运作模式,如图8所示:

图8 Docker的容器组件模块分布式系统是一个复杂的、高度能力分散自治的系统能力,如何去面向未来群体智能的新时代技术体系,分布式系统是打开大门最关键的一把钥匙。福利

本文节选自《分布式人工智能:基于TensorFlow、RTOS与群体智能体系》,经出版社授权发布。本次联合机械工业出版社出版为大家带来6本书作为福利。欢迎大家在留言区谈谈对分布式的认识,截止2020年11月23日12时,精选留言点赞前6名,各送出此书一本!没中奖的同学可以点击下方链接购买。Kubernetes实战培训

Kubernetes实战培训将于2020年12月25日在深圳开课,3天时间带你系统掌握Kubernetes,学习效果不好可以继续学习。本次培训包括:云原生介绍、微服务;Docker基础、Docker工作原理、镜像、网络、存储、数据卷、安全;Kubernetes架构、核心组件、常用对象、网络、存储、认证、服务发现、调度和服务质量保证、日志、监控、告警、Helm、实践案例等,点击下方图片或者阅读原文链接查看详情。

分布式系统关联查询_一文详解分布式系统 | 留言送书相关推荐

  1. 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...

    作者 | wzy0623责编 | 屠敏出品 | CSDN 博客大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而完成数 ...

  2. mysql 不通过关联查询表_mysql中多表不关联查询的实现方法详解

    下面小编就为大家带来一篇浅谈mysql中多表不关联查询的实现方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 大家在使用MySQL查询时正常是直接一个表的查询,要不然 ...

  3. Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

    文章目录 内连接 inner join 示例 外连接 outer join left outer join 左外连接 示例 right outer join 右外连接 示例 full outer jo ...

  4. nacos 本地测试_一文详解 Nacos 高可用特性

    简介:我今天介绍的 Nacos 高可用,是 Nacos 为了提升系统稳定性而采取的一系列手段.Nacos 的高可用不仅仅存在于服务端,同时也存在于客户端,以及一些与可用性相关的功能特性中,这些点组装起 ...

  5. b树与b+树的区别_一文详解 B-树,B+树,B*树

    B-树 B-树是一种多路搜索树(并不一定是二叉的) 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树.B_树). 一棵m阶B树(b ...

  6. Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  7. R 多变量数据预处理_超长文详解:C语言预处理命令

    一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能 ...

  8. 狄利克雷分布公式_一文详解隐含狄利克雷分布(LDA)

    一.简介 隐含狄利克雷分布(LatentDirichletAllocation,简称LDA)是由DavidM.Blei.AndrewY.Ng.MichaelI.Jordan在2003年提出的,是一种词 ...

  9. l298n电机哪一端为正_一文详解电机倒顺开关接法!

    现在的开关种类多种多样,接线原理虽然大同小异,但很多人依然不太会接.今天小编给大家分享的是倒顺开关的接法,希望对大家有所帮助. 一.倒顺开关作用 首先我们需要明白倒顺开关的作用,它的作用主要是连通.断 ...

最新文章

  1. ASP.NET MVC 学习1
  2. Visual Paradigm 教程[UML]:如何在序列图中使用持续时间约束?
  3. PHPcurl抓取AJAX异步内容(转载)
  4. zabbix网络发现主机
  5. LeetCode 189. 旋转数组(环形替换)
  6. Jquery mobile 新手问题总汇
  7. 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
  8. 学习笔记——作业的知识点与注意事项
  9. 把路由器配置成DHCP服务器,并确保路由功能。
  10. QTP 9.2 下载破解
  11. VB获取窗体的位置和大小
  12. eclipse字体大小怎么设置
  13. 计算机电源再利用usb充电器,变废为宝,笔记本旧电源改造的8口USB充电器
  14. 疫情之下,从一座空城,到另一座空城,第一次看到这么寂寞的杭州
  15. 南海云课堂春季11(T)K1 拓展:单调队列
  16. linux 临时文件 锁,Linux上开启强制性记录锁
  17. win7系统计算机文件夹缓慢,windows7搜索文件非常慢的解决办法以及优化方法
  18. 如何将 Excel 单元格内容按换行符拆分为多列
  19. 常用进制数转换(二进制、八进制、十进制、十六进制)【数电笔记】
  20. openoffice.org3.4 源代码 编译

热门文章

  1. 联想 android 5.1 root权限,联想a520一键root权限获取教程(图文)
  2. AndroidUtilCode框架 fileutils学习总结
  3. java基本数据类型以及相关内容总结
  4. 程序员入门--两年养成之路
  5. 1)Java JDK和JRE
  6. Itemplate 自定义控件
  7. matlab相机标定畸变参数,相机标定的原理与意义及OpenCVMatlab实现差异小结.doc
  8. C++的掐拷贝、深拷贝【面向对象程序设计细节】
  9. 从零开始学前端:CSS复合选择器 --- 今天你学习了吗?(CSS:Day10)
  10. linux网卡绑定和漂移,LINUX修改、增加IP的方法,一张网卡绑定多个IP/漂移IP【转】...