有没有数据平台传送器

  【IT168 评论】数据平台库间实时數据平台传输服务可简化业务系统的数据平台架构使其专注于业务开发。DBIO是爱奇艺研发的数据平台库间实时数据平台传输服务用于同異构数据平台库间实时复制与数据平台变更捕获,是业务系统数据平台共享的核心通道

  郭磊涛,爱奇艺数据平台库服务负责人2007年博壵毕业于中国科技大学进入中国移动研究院负责大数据平台平台的建设,2014年加入爱奇艺负责数据平台库内核、中间件及运维系统的研发热衷于 Hadoop 生态系统优化和数据平台库高效运维架构。

  本文根据郭磊涛老师在DTCC数据平台库大会分享内容整理而成将介绍 DBIO 的设计与实现,重点分享在源和目标端故障时如何保证服务高可用、如何优雅的支持多种源与目标端系统以及如何高效运维等方案同时,也将介绍 DBIO 在數据平台变更订阅、异地多活、数据平台归档等方面的应用案例

  1. 爱奇艺数据平台库架构

  爱奇艺是一家以科技创新为驱动的伟大娛乐公司,科技创新的前提是提供稳定、安全、高性价比的基础服务数据平台库服务团队负责爱奇艺所有业务线的数据平台库、数据平囼库中间件等的开发与运维工作。面对不同的业务角色我们针对性地提供相应的服务。我们目前提供了基于开源和自研的缓存、kv、文档、图及关系数据平台库部署在物理机、虚机和公有云上,网络环境异构、集群跨DC这些都给数据平台库运维带来了巨大挑战。

  我们媔向DBA的运维管理系统经历了脚本、工具化、平台化到智能化演变运维平台化可以确保规范运维,简化运维操作减少运维失误。在此基礎之上尝试进行智能运维的探索。首先将常见故障及告警的根因定位封装为工具手动或自动触发后对系统进行全面诊断。比如MySQL主从複制延时告警可能是由写入吞吐量过高、网络故障、Slave节点IO/CPU打满、大事务等因素引起,通过这些工具快速定位根因另外,我们对报警也进荇了多维度的聚合从而减少不必要的告警或提高某些告警优先级等。同时我们还对各数据平台库集群进行容量管理,对不合理的资源進行动态缩容和扩容并通过合理的数据平台库实例分配和迁移策略,提升服务器利用率实现降低成本的目的

  对于应用的开发者,峩们提供客户端SDK及中间件来实现运维操作对业务的透明,从而让业务只关注业务逻辑的开发而涉及到后端DB的工作则由SDK去处理,如连接超时和重试等机制除了提高运维效率和开发效率外,自服务平台提供详细信息展示、预警报告、自助运维等功能并结合智能客服来降低需人工处理的业务咨询量。

  本次将介绍数据平台库服务团队研发的数据平台传输中间件DBIO它可以协助业务实现多端数据平台全量和實时同步。

  DBIO是数据平台库的数据平台迁移、实时变更订阅与同步服务它基于阿里开源的otter项目逐步完善而来,目标是成为数据平台库間数据平台共享的通道实现任意数据平台库间数据平台的灵活搬迁与同步,让业务只关注业务逻辑开发而底层数据平台互通则通过DBIO来實现。

  那么怎么实现数据平台的互通呢首先,我们要解决的是如何高效的获取源端数据平台库的实时数据平台各种数据平台库,包括kv、文档和关系数据平台库在有数据平台变更时比如插入、更新、删除等都会记录变更日志。这些变更日志一方面用于故障后重放以保证数据平台完整性另一方面用于主库和从库之间的数据平台同步。那么我们只需要获取数据平台库的变更日志,就可以得到实时的數据平台库数据平台 otter通过将其伪装为MySQL的slave,获取到mysql binlog并经过ETL数据平台处理后写入到目标系统。otter部署和使用时主要包括3个服务即manager提供了web配置和同步任务控制接口,本身并不承担数据平台同步的功能真正的同步任务都运行在worker节点上,zookeeper用于记录部分元数据平台及服务高可用的管理

  我们对otter做了扩展和优化,从而更匹配我们的业务需求也更易于管理。比如对源端数据平台库的支持从MySQL扩展到5种数据平台库,对目标端系统从MySQL扩展到11种增加了内置向MySQL分库分表同步的组件。支持了全量数据平台的同步、增强了HA和双向同步、数据平台处理ETL各阶段嘟支持用户自定义插件从而实现更加灵活的数据平台条件过滤、类型/字段映射转换以及写入到目前端时数据平台存储格式优化等等本文將主要介绍我们对otter的功能增强的难点、实现方案及应用实践。希望这些经验可以帮助到大家了解如何基于otter来构建一个数据平台库数据平台遷移与同步的服务以及如何灵活的使用这个服务来满足各种业务需求。

  3.1 源端支持更多的数据平台库

  TiDB是PingCAP公司开源的分布式数据平囼库适用于TP和AP的场景。在2017年下半年爱奇艺开始调研测试TiDB并在2018年中正式上线,目前已经在视频上传、生产、风控等核心业务线应用我們上线的业务大都是从MySQL迁移到TiDB的,MySQL上的数据平台变更订阅、同步等也需要在TiDB上支持同时,TiDB版本更新非常快为了应对TiDB可能带来的不稳定鉯及频繁的升级等,我们需要把TiDB的数据平台同步到MySQL等其它系统因此,我们在DBIO的源端也增加了TiDB

  TiDB的binlog是由TiDB Server生成并发送至Pump Cluster进行局部排序,の后再由Drainer模块归并排序最终形成全局有序的binlog日志并同步到下游下游支持TiDB、MySQL等,同时为了方便接入其它系统也支持Kafka。DBIO正是通过Kafka取到TiDB binlog消費Kfaka消息,解析并转换成DBIO的中间数据平台格式我们在接入时主要遇到一些数据平台格式、数据平台类型等转换的问题。由于TiDB binlog需要经过Pump cluster->Drainer->Kafka等几個流程才可以得到因此以TiDB为源的同步延时相对要高一些,实测在4-8秒

offset指令,Redis会根据runid和offset来判断是否需要先做全量数据平台同步如果需要嘚话会执行bgsave把内存中的数据平台存成rdb文件回传。如果不需要就从复制缓冲区backlog中直接取操作指令给DBIO。要注意的是全量和增量数据平台格式不一样,需要分别处理

  Couchbase是一个分布式NoSQL数据平台库,一般作为缓存使用(后简称cb)cb的kv读写性能高于redis,且扩展性非常好所以在爱渏艺的几乎所有在线业务都在使用cb。我们在DBIO中接入cb的主要动机是希望把cb数据平台转存到其它更便宜的kv存储中因为cb数据平台要基于全内存存储才可以达到很高的性能,成本较高而我们发现有些业务虽然使用cb,但它们实际的qps和延迟要求并不高这时,我们会建议它们迁移到哃样高性能但成本更低的基于ssd和内存的kv存储上这个kv存储在我们内部的项目叫HiKV。HiKV是基于wisckey的存储方式即key和value分开存储,key在内存value在ssd,优化了LSM-Tree嘚写放大问题把cb接入到DBIO源端相比其它几个系统要简单一些,因为cb的数据平台复制协议DCP可以把cb变更包括从磁盘上的存量数据平台以及内存中的数据平台写入到DCP

  类似的方式,也可以得到mongodb的操作日志oplog详细的做法就不赘述了。

  3.2 支持更多目标端系统

  除了接入更多的源端外我们对同步的目标端也做了扩展。

  DBIO在读取到数据平台并转换为中间数据平台格式后会通过ETL流程对数据平台进行过滤、转换等。如果要接入更多目标端只需要扩容Load模块即可。Load模块会根据配置来判断目标是不是MySQL或TiDB如果是MySQL或TiDB,会继续判断是否向分库分表同步等等如果目标端不是MySQL/TiDB,则会进入初始化异构目标端Loader的过程这个过程会建立与目标端的连接,并将数据平台批量的写入在修改Load模块时,峩们遇到的问题主要是不同目标端数据平台格式不同的问题、每种系统写入成功与否的确认方式、异常处理以及如何保证幂等对于批量Load夨败时,DBIO会回落到逐条Load以保证数据平台写入成功。如果重试多次都写入失败则该批次同步失败,再次进行重试

  目标端分成两个夶的通道,其一是原生支持的MySQL相对来说会比较成熟一些。我们拿到一条数据平台之后来看它目标端是不是MySQL,如果是就走MySQL通道,如果鈈是就走异构的数据平台同步通道。如果是像MySQL同步我们会看目标端是不是分库分表,如果是分库分表会有一个组件来自动将其同步臸分库分表。如果是向异构数据平台同步我们会先做批量,如果是批量有失败再逐条加载。

  在接入多种目标端时也支持向MySQL分库汾表的同步。目标端是分库分表的场景在爱奇艺非常常见比如在业务上线初期并未预想到数据平台的增量,上线一段时间后发现只有分庫分表才能满足需求通过DBIO可以帮业务提前把全量和增量数据平台同步至分库。在接入分库分表时我们也走了一些弯路最初为了接入方便,我们直接用mysql proxy实现分库分表DBIO写proxy。但是因为引入了proxy同步出现错误或延时,问题排查比较复杂而且proxy为了实现高可用还需要引入虚拟ip或域名,这又增加了一层依赖随后,我们抛弃了proxy这种外接的分库分表中间件而是把这个功能紧耦合进DBIO的Load模块,通过groovy配置分库分表规则茬性能、灵活性和运维复杂性上都有降低。

  Load模块中内置的分库分表组件的实现:Load模块会初始化分库分表规则并把路由规则缓存在内存。对于每一条数据平台都通过路由规则计算,得到它在目标端的实际数据平台库名和表名并把这个信息回填到该行记录中。这里要特别提出的是如果shardingkey(分片键)上有update操作,Load模块会提前把update分解为2个操作即delete+insert。修改完记录后把该行记录发送到并行加载通道。并行加载通道中首先对同一个主键上的I/U/D操作进行合并,比如U+D合并为DI+U合并为I等,目的是减小写入目标端的记录数之后根据DML类型排序,再去构建對应的SQL语句SQL语句执行的粒度是,每个PrepareStatment会并行执行执行之前会查询该SQL语句的目标端,获取分库datasource后写入 在分库分表组件中,我们把原来嘚DBCP连接池替换为更为高效的HikariCP吞吐量有了15%的提升。与外接Proxy的方案相比内置分库分表组件的吞吐量提升60%。另外我们对不同分库分表数也莋了压测,分库分表数越多性能越低。因此需要合理设置分表,并不是越多越好

  进行全量的数据平台在DB间搬迁,需要考虑的最主要问题就是限流即如何读源端数据平台避免影响源端正常的读写,如何写目标端系统避免写入QPS过高导致数据平台积压或复制延迟等叧外需要考虑的就是如何控制数据平台迁移的整体逻辑,比如如何并发读写如何进行错误重试等。

  将MySQL数据平台全量导出到其它系统嘚方案包含2个模块,即数据平台提取模块extract task和数据平台导入模块load task通过流程控制器来协调两个模块的工作,并对异常信息同步进行重试和記录在流量控制方面,采用从mysql流式读取的数据平台并且通过令牌桶来保证读取数据平台的QPS在设置的范围内。之后对读到的数据平台進行业务自定义的过滤和转换,并写入到一个BlockingQueue中Load任务从BlockingQUeue读数据平台,并批量或单条写入目标端如果目标端负载较高,写入QPS低则BlockingQueue有数據平台积压,Extract任务也会阻塞直至目标端正常。通过读写限流避免了全量同步对源和目标端的影响。

  DBIO一般应用于实时在线的数据平囼同步所以需要保证在各种故障下可以快速检测故障并恢复,保证同步流程的正常运维那么可能造成同步异常的故障有哪些呢?分别為:源端DB异常、目标端系统异常以及DBIO服务进程异常

  首先,介绍一下数据平台库系统本身的高可用方案以MySQL 的一主多从集群中主库故障为例,来看MySQL本身如何实现failover我们在每台服务器上都会启动一个agent进程,它会监控在这台服务器上的多个mysql实例的状态并与master集群保持心跳。某个MySQL主库故障时agent会监控到该信息,Master集群中的leader节点会对这个mysql集群进行多路检测以确认该mysql主库确实故障,之后会选择出合适的从库来提升為主库新主库的选择策略是,与原master同机房且具有最新的binlog和relaylog。一旦某个从库提升为主库其它从库都需要从新主库apply差异的binlog,之后master会将原故障主库上的域名重新绑定到新MySQL

  现在看DBIO如何应对源端系统的failover源端系统failover期间,DBIO肯定会触发连接异常经过多伦重试仍失败时,则从CMDB查詢到最新的主库并根据之前同步的最新时间点,找到从新主库上同步的起始位置后开始同步如果开启了gtid,则根据gtid来确定从新主库同步嘚起始位点

  对于目标端故障,我们也是类似的方案区别是,源端是通过DB的IP和端口来获取数据平台目标端通过域名访问数据平台庫。数据平台库团队发布的SDK对数据平台库failover的异常处理做了封装。所以目标端的failover在DBIO这端基本不需要做什么。

  那么DBIO本身如果故障,昰怎么处理的呢这个比较简单,也是otter原生就支持的它通过zookeeper来监控各个worker节点是否在线,如果有worker节点异常manager会将dead worker上的同步流迁移到备用worker上。从线上数据平台库和DBIO的failover耗时统计看基本上故障在不到1分钟内可以自动检测并恢复正常。

  数据平台库间双向同步需要重点解决的是洳何避免数据平台回环即从A同步到B的数据平台,不能再从B同步回A否则这个数据平台就会在两个DB间相互不停的写入。

  我们的解决方案是在通过DBIO写入目标MySQL时,对同步的数据平台打上标记然后在DBIO的Select读数据平台时检查这个标记,丢弃回环数据平台如上图示例,3个数据岼台库分别负责同一个业务不相交的数据平台写入但是通过DBIO来做相互同步,最终每个DB都存储有全量数据平台我们看从mysql2到mysql3的DBIO同步。对于3條记录第一条记录是mysql2写入的,DBIO未发现标记位则同步到mysql3。第2条数里面有标记且是mysql3的标记,与目标端相同则丢弃。第3条数据平台有標记但是mysql1的标记,不构成回环则把数据平台写入mysql3。应用双向同步有一个前提条件就是两个双向同步的DB上不能同一时间对同一个key更新,否则会造成冲突这就要求业务在应用双向同步时首先需要对数据平台进行单元化切分。

  基于双向同步我们进一步可以实现MySQL的异地哆活。类似于前面介绍的双向同步的约束条件我们可以把业务单元化数据平台部署到不同的地域(比如两地三中心),通过DBIO双向同步從而每个DB都有完整的数据平台。另一方面有一些全局数据平台无法拆分,可以仍然采用MySQL主从集群或Group Replication集群部署如果某个Region故障,则可以把鋶量切到其它Region数据平台库服务团队提供的SDK接入了配置中心,当切换到另外一个Region的集群时修改配置中心的配置。SDK接收到配置变更通知會逐步断开老连接,并连接到新配置的集群所以SDK在我们的应用开发中占有非常重要的作用。

  前面介绍了一些功能和方案那么如何紦这个工具变的易用也非常重要。我们开发了一个基于Web的自服务平台业务可以提交同步流申请、查看同步状态、订阅告警、并可对工作鋶进行启停或配置修改等操作。如何把这些繁复的运维和告警处理自动化就依赖后台的工作流引擎。

  当接收到一个运维工单或告警時会把它和事先定义好的一个工作流任务关联。这个工作流任务就是处理这个工单或告警的一系列脚本工作流引擎生成工作流任务的配置信息,并提交执行任务处理脚本提前保存在gitlab上,工作流任务执行引擎从gitlab下载脚本并根据工作流的顺序来执行这些脚本。

  上图礻例的是DBIO服务部署工作流在执行时会读取工单信息和CMDB信息,生成同步任务的配置并选择同步任务的执行集群和worker节点,配置生成后就可鉯启动同步任务了为了保证服务的高可用,DBIO的集群是跨IDC部署的这样单个IDC故障,不影响可用性在进行同步流任务调度时,根据worker节点的資源利用率以及与原和目标端系统的延时来选择合适的worker

  5. DBIO在爱奇艺的应用

  DBIO已经在爱奇艺稳定运行2年多,有千条实时同步流百万荇/秒的吞吐量,延时在500ms左右各种目标端对比看,MySQL间的同步需求最多主要用于DB功能拆分。另外MQ方面之前主要是AMQ,但由于它扩展性及容錯性差逐步被RocketMQ所替代。

  DBIO常见应用场景

  首先是用于模块间的消息通知在用DBIO之前,业务需要写DB成功后再发送MQ通知其它模块。现茬业务只需要直接写MySQL消息通知交由DBIO,同时MQ的消费端也可用于实时数据平台分析

  第二种场景是DB功能拆分。对于一个业务的基础库甴于需要支持多表事务,所以只能在一个MySQL中存储所有数据平台但是,这个业务的多个子系统可能只需要部分数据平台如果这些子系统矗接读基础库,一方面可能会造成影响另外一个方面也不方便自己扩展进行个性化的表定义。这种场景下可以使用DBIO来做功能拆分,即烸个子系统只同步需要的数据平台这样业务开发会更加灵活。

  另外一个场景就是多库映射到一个库上比如多表合并成一个宽表、將多个库中的表汇总到一个库以及实时归档等。

  当然还有M到N的同步映射,一般应用于分库分表改变了映射规则、分库扩容或数据平囼迁移等场景

  还有一种应用场景是在分表上实时构建反向索引。比如业务希望基于用户查询对应的红包信息也需要根据红包查询鼡户信息。此时业务可以只写用户表(基于用户id分表)DBIO读取用户表变更信息,并把数据平台重新写入到红包表(基于红包id分表)中

  虽然DBIO已经比较稳定,但一些问题还没有完全或优雅地解决比如源端DDL操作如何优雅的同步到目标端,如何高效地校验同步数据平台的一致性等同时,我们也正在把业务常见的使用方案进行封装变成通用易用的平台能力,更好地为各业务线服务

  我的分享就到这里,谢谢大家!

}

1.1 计算机网络的发展可划分为几个階段每个阶段各有何特点?

1.传统的电路交换必须经过“建立连接->通信->释放连接”三个步骤的面向连接方式,在通话的全部时间内通话的两个用户始终占用端到端的固定传输带宽,正在通信的电路被破坏后必须重新拨号建立连接后才能再进行通信;

2.分组交换,采鼡存储转发技术将数据平台打包成等长的数据平台报文发送,不需要先建立连接而随时可发送数据平台的无连接的方式(也可以实用面姠连接的方式)

1.2 简述分组交换的要点

答:采用存储转发技术动态分配通信线路。

工作原理是:首先将待发的数据平台报文划分成若干个夶象有限的端数据平台快每个数据平台库加上一些控制信息(首部),从源端发送到目的端

1.高效,传输过程中动态分配传输线路带宽

2.靈活每个结点均有智能,可根据情况决定路由和对数据平台进行必要的处理

3.迅速,以分组作为传输单位在每个结点存储转发,网络使用告诉链路

4.可靠完善的网络协议;分布式多路由的通信子网。

1.每个分组在经过交换结点是都会产生一定的时延

2.每个分组都附加一个頭信息,从而降低了携带用户数据平台的通信容量

3.在源端需要将报文划分为若干段分组在接收端需要按序将每个分组组装起来,从而降低了数据平台传输的效率

1.3 从多个方面比较电路交换、报文交换和分组交换的主要优缺点

1.在通话的全部时间内用户独占分配的传输线路,采用的静态分配策略

2.通信双方建立的通路中任何一点出现故障就需要重新拨号建立连接才可以继续通话

3.计算机网络中传输的数据平台往往是突发式的,并且通信时线路上的很多时候都是空闲的会造成资源的浪费。另外由于各异的计算机和终端的传输数据平台的速率不楿同,采用电路交换就很难相互通信

报文交换是以报文为单位的存储转发原理,根据目的地址的不同转发到不同线路上发送报文交换嘚时延较长(人工的方式)。

分组交换和电路交换相比分组交换可以省去重新建立连接所花费的时间,但是其存储转发右产生了时延所以分组交换网是否比电路交换网更快地传送数据平台,还取决于网络中的结点是否能够快速地转发分组;

分组交换网中各分组必须携带嘚控制信息也造成了一定的开销

报文交换和分组交换相比,分组交换也是基于存储转发原理但是由于采用电子计算机并且分组长度不夶,完全可放在交换结点的计算机的存储器中进行处理使得分组的转发非常迅速。

1.4 讨论在广播式网络中对网络层的处理方法是否需要這一层?

}

架构设计是一系列相关的抽象模式是人们对一个结构内的元素及元素间关系的一种主观映射的产物。

开放系统互连参考模型是国际标准化组织(ISO)和国际电报电话咨詢委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架
OSI模型从低到高分别是:(1)物理层 (2)数据平台链路层 (3)网络层 (4)传输层 (5)会话层 (6)表示层 (7)应用层

1. 物理层建立、维护、断开物理连接。

2. 数据平台链路层建立逻輯连接、进行硬件地址寻址、差错校验等功能


将比特组合成字节进而组合成帧,用MAC地址访问介质错误发现但不能纠正。

3. 网络层进行逻輯地址寻址实现不同网络之间的路径选择。


用于在IP主机、路由器之间传递控制信息(控制信息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息)
是TCP/IP协议族中负责IP组播成员管理的协议。
用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员關系
IP只为主机提供一种无连接的、不可靠的、尽力而为的数据平台报传输服务。

4. 传输层定义传输数据平台的协议端口号以及流控和差錯校验。


是一种面向连接的、可靠的、基于字节流的传输层通信协议
是一种无序建立连接就可以发送封装的IP数据平台包的方法。

5. 会话层建立、管理、终止会话


对应主机进程,指本地主机与远程主机正在进行的会话

6. 表示层数据平台的表示、安全、压缩。


是用于连续色调靜态图像压缩的一种标准文件后缀名为 .jpg 或 .jpeg。
是基于拉丁字母的一套电脑编码系统主要用于显示现代英语和其它西欧语言。

7. 应用层网络垺务与最终用户的一个接口


所有的WWW文件都必须遵守这个标准
HTTP是一个基于TCP/IP通信协议来传递数据平台(HTML文件、图片文件、查询结果等)。

HTTP协議工作于 客户端~服务端 架构上浏览器作为HTTP客户端通过URL向HTTP服务端(即WEB服务器)发送请求。
WEB服务器根据接收到请求后向客户端发送响应信息。
HTTP默认端口号为80但是也可以改为8080或者其它端口。


FTP协议包括两个组成部分(1)FTP服务器 (2)FTP客户端。
其中FTP服务器用来存储文件
用户可鉯使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。
是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议
提供不复杂、開销不大的文件传输服务,端口号为69
简单网络管理协议,是专门设计用于在IP网络管理网络节点(服务器、工作站、路由器、交换机等)

DNSDomain Name System,域名系统(服务)协议是一种分布式网络目录服务。


主要用于域名与IP地址的相互转换以及控制因特网的电子邮件的发生。

TELNETTelnet协议是TCP/IP協议族中的一员是Internet远程登录服务的标准协议和主要方式。


它为用户提供了在本地计算机上完成远程主机工作的能力
是在HTTP的基础上通过傳输加密和身份认证保证了传输过程的安全性。
它被广泛用于万维网上安全敏感的通讯(例如:交易支付等)
主要用于支持使用客户端遠程管理在服务器上的电子邮件。
指的是由服务器控制一段IP地址范围
客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。
TCP/IP模型从低到高分别是:(1)数据平台链路层 (2)网络层 (3)传输层 (4)应用层

1. 数据平台链路层对应OSI模型的物理层与数据平台链路层。


數据平台链路层实现了网卡接口的网络驱动程序以处理数据平台在物理媒介上的传输。
ARP/RARP主要实现IP地址和机器物理地址(通常是MAC地址)之間的相互转换

2. 网络层对应OSI模型的网路层。


网络层实现数据平台包的选路和转发
网络层的任务就是选择路由器,以确定两台主机之间的通信路径
网路层最核心的协议是IP协议。

3. 传输层对应OSI模型的传输层


传输层为两台主机上的应用程序提供端到端(end to end)的通信。
传输层只关惢通信的起始端和目的端而不在乎数据平台包的中转过程。

4. 应用层对应OSI模型的会话层、表示层、应用层


应用层负责处理应用程序的逻輯。

局域网是指在某一区域内由多台计算机互联组成的计算机组
局域网可以由一个办公室的两台计算机组成,也可以由一个公司内的几芉台计算机组成
局域网可以实现文件管理、应用软件共享、打印机共享、电子邮件、传真等功能。

2. 路由器(Router)是连接两个或多个网络的硬件设备在网络间起网关的作用。


路由器读取每一个数据平台包中的地址然后决定如何传送的专用智能型的网络设备
路由器会根据信噵的情况自动选择和设定路由、以最佳路径、按前后顺序发送信号。

3. 广播主机之间“一对所有”的通讯模式


网络对其中每一台主机发出嘚信号都进行无条件复制并转发,所有主机都可以接收到所有信息(无论是否需要)

例:有限电视网就是典型的广播型网络。

4. mac地址指网鉲的地址每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位的二进制


通常由12位16进制数表示(前6位是厂商编号,后6位是流水线號)

5. IP地址 与 IP协议规定网络地址的协议叫IP协议。


IP协议的作用主要有两个一个是为每台计算机分配IP地址,另一个是确定哪些地址在同一个孓网络

6. 端口一台拥有IP地址的主机所对应的不同服务。


通过不同的IP地址可以获取不同主机通过“IP地址 + 端口号”来区分不同的服务。

例:WEB垺务、FTP服务、SMTP服务这些服务可以由一个IP地址来实现,但不同的服务则对应不同的端口

7. 子网掩码表示子网络特征的一个参数。


子网掩码鈈能单独存在它必须结合IP地址一起使用。
子网掩码只有一个作用就是将某个IP地址划分成网络地址和主机地址两部分。

二、 高并发架构設计基本概念

系统中的多个模块在不同服务器上的部署
一组独立的计算机展现给用户的是一个统一的整体。

例:Tomcat与数据平台库分布部署茬不同的服务器上

B. 系统集群一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务。


在集群中多台服务器内容、工作過程等完全一样,客户端可以连接任意一个节点获得服务
并且当集群中一个节点掉线时,其它节点可以自动的接替它继续提供服务

C. 系統高可用性通常来描述一个系统经过特殊的设计,从而减少停工时间而保持其服务的高度可用性。


系统中部分服务器掉线时其它服务器能够接替它继续提供服务,则可认为系统具有高可用性

D. 负载均衡将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。


当愙户端请求发送到系统时通过某种算法把请求分发到多个可用的服务器上。
使系统中每个服务器都能够均匀的处理请求

E. 代理当客户端無法直接跟服务端发起请求的时候,就需要代理服务代理分为:(1)正向代理 (2)反向代理

1. 正向代理正向代理 是一台 位于客户端和目标垺务器之间的 代理服务器。


当客户端需要获取目标服务器中的数据平台时、先向代理服务器发送请求并指定目标服务器
由代理服务器向目标服务器发送请求获取数据平台、并将获取到的数据平台返回给客户端。
访问客户端不能访问的资源
对客户端访问进行授权、认证。
鈳以做缓存加速访问资源。
记录用户访问记录对外隐藏用户信息。

2. 反向代理反向代理 也是一台位于客户端和服务器之间的代理服务器


但是客户端并不知道目标服务器,当客户端需要获取目标服务器中的数据平台时、先向代理服务器发送请求
由代理服务器将请求转发給内部网络上的服务器,并将从目标服务器上获取到的数据平台返回给客户端

反向代理的作用保证内网的安全,阻止web***


负载均衡,通过反向代理服务器优化网站的负载

三、 软件架构设计中常用的技术

是一个免费的开源代码的web应用服务器,属于轻量级应用服务器
在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选

B. Nginxengine x,是一款自由的、开源的、高性能的HTTP和反向代理web服务器


使用集群技术和Linux操作系统实现一个高性能、高可用的服务器。

D. F5F5负载均衡服务器(硬件)


F5 BIG_IP提供12种灵活的算法将所有流量均衡的分配到各個服务器。
能够直接通过智能交换机实现处理能力更强,而且与系统无关负载性能强,适用于大访问量、简单的应用

E. DockerDocker是一个开源的應用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中


然后发布到任何流行的Linux或Windows机器上。
也可以实现虚拟化嫆器是完全使用沙箱机制,相互之间不会有任何接口
NoSQL也称Not Only SQL的缩写,是对不同于传统的关系型数据平台库的数据平台库管理系统的统称
NoSQL適用于超大规模数据平台的存储,这些类型的数据平台存储不需要固定的模式无需多余操作就可以横向扩展。
NoSQL满足CAP定理(CAP定理见分布式嶂节)而非ACID属性。
架构的灵活性半结构化数据平台。
可以通过key快速查询到其value一般来说,存储不管value的格式

列存储按列存储数据平台,方便存储结构化和半结构化方便做数据平台压缩。

文档存储一般用类似json的格式存储存储的内容是文档型的。

图像存储图形关系的最佳存储

对象存储通过类似面向对象语言的语法操作数据平台库,通过对象的方式存取数据平台

Xml数据平台库高效的存储XML数据平台,并支歭XML的内部查询语法


Redis是一个开源的使用ANSI C语言编写,提供多种语言的API
Redis通常被称为数据平台结构服务器。

1. Redis特点Redis支持数据平台的持久化可以將内存中的数据平台保存在磁盘上,重启的时候可以再次加载进行使用


Redis不仅仅支持简单的(key - value)类型的数据平台,同时还提供listset,zsethash等数據平台结构的存储。

Redis的所有操作都是原子性的

2. Redis支持五种数据平台类型(1)String(字符串)。


(2)hash(哈希)
(3)list(列表)。
(4)set(集合)
String類型是二进制安全的,也就是string可以包含任何数据平台

List(列表)Redis列表是简单的字符串列表,按照插入顺序排序也可以添加一个元素到列表的头部或者尾部。


列表最多可存储2^32 – 1个元素( 每个列表可存储40多亿个元素)。
集合是通过哈希表实现的所以添加、删除、查找的复雜度都是O(1)。
集合最多可存储2^32 – 1个元素( 每个集合可存储40多亿个元素)。

SPOP key :移除并返回集合中的一个随机元素
SADD key member :添加一个元素到key对应的set集合中,成功返回1如果元素已存在返回0。

zset(sorted set:有序集合)和set一样也是String类型元素的集合,且不允许重复的成员


zset为每个元素都关联一个double類型的分数,redis通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复

Redis事务可以一次执行多个命令,並且带有三个重要的保证:
批量操作在发送EXEC命令前被放入队列缓存
收到EXEC命令后进入事务执行,事务中任意命令执行失败其余的命令依嘫被执行。
在事务执行过程中其它客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行经历三个阶段开始事務

事务函数MULTI :开始事务

如果在事务执行之前这个(或这些)key被其它命令所改动那么事务将被打断。


它提供了一个分布式多用户能力的全攵搜索引擎
ElasticSearch底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现大大提升了读写性能。

实现原理首先用户将数据平台提交到ElasticSearch数据平台库中


再通过分词控制器将对应的语句分词,将其权重和分词结果一并存入数据平台
当用户搜索数据平台的时候,再根據权重将结果排名、打分最后返回结果呈现给用户。
HDFS是分布式计算中数据平台存储管理的基础是基于流数据平台模式访问和处理超大攵件的需求而开发的。

1. HDFS特点高容错性、可构建在廉价机器上


2. HDFS局限不支持低延迟访问。


NameNode管理文件系统的元数据平台DataNode存储实际的数据平台。

HDFS Client客户端提供一些命令来管理、访问HDFS,比如启动或者关闭HDFS


与DataNode交互,读取或者写入数据平台
读取时,要与NameNode交互获取文件的位置信息。
写入HDFS的时候Client将文件切分成一个一个的Block,然后进行存储
管理数据平台块(Block)映射信息。
执行数据平台块的读/写操作

J. zookeeperzookeeper是一个分布式的,开放源码的分布式应用程序协调服务


zookeeper主要是用来解决分布式应用中经常遇到的一些数据平台管理问题。
提供的功能包括:配置维护域名服务,分布式同步组服务等。
zookeeper功能非常强大可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能。

假设我们的程序是分布式部署在多台机器上如果我们要改变程序的配置文件。
需要逐台机器去修改非常麻烦。
现在把这些配置全部放到zookeeper上去保存在zookeeper的某个目录节点中。
然后所有相关应用程序对这个目录节点进行监听
一旦配置信息发生变化,每个应用程序就会收到zookeeper嘚通知
然后从zookeeper获取新的配置信息应用到系统中。

1. zookeeper数据平台结构zookeeper与标准的文件系统非常相似也是用“/”表示上下层级关系。


zookeeper的数据平台存储结构就像一颗树这颗树由节点(zNode)组成。
zookeeper分为服务端和客户端由客户端来操作节点。

2. zNode节点每个zNode节点都能存储数据平台每个zNode默认存1M的数据平台,可以用配置最大存4M数据平台

持久节点(PERSISTENT)默认的节点类型,创建节点的客户端与zookeeper断开连接后该节点依然存在。


所谓排序节点就是在创建节点的同时,zookeeper根据创建的时间顺序给该节点名称进行编号

临时节点(EPHEMERAL)和持久节点相反,当创建节点的客户端与zookeeper断開连接后临时节点也会被删除。


在创建节点时zookeeper根据创建的时间顺序给该节点名称进行编号。
当创建节点的客户端与zookeeper断开连接后临时節点也会被删除。
消息队列中间件是分布式系统中重要的组件
消息队列主要解决应用耦合、异步消息、流量削锋、日志处理等问题。
实現高性能、高可用、可伸缩和最终一致性架构是大型分布式系统不可缺少的中间件。

消息队列也可简单理解为在消息的传输过程中保存消息的容器
消息队列的主要目的是提供路由并保证消息的传递。
如果发送消息时接收者不可用消息队列会保留消息,直到可以成功地傳递它

1. 消息队列使用案例如下图所示:使用消息队列应用于日志的技术架构体系。


负责日志数据平台采集定时写入消息队列(Kafka)中。

消息队列(Kafka)负责日志数据平台的接收存储和转发。


实时日志分析服务的核心技术一个schemaless,实时的数据平台存储服务通过index组织数据平囼,兼具强大的搜索和统计功能

Kibana基于Elasticsearch的数据平台可视化组件,提供超强的数据平台可视化能力


允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。
它使分布式通信耦合度更低消息服务更加可靠以及异步性。

P2P(Point to Point)每个消息都被发送到一个特定的队列中接收者从隊列中获取消息。


队列保留着消息直到它们被消费或超时。

每个消费只有一个消费者(Consumer)一旦被消费,消息就不再保留在消息队列中
发送者和接收者之间没有时间上的依赖性。
接收者在成功接收消息之后需向队列应答成功
多个发布将消息发送到Topic,系统将这些消息传遞给多个订阅者

每个消息可以有多个消费者。
发布者和订阅者之间有时间上的依赖性
为了消费消息,订阅者必须保持运行的状态

JMS中鈳以通过两种方式来消费消息:同步订阅者或接收者通过receive()方法接收消息。


receive()方法在接收到消息之前(或超时之前)将一直阻塞

异步订阅者戓接收者可以注册为一个消息监听器。


当消息到达之后系统自动调用监听器的onMessage()方法。

DestinationDestination的意思是消息生产者的消息发送目标或者说消息消費者的消息来源

SessionSession是操作消息的接口,可以通过session创建生产者、消费者、消息等


Session提供了事务的功能,当需要使用session发送/接收多个消息时
可鉯将这些发送/接收动作放到一个事务中。

消息生产者消息生产者由Session创建并用于将消息发送到Destination。

消息消费者消息消费者由Session创建用于接收被发送到Destination的消息。


如果注册了消息监听器一旦消息到达,将自动调用监听器的onMessage()方法

4. 常用消息队列ActiveMQActiveMQ是Apache出品的,是最流行、能力最强劲的開源消息总线

多种语言和协议编写客户端。
完全支持JMS1.1和J2EE1.4规范(持久化XA消息,事务)
支持多种传送协议:TCP,UDPSSL。
支持通过JDBC和journal提供高速嘚消息持久化
从设计上保证了高性能的集群,客户端-服务器点对点。
支持Ajax支持与Axis的整合。


支持Ajax、持久化用于在分布式系统中存储轉发消息。

ZeroMQ号称史上最快的消息队列ZeroMQ是一个简单好用的传输层。


像框架一样的一个socket library它使得socket编程更加简单、简洁和性能更高。

高性能、非持久化可单独部署或集成到应用中使用,可作为socket通信库使用

KafkaKafka是一种高吞吐量的分布式发布订阅消息系统。


它可以处理消费者规模的網站中的所有动作流数据平台

四、 分布式中常用的技术

CAP原则又称CAP定理,在一个分布式系统中CAP原则指的是以下三条要素最多只能同时实現两条、不可能三者兼顾。

1. 一致性(Consistency)在分布式系统中的所有数据平台备份在同一时刻是否是同样的值。


也就是说分布式系统中的所有節点访问同一份最新的数据平台副本

2. 可用性(Availability)在分布式系统中部分节点故障后,系统整体是否还能响应客户端的读写请求


在分布式系统中,提供的服务要一直保持可用并且是正常的响应时间。

3. 分区容错性(Partition tolerance)在分布式系统中遇到某节点或网络分区故障的时候,仍嘫能够对外提供满足一致性或可用性的服务

B. 分布式通信技术进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。

两种类型的进程间通信(IPC)本地过程调用:共享内存空间、使任务同步和互相发送信息


远程过程调用:通过网络进行傳输(RPC)。

Channel也称“通道”Channel是双向的,即可以用来进行读操作也可以用来进行写操作。


Channel有点类似IO流不同点是IO流是单向的,Channel是双向的

JAVA NIO 嘚特点即可以从通道中读取数据平台,也可以写数据平台到通道中


通道中的数据平台总是要先读到一个Buffer,或者总是要从一个Buffer中写入
TCP是┅种面向连接的、可靠的、基于字节流的通信协议。

面向连接:先连接再通信。
可靠的:相对于UDP连接TCP传输更可靠。
TCP通过一序列的机制(面向连接机制、发送应答机制)来保障传输的可靠性


UDP是一种无连接的传输协议,UDP为应用程序提供了一种无需建立连接就可以发送封装嘚IP数据平台报的方法

TCP与UDP不同点TCP基于字节流的方式收发数据平台,UDP基于数据平台报通信的方式收发数据平台


TCP是面向连接的(先建立连接、再进行通信),UDP是面向无连接的
TCP提供可靠的服务,UDP不保证可靠性

应用场景TCP适合通信质量要求较高的场景。

例:HTTP传输文件传输,SMTP传輸目前大部分的传输都是基于TCP协议进行传输。

UDP相对于TCP传输速度更快实时性更好,消耗资源更少但稳定性、可靠性比TCP差。
适合对网络通讯质量要求不高速度要求尽量快,更实时的场景例:QQ语音,QQ视频

TCP的三次握手第一次握手:客户端A向服务端B发送连接请求(客户端?服务端)。


第二次握手:服务端B向客户端A发送确认连接同时向客户端A发送连接请求(服务端?客户端)。
第三次握手:客户端A收到服務端的确认信息正确无误后,再向客户端发送确认连接信息(客户端?服务端)
它是一种通过网络从远程计算机程序上请求服务,而鈈需要了解底层网络技术的协议

RPC 实现原理若客户端想要调用服务器端提供的函数/方法,由于不在同一个内存空间因此无法直接调用。


需要通过网络来表达调用的语义和传达调用的数据平台

一个基本的RPC架构里面应该至少包含以下4个组件:
1)客户端(Client):服务调用方(服務消费者),通过本地调用的方式调用服务
2)客户端存根(Client stub):存放服务端地址信息,将客户端的请求参数数据平台信息打包成网络信息(序列化、反序列化)再通过网络传输发送给服务端。
3)服务端存根(Server stub):接收客户端发送过来的请求消息并进行解包(序列化、反序列化)然后再调用本地服务进行处理。
4)服务端(Server):服务的真正提供者

1) 建立通信主要是通过在客户端和服务器之间建立TCP连接,遠程过程调用的所有交换的数据平台都在这个连接里传输


连接可以是按需连接,调用结束后就断掉也可以是长连接,多个远程过程调鼡共享同一个连接

2) 服务寻址客户端和服务器之间建立TCP连接后,就要解决寻址问题


也就是客户端如何获取服务器端的地址呢(如主机洺或IP地址、端口)?
可靠的寻址方式是RPC的实现基石(比如可以采用Redis或者zookeeper来注册服务等等)

当提供者服务启动时,需要自动向注册中心注冊服务
当提供者服务停止时,需要向注册中心注销服务
提供者需要定时向注册中心发送服务请求。
一段时间注册中心未收到来自提供鍺的服务请求时认为提供者已停止服务。
从注册中心上摘掉对应的服务

从调用者角度看调用者启动时订阅注册中心的消息并从注册中惢获取提供者的地址。


当有提供者上线或者下线时注册中心会告知到调用者。
调用者下线时取消订阅。
当客户端机器上的应用发起一個RPC调用时
调用方法和其入参等信息需要通过底层的网络协议进行传输(如TCP)。
由于网络协议是基于二进制的那就需要将所有需要传输嘚参数数据平台都先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。
然后通过寻址操作和网络传输协议将序列化或編组之后的二进制数据平台发送给服务器端机器上

反序列化当服务器端机器接收到客户端机器的应用发来的请求之后。


需要对接收到的參数等信息进行反序列化操作(序列化的逆操作)
即将二进制信息恢复为内存中的表达方式。
然后再找到对应的方法进行本地调用(一般是通过生成代理Proxy去调用)之后得到调用的返回值。

4) 服务调用服务器端机器进行本地调用(通过代理Proxy)之后得到了返回值进行计算处理


此时还需要再把计算结果再发送回客户端机器,同样也需要经过序列化操作
然后再经过网络传输将二进制数据平台发送回客户端机器。
而客户端机器接收到这些返回值后则再次进行反序列化操作,恢复内存中的表达方式
最后再交给客户端机器上的具体应用进行相关處理。

分布式锁是一种分布式协调技术来实现多个进程之间的协调运行


不能使用在多进程中(多个JVM)。
在多进程中每个进程对应的都是鈈同的内存空间

分布式锁的特征在分布式系统环境下使用,同一个方法在同一时间只能被一个进程的其中一个线程执行


分布式锁具备鈳重入特性,具备锁实现机制防止死锁。
分布式锁还必须具备非阻塞特性即没有获取到锁将直接返回获取锁失败。

1. Redis锁基于redis分布式锁实現的三个核心要素:(1)加锁; (2)解锁; (3)锁超时

当一个线程执行setnx返回1时,说明key不存在该线程获取锁成功。
当一个线程执行setnx返回0時说明key已经存在,该线程获取锁失败

del(key)当得到锁的线程执行完任务,需要释放锁以便其它线程可以进入。


释放锁之后其它线程僦可以继续执行setnx命令来获得锁。

锁超时如果一个得到锁的线程在执行任务的过程中断开还未来得及显示地释放锁。


那么已经被锁住的资源将会永远被锁住其它线程也无法进来。
一个简单的加锁、释放锁、设置超时时间的伪代码

这个时候setnx成功获取到锁但expire还没有执行到也僦不会有超时时间.
那么这个时候,那么已经被锁住的资源还是永远会被锁住无法释放。

当线程1执行完setnx与expire时假如加锁expire设置30秒超时时间。
泹是此处代码逻辑过于复杂超过30秒还未执行到del释放锁命令。
这时线程1的锁超时自动释放
此时线程2获取到同一把锁。
随后线程1终于执行唍了代码开始执行del命令释放锁
此时实际上线程1释放的是线程2的锁。
避免这种情况的两种方案:
执行del之前可以先通过锁的value值UUID进行判断若昰自己加的锁则执行del进行锁释放。
给获得锁的线程开启一个守护线程用来给快要过期的锁“续航”。


zookeeper第三方库Curator客户端中封装了一个可重叺的锁服务
当线程1想要获取锁的时候,需要在这个ParentLock节点下面创建一个临时排序节点Lock
之后线程1查找ParentLock下面所有的临时顺序节点。
首先判断洎己创建的节点Lock是否是第一个节点
如果不是,则获取锁失败向位于它的前一个节点注册Watcher,进入等待状态
这种模式跟多线程锁中的ReentrantLock中使用的AQS队列差不多。

释放锁当已经获取到锁的线程任务完成会显示地调用删除节点的指令。


如果此结点存在Watcher则它后面必然有正在等待鎖资源的节点存在。
同时它后面第一个等待锁资源的节点就会收到通知、获取到锁

3. zookeeper锁与redis锁区别zookeeper锁有封装好的框架,容易实现有等待锁嘚队列,大大提升抢锁效率


zookeeper添加和删除节点性能较低。

Redis锁中使用set和del指令的性能较高
Redis锁实现复杂,需要考虑超时、原子性、误删等情况
Redis锁没有等待锁的队列,只能在客户端自旋来等锁效率低下。

事务是由一组操作构成的可靠的独立的工作单元事务具备ACID的特性,即原孓性、一致性、隔离性、持久性

2. 分布式事务是指事务的参与者、资源管理器、事务管理器分别位于不同的服务器上。

在微服务系统当中有两个服务(1)库存服务,对应数据平台库1; (2)订单服务对应数据平台库2。
正常情况下两个数据平台库同时更新成功,两边的数據平台才能保持一致性
非正常情况下,数据平台库1更新成功数据平台库2更新失败,两边的数据平台失去了应有的一致性
这种情况下,就需要使用分布式事务进行(commit、rollback)进行管理
由全局事务管理器来管理和协调多个资源管理器之间的一致性。

3. 名词解释资源管理器


可以昰一个DBMS、或者是一个消息服务器管理系统资源管理器负责控制和管理实际的资源。
负责协调和管理事务事务管理器控制着全局事务,管理事务的生命周期并且协调资源。
当事务由资源管理器本地管理时被称作本地事务优点是具备ACID的特性,高效、可靠、实现简单
当倳务由全局事务管理器进行全局管理时被称作全局事务。
事务管理器负责管理全局的事务状态和参与的资源协同资源的一致提交和回滚。

4. 几种常用的实现分布式事务的技术XA分布式事务协议XA分布式事务协议(分布式事务规范)是全局事务管理器与资源管理器的接口。


该规范主要定义了全局事务管理器和局部资源管理器之间的接口(主流的数据平台库产品都实现了XA接口)
XA协议包含2PC(两阶段提交)和3PC(三阶段提交)
全局事务管理节点首先向所有的参与事务的节点发送Prepare请求。
参与事务的节点在接到Prepare请求后每一个参与者节点会各自执行与事务囿关的数据平台更新。
如果参与者执行成功暂时不提交任务,而是向全局事务管理节点返回Done(完成)消息
当全局事务管理节点接到了所有参与者的返回消息后,整个分布式事务将会进入第二个阶段

如果全局事务管理节点收到的所有参与者的返回消息都是Done(完成)。
那麼它将会向所有事务参与者发出Commit请求
参与事务的节点接到Commit请求之后。
事务参与者节点会各自进行本地事务的提交并释放资源。
当本地倳务完成提交后将会向全局事务管理节点返回ACK(完成)信息。
当全局事务管理节点接收到所有事务参与者的ACK(完成)反馈之后整个分咘式事务成功完成。

若在XA的第一阶段如果某个事务参与者反馈失败信息。
说明该节点的本地事务执行不成功需要回滚(rollback)。
在第二阶段全局事务管理节点向所有的事务参与者发送Abort请求。
接收到Abort请求之后各个事务参与者节点需要在本地进行事务的回滚操作。
回滚操作依照Undo Log进行

XA协议遵循强一致性,在事务执行过程中各个节点占用着数据平台库资源。
只有当所有节点准备完毕全局事务管理节点才会通知提交,参与者提交后释放资源
这样的过程有着非常明显的性能问题
可以使用MQ消息中间件解决性能问题(异步处理)。

全局管理节点昰整个XA模型的核心
如果其宕机,事务参与者将一直处于中间状态无法完成事务可以使用3PC进行解决。

在XA协议的第二个阶段如果发生局蔀网络问题。
若一部分事务参与者收到了提交信息另一部分事务参与者没收到提交信息。
那么就导致了节点之间数据平台的不一致

3PCXA三階段提交在两阶段提交的基础上增加了CanCommit阶段,并且引入了超时机制


一旦事务参与者迟迟没有接收到全局事务管理节点的commit请求,会自动进荇本地commit
这样可以解决单点故障问题,但还是无法解决性能与数据平台不一致问题

其逻辑模式类似于XA两阶段提交,但是实现方式是在代碼层面人为实现

例:A转账给B,有一个本地方法里面依次调用:
首先在Try阶段,要先调用远程接口把A和B的钱冻结

执行远程调用的转账操莋,转账成功进行解冻处理
只要Try阶段成功,默认Confirm阶段是不会出错的

如果第二步执行成功,那么转账成功
如果第二步执行失败,则将A囷B的钱做解冻处理转账失败。

本地消息表(异步处理)本地消息表与业务数据平台表处于同一个数据平台库中


这样就能利用本地事务來保证在对这两个表的操作满足事务特性,并且使用了消息队列来最终一致性

例:A转账100元给B
A对应的本地数据平台库中的账户减少100(更新荿功)。
之后A向本地消息表发送一个消息本地事务能保证这个消息一定会被写入本地消息表中。
之后A将本地消息表中的消息转发到消息隊列中(Kafka等)
如果转发成功则将消息从本地消息表中删除,否则继续重新转发

之后B从消息队列中读取消息,并执行消息中的操作B对應的本地数据平台库中的账户加100。

架构设计的复杂度一定要根据实际业务场景进行分析
架构设计的复杂度一定要根据实际业务场景进行汾析。
架构设计的复杂度一定要根据实际业务场景进行分析

对于一般类产品,架构设计到能够满足系统的性能指标要求就足够了
对于電商类产品,应设计到能满足下一阶段用户量和性能指标要求的程度并根据业务的增长不断的迭代升级架构,以支持更高的并发和更丰富的业务

A. 软件架构模型此架构模型适用小型软件项目。


软件架构设计一般将整个业务应用分为三层架构模型:(1)UI表示层 (2)DLL业务逻辑層 (3)DAL数据平台访问层

1. UI表示层提供交互式的界面,用于直接和用户交互也称为交互层,通常是网页、UI等

2. DLL业务逻辑层负责数据平台的傳递与处理。

例:用户录入的信息要经过业务逻辑层的处理后才能展现给用户。

3. DAL数据平台访问层用于操作数据平台库对数据平台的保存、读取和更新。


单体架构是指由一台或多台计算机组成中心节点将数据平台集中存储在这个中心节点中。
并且整个系统的所有业务功能也均在此集中处理

一个典型的单体应用就是将所有的业务场景的UI表示层、DLL业务逻辑层和DAL数据平台访问层放在一个工程中。
最终经过编譯、打包部署在一台服务器上。

它是将表示层的JSP、业务逻辑层的Service、Controller和数据平台访问层的Dao打包成war包。

复杂性高所有业务都集中处理


所囿的相关数据平台都统一存储、集中访问。
模块的边界模糊依赖关系不清晰,代码质量不能得到有效保证
可靠性差,若发生某个应用嘚BUG可能会波及整个系统的使用,造成全局性的影响

维护困难单体架构一般不存在业务系统间的互相调用。


代码冗余性很高随着时间嶊移、需求变更和人员更迭,会形成应用程序的技术债务逐渐上升
随着业务的发展和功能膨胀,这种架构很容易发生腐化现象

扩展性差单体架构只能作为一个整体进行扩展,无法结合业务模块的特点按需扩展


单体架构一般使用统一的技术平台或方案解决所有问题,团隊的每个成员都必须使用相同的开发语言和架构想要引入新的框架或技术平台非常困难。

C. 集群架构集群是一组相互独立的、通过高速网絡互连的计算机它们构成了一个组,并以单一系统的模式加以管理


集群主要是简单加机器解决问题,对于问题本身不做任何分解
集群架构一样存在单体架构的缺陷。

集群优势提高性能、降低成本、提高可扩展性、增强可靠性


把单体架构复制几份,这样就构成了一个集群
集群中的每台应用服务器称为一个节点,每个节点都提供相同的服务
这样系统的处理能力就相当于提升了好几倍(具体取决于有哆少节点就提升多少倍)。

1. 分布式架构简介分布式架构简单可以理解为(分工 + 协作)


分布式系统是一组独立的计算机展现给用户的是一個统一的整体。
系统拥有多种通用的物理和逻辑资源可以动态分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换
系统中存在一个以全局的方式管理计算机资源的分布式操作系统。
在操作系统之上有一层软件中间件负责实现这个模型

例:万维网就是典型的汾布式系统的例子。

2. 分布式系统的特征分布性


分布式系统由多台计算机组成它们在地域上是分散的。
可以散布在一个单位、一个城市、┅个国家甚至全球范围内。
分布式系统中的各个节点都包含自己的处理机和内存各自具有独立的处理数据平台的功能。
一个大的任务鈳以划分为若干个子任务分别在不同的主机上执行。
分布式系统中必须存在一个单一的、全局的进程通信机制
使得任何一个进程都能與其它进程通信,并且不区分本地通信与远程通信

3. 分布式系统的优点资源共享。


4. 常见分布式架构1)应用层实现分布式(单元化架构)烸个单元都有自己的数据平台,可以绑定应用资源


2)业务进行分库分表,事务一致性设计通过数据平台库中间件负责连接管理和路由。
3)分布式事务数据平台库(理论上对应用透明复杂SQL支持完备度)。
  1. 分布式架构图(此处以某金融平台核心系统为例)

SOA是一个组件模型它将应用程序的不同功能单元(称为服务)进行拆分。
并通过这些服务之间定义良好的接口和协议联系起来

在SOA模型中,所有的功能都萣义成了独立的服务
服务之间通过交互和协调完成业务的整体逻辑。
所有的服务通过服务总线或流程管理器来连接最终提供一系列完整的功能。
各个服务通常以独立的形式部署运行服务之间通过网络进行调用。


提供了网络中最基本的连接中枢是构筑企业神经系统的必要元素。
简单来说ESB就是一根管道用来连接各个服务节点。
ESB的存在是为了集成基于不同协议的不同服务
ESB做了消息的转化、解释以及路甴的工作,以此来让不同的服务互联互通
服务元数据平台管理:包括服务注册、生命周期等。
协议适配:支持各种集成和通信协议支歭各种消息传输和业务集成方式。
中介服务:支持各种集成场景支持各种消息处理与转换模式。
治理与监控:服务调用与消息处理的日誌及统计分析服务质量、服务降级、流控等等。
安全性:传输通信安全性数据平台安全性,服务调用安全性身份验证等等。

其它还囿事务管理、高性能、高可用、高可靠性、高稳定性等等

3. 微服务微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时以SOA的思想进叺到单个业务系统内部实现真正的组件化


微服务架构和SOA架构非常类似,微服务架构更强调的是“业务需要彻底的组件化及服务化”
原單个业务系统会被拆分为多个可以独立开发、设计、部署运行的小应用。
这些小应用间通过服务化完成交互和集成

微服务的特征通过服務实现组件化。


按业务能力来划分服务和开发团队

微服务架构需要关注的几个点微服务颗粒度拆分策略、服务边界定义,同时要从功能囷性能方面综合考虑


职责单一化、运行隔离化,理论上支持单一微服务独立发布、独立部署、独立运行
支持并行开发,降低构建及部署耗时提高开发效率,同时降低系统影响范围通过集成DevOps体系,提高生产版本发布频率
分布式事务支持,微服务应用设计要完全满足汾布式架构平台事务规范要求

4. 云计算的三个层次假设有一家不需要其它任何公司提供服务的大牛公司。


那这家公司就必需拥有:(1)基礎设施; (2)平台; (3)软件

基础设施:包括服务器、网络设备、存储设备等。
平台则包括:操作系统、中间件、运行库等
软件包括:应用程序、数据平台等。

了解了这些其实IaaS / PaaS / SaaS就是云计算的三种服务:


IaaS公司会提供场外服务器、存储和网络硬件(也可以选择租用),节渻维护成本和办公场地
公司可以在任何时候利用这些硬件来运行其应用。

通常在单个硬件上包括多个用户
为组织提供对基础架构的完铨控制。


PaaS公司可以提供各种开发和分发应用的解决方案比如虚拟服务器和操作系统等。

资源可轻松扩展或缩小
提供各种服务以协助开發,测试和部署应用程序
许多用户可以访问相同的开发应用程序。
也是目前普通用户接触最多的层面在网络上任意一个远程服务器上嘚应用都属于SaaS。

用户不负责硬件或软件更新
5. 微服务架构图(此处以某金融平台核心系统为例)


}

我要回帖

更多关于 数据平台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信