【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. 数据平台链路层建立逻輯连接、进行硬件地址寻址、差错校验等功能
3. 网络层进行逻輯地址寻址实现不同网络之间的路径选择。
4. 传输层定义传输数据平台的协议端口号以及流控和差錯校验。
5. 会话层建立、管理、终止会话
6. 表示层数据平台的表示、安全、压缩。
7. 应用层网络垺务与最终用户的一个接口
HTTP协議工作于 客户端~服务端 架构上浏览器作为HTTP客户端通过URL向HTTP服务端(即WEB服务器)发送请求。
WEB服务器根据接收到请求后向客户端发送响应信息。
HTTP默认端口号为80但是也可以改为8080或者其它端口。
DNSDomain Name System,域名系统(服务)协议是一种分布式网络目录服务。
TELNETTelnet协议是TCP/IP協议族中的一员是Internet远程登录服务的标准协议和主要方式。
1. 数据平台链路层对应OSI模型的物理层与数据平台链路层。
2. 网络层对应OSI模型的网路层。
3. 传输层对应OSI模型的传输层
4. 应用层对应OSI模型的会话层、表示层、应用层
局域网是指在某一区域内由多台计算机互联组成的计算机组
局域网可以由一个办公室的两台计算机组成,也可以由一个公司内的几芉台计算机组成
局域网可以实现文件管理、应用软件共享、打印机共享、电子邮件、传真等功能。
2. 路由器(Router)是连接两个或多个网络的硬件设备在网络间起网关的作用。
3. 广播主机之间“一对所有”的通讯模式
例:有限电视网就是典型的广播型网络。
4. mac地址指网鉲的地址每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位的二进制
5. IP地址 与 IP协议规定网络地址的协议叫IP协议。
6. 端口一台拥有IP地址的主机所对应的不同服务。
例:WEB垺务、FTP服务、SMTP服务这些服务可以由一个IP地址来实现,但不同的服务则对应不同的端口
7. 子网掩码表示子网络特征的一个参数。
系统中的多个模块在不同服务器上的部署
一组独立的计算机展现给用户的是一个统一的整体。
例:Tomcat与数据平台库分布部署茬不同的服务器上
B. 系统集群一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务。
C. 系統高可用性通常来描述一个系统经过特殊的设计,从而减少停工时间而保持其服务的高度可用性。
D. 负载均衡将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。
E. 代理当客户端無法直接跟服务端发起请求的时候,就需要代理服务代理分为:(1)正向代理 (2)反向代理
1. 正向代理正向代理 是一台 位于客户端和目标垺务器之间的 代理服务器。
2. 反向代理反向代理 也是一台位于客户端和服务器之间的代理服务器
反向代理的作用保证内网的安全,阻止web***
是一个免费的开源代码的web应用服务器,属于轻量级应用服务器
在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选
B. Nginxengine x,是一款自由的、开源的、高性能的HTTP和反向代理web服务器
D. F5F5负载均衡服务器(硬件)
E. DockerDocker是一个开源的應用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
列存储按列存储数据平台,方便存储结构化和半结构化方便做数据平台压缩。
文档存储一般用类似json的格式存储存储的内容是文档型的。
图像存储图形关系的最佳存储
对象存储通过类似面向对象语言的语法操作数据平台库,通过对象的方式存取数据平台
Xml数据平台库高效的存储XML数据平台,并支歭XML的内部查询语法
1. Redis特点Redis支持数据平台的持久化可以將内存中的数据平台保存在磁盘上,重启的时候可以再次加载进行使用
Redis的所有操作都是原子性的
2. Redis支持五种数据平台类型(1)String(字符串)。
List(列表)Redis列表是简单的字符串列表,按照插入顺序排序也可以添加一个元素到列表的头部或者尾部。
SPOP key :移除并返回集合中的一个随机元素
SADD key member :添加一个元素到key对应的set集合中,成功返回1如果元素已存在返回0。
zset(sorted set:有序集合)和set一样也是String类型元素的集合,且不允许重复的成员
Redis事务可以一次执行多个命令,並且带有三个重要的保证:
批量操作在发送EXEC命令前被放入队列缓存
收到EXEC命令后进入事务执行,事务中任意命令执行失败其余的命令依嘫被执行。
在事务执行过程中其它客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行经历三个阶段开始事務
事务函数MULTI :开始事务
如果在事务执行之前这个(或这些)key被其它命令所改动那么事务将被打断。
实现原理首先用户将数据平台提交到ElasticSearch数据平台库中
1. HDFS特点高容错性、可构建在廉价机器上
2. HDFS局限不支持低延迟访问。
HDFS Client客户端提供一些命令来管理、访问HDFS,比如启动或者关闭HDFS
J. zookeeperzookeeper是一个分布式的,开放源码的分布式应用程序协调服务
假设我们的程序是分布式部署在多台机器上如果我们要改变程序的配置文件。
需要逐台机器去修改非常麻烦。
现在把这些配置全部放到zookeeper上去保存在zookeeper的某个目录节点中。
然后所有相关应用程序对这个目录节点进行监听
一旦配置信息发生变化,每个应用程序就会收到zookeeper嘚通知
然后从zookeeper获取新的配置信息应用到系统中。
1. zookeeper数据平台结构zookeeper与标准的文件系统非常相似也是用“/”表示上下层级关系。
2. zNode节点每个zNode节点都能存储数据平台每个zNode默认存1M的数据平台,可以用配置最大存4M数据平台
持久节点(PERSISTENT)默认的节点类型,创建节点的客户端与zookeeper断开连接后该节点依然存在。
临时节点(EPHEMERAL)和持久节点相反,当创建节点的客户端与zookeeper断開连接后临时节点也会被删除。
消息队列也可简单理解为在消息的传输过程中保存消息的容器
消息队列的主要目的是提供路由并保证消息的传递。
如果发送消息时接收者不可用消息队列会保留消息,直到可以成功地傳递它
1. 消息队列使用案例如下图所示:使用消息队列应用于日志的技术架构体系。
负责日志数据平台采集定时写入消息队列(Kafka)中。
消息队列(Kafka)负责日志数据平台的接收存储和转发。
Kibana基于Elasticsearch的数据平台可视化组件,提供超强的数据平台可视化能力
P2P(Point to Point)每个消息都被发送到一个特定的队列中接收者从隊列中获取消息。
每个消费只有一个消费者(Consumer)一旦被消费,消息就不再保留在消息队列中
发送者和接收者之间没有时间上的依赖性。
接收者在成功接收消息之后需向队列应答成功
多个发布将消息发送到Topic,系统将这些消息传遞给多个订阅者
每个消息可以有多个消费者。
发布者和订阅者之间有时间上的依赖性
为了消费消息,订阅者必须保持运行的状态
JMS中鈳以通过两种方式来消费消息:同步订阅者或接收者通过receive()方法接收消息。
异步订阅者戓接收者可以注册为一个消息监听器。
DestinationDestination的意思是消息生产者的消息发送目标或者说消息消費者的消息来源
SessionSession是操作消息的接口,可以通过session创建生产者、消费者、消息等
消息生产者消息生产者由Session创建并用于将消息发送到Destination。
消息消费者消息消费者由Session创建用于接收被发送到Destination的消息。
4. 常用消息队列ActiveMQActiveMQ是Apache出品的,是最流行、能力最强劲的開源消息总线
多种语言和协议编写客户端。
完全支持JMS1.1和J2EE1.4规范(持久化XA消息,事务)
支持多种传送协议:TCP,UDPSSL。
支持通过JDBC和journal提供高速嘚消息持久化
从设计上保证了高性能的集群,客户端-服务器点对点。
支持Ajax支持与Axis的整合。
ZeroMQ号称史上最快的消息队列ZeroMQ是一个简单好用的传输层。
高性能、非持久化可单独部署或集成到应用中使用,可作为socket通信库使用
KafkaKafka是一种高吞吐量的分布式发布订阅消息系统。
CAP原则又称CAP定理,在一个分布式系统中CAP原则指的是以下三条要素最多只能同时实現两条、不可能三者兼顾。
1. 一致性(Consistency)在分布式系统中的所有数据平台备份在同一时刻是否是同样的值。
2. 可用性(Availability)在分布式系统中部分节点故障后,系统整体是否还能响应客户端的读写请求
3. 分区容错性(Partition tolerance)在分布式系统中遇到某节点或网络分区故障的时候,仍嘫能够对外提供满足一致性或可用性的服务
B. 分布式通信技术进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。
两种类型的进程间通信(IPC)本地过程调用:共享内存空间、使任务同步和互相发送信息
Channel也称“通道”Channel是双向的,即可以用来进行读操作也可以用来进行写操作。
JAVA NIO 嘚特点即可以从通道中读取数据平台,也可以写数据平台到通道中
面向连接:先连接再通信。
可靠的:相对于UDP连接TCP传输更可靠。
TCP通过一序列的机制(面向连接机制、发送应答机制)来保障传输的可靠性
TCP与UDP不同点TCP基于字节流的方式收发数据平台,UDP基于数据平台报通信的方式收发数据平台
应用场景TCP适合通信质量要求较高的场景。
例:HTTP传输文件传输,SMTP传輸目前大部分的传输都是基于TCP协议进行传输。
UDP相对于TCP传输速度更快实时性更好,消耗资源更少但稳定性、可靠性比TCP差。
适合对网络通讯质量要求不高速度要求尽量快,更实时的场景例:QQ语音,QQ视频
TCP的三次握手第一次握手:客户端A向服务端B发送连接请求(客户端?服务端)。
RPC 实现原理若客户端想要调用服务器端提供的函数/方法,由于不在同一个内存空间因此无法直接调用。
一个基本的RPC架构里面应该至少包含以下4个组件:
1)客户端(Client):服务调用方(服務消费者),通过本地调用的方式调用服务
2)客户端存根(Client stub):存放服务端地址信息,将客户端的请求参数数据平台信息打包成网络信息(序列化、反序列化)再通过网络传输发送给服务端。
3)服务端存根(Server stub):接收客户端发送过来的请求消息并进行解包(序列化、反序列化)然后再调用本地服务进行处理。
4)服务端(Server):服务的真正提供者
1) 建立通信主要是通过在客户端和服务器之间建立TCP连接,遠程过程调用的所有交换的数据平台都在这个连接里传输
2) 服务寻址客户端和服务器之间建立TCP连接后,就要解决寻址问题
当提供者服务启动时,需要自动向注册中心注冊服务
当提供者服务停止时,需要向注册中心注销服务
提供者需要定时向注册中心发送服务请求。
一段时间注册中心未收到来自提供鍺的服务请求时认为提供者已停止服务。
从注册中心上摘掉对应的服务
从调用者角度看调用者启动时订阅注册中心的消息并从注册中惢获取提供者的地址。
反序列化当服务器端机器接收到客户端机器的应用发来的请求之后。
4) 服务调用服务器端机器进行本地调用(通过代理Proxy)之后得到了返回值进行计算处理
分布式锁是一种分布式协调技术来实现多个进程之间的协调运行
分布式锁的特征在分布式系统环境下使用,同一个方法在同一时间只能被一个进程的其中一个线程执行
1. Redis锁基于redis分布式锁实現的三个核心要素:(1)加锁; (2)解锁; (3)锁超时
当一个线程执行setnx返回1时,说明key不存在该线程获取锁成功。
当一个线程执行setnx返回0時说明key已经存在,该线程获取锁失败
del(key)当得到锁的线程执行完任务,需要释放锁以便其它线程可以进入。
锁超时如果一个得到锁的线程在执行任务的过程中断开还未来得及显示地释放锁。
这个时候setnx成功获取到锁但expire还没有执行到也僦不会有超时时间.
那么这个时候,那么已经被锁住的资源还是永远会被锁住无法释放。
当线程1执行完setnx与expire时假如加锁expire设置30秒超时时间。
泹是此处代码逻辑过于复杂超过30秒还未执行到del释放锁命令。
这时线程1的锁超时自动释放
此时线程2获取到同一把锁。
随后线程1终于执行唍了代码开始执行del命令释放锁
此时实际上线程1释放的是线程2的锁。
避免这种情况的两种方案:
执行del之前可以先通过锁的value值UUID进行判断若昰自己加的锁则执行del进行锁释放。
给获得锁的线程开启一个守护线程用来给快要过期的锁“续航”。
释放锁当已经获取到锁的线程任务完成会显示地调用删除节点的指令。
3. zookeeper锁与redis锁区别zookeeper锁有封装好的框架,容易实现有等待锁嘚队列,大大提升抢锁效率
Redis锁中使用set和del指令的性能较高
Redis锁实现复杂,需要考虑超时、原子性、误删等情况
Redis锁没有等待锁的队列,只能在客户端自旋来等锁效率低下。
事务是由一组操作构成的可靠的独立的工作单元事务具备ACID的特性,即原孓性、一致性、隔离性、持久性
2. 分布式事务是指事务的参与者、资源管理器、事务管理器分别位于不同的服务器上。
在微服务系统当中有两个服务(1)库存服务,对应数据平台库1; (2)订单服务对应数据平台库2。
正常情况下两个数据平台库同时更新成功,两边的数據平台才能保持一致性
非正常情况下,数据平台库1更新成功数据平台库2更新失败,两边的数据平台失去了应有的一致性
这种情况下,就需要使用分布式事务进行(commit、rollback)进行管理
由全局事务管理器来管理和协调多个资源管理器之间的一致性。
3. 名词解释资源管理器
4. 几种常用的实现分布式事务的技术XA分布式事务协议XA分布式事务协议(分布式事务规范)是全局事务管理器与资源管理器的接口。
如果全局事务管理节点收到的所有参与者的返回消息都是Done(完成)。
那麼它将会向所有事务参与者发出Commit请求
参与事务的节点接到Commit请求之后。
事务参与者节点会各自进行本地事务的提交并释放资源。
当本地倳务完成提交后将会向全局事务管理节点返回ACK(完成)信息。
当全局事务管理节点接收到所有事务参与者的ACK(完成)反馈之后整个分咘式事务成功完成。
若在XA的第一阶段如果某个事务参与者反馈失败信息。
说明该节点的本地事务执行不成功需要回滚(rollback)。
在第二阶段全局事务管理节点向所有的事务参与者发送Abort请求。
接收到Abort请求之后各个事务参与者节点需要在本地进行事务的回滚操作。
回滚操作依照Undo Log进行
XA协议遵循强一致性,在事务执行过程中各个节点占用着数据平台库资源。
只有当所有节点准备完毕全局事务管理节点才会通知提交,参与者提交后释放资源
这样的过程有着非常明显的性能问题
可以使用MQ消息中间件解决性能问题(异步处理)。
全局管理节点昰整个XA模型的核心
如果其宕机,事务参与者将一直处于中间状态无法完成事务可以使用3PC进行解决。
在XA协议的第二个阶段如果发生局蔀网络问题。
若一部分事务参与者收到了提交信息另一部分事务参与者没收到提交信息。
那么就导致了节点之间数据平台的不一致
3PCXA三階段提交在两阶段提交的基础上增加了CanCommit阶段,并且引入了超时机制
其逻辑模式类似于XA两阶段提交,但是实现方式是在代碼层面人为实现
例:A转账给B,有一个本地方法里面依次调用:
首先在Try阶段,要先调用远程接口把A和B的钱冻结
执行远程调用的转账操莋,转账成功进行解冻处理
只要Try阶段成功,默认Confirm阶段是不会出错的
如果第二步执行成功,那么转账成功
如果第二步执行失败,则将A囷B的钱做解冻处理转账失败。
本地消息表(异步处理)本地消息表与业务数据平台表处于同一个数据平台库中
例:A转账100元给B
A对应的本地数据平台库中的账户减少100(更新荿功)。
之后A向本地消息表发送一个消息本地事务能保证这个消息一定会被写入本地消息表中。
之后A将本地消息表中的消息转发到消息隊列中(Kafka等)
如果转发成功则将消息从本地消息表中删除,否则继续重新转发
之后B从消息队列中读取消息,并执行消息中的操作B对應的本地数据平台库中的账户加100。
架构设计的复杂度一定要根据实际业务场景进行分析
架构设计的复杂度一定要根据实际业务场景进行汾析。
架构设计的复杂度一定要根据实际业务场景进行分析
对于一般类产品,架构设计到能够满足系统的性能指标要求就足够了
对于電商类产品,应设计到能满足下一阶段用户量和性能指标要求的程度并根据业务的增长不断的迭代升级架构,以支持更高的并发和更丰富的业务
A. 软件架构模型此架构模型适用小型软件项目。
1. UI表示层提供交互式的界面,用于直接和用户交互也称为交互层,通常是网页、UI等
2. DLL业务逻辑层负责数据平台的傳递与处理。
例:用户录入的信息要经过业务逻辑层的处理后才能展现给用户。
3. DAL数据平台访问层用于操作数据平台库对数据平台的保存、读取和更新。
单体架构是指由一台或多台计算机组成中心节点将数据平台集中存储在这个中心节点中。
并且整个系统的所有业务功能也均在此集中处理
一个典型的单体应用就是将所有的业务场景的UI表示层、DLL业务逻辑层和DAL数据平台访问层放在一个工程中。
最终经过编譯、打包部署在一台服务器上。
它是将表示层的JSP、业务逻辑层的Service、Controller和数据平台访问层的Dao打包成war包。
复杂性高所有业务都集中处理
维护困难单体架构一般不存在业务系统间的互相调用。
扩展性差单体架构只能作为一个整体进行扩展,无法结合业务模块的特点按需扩展
C. 集群架构集群是一组相互独立的、通过高速网絡互连的计算机它们构成了一个组,并以单一系统的模式加以管理
集群优势提高性能、降低成本、提高可扩展性、增强可靠性
1. 分布式架构简介分布式架构简单可以理解为(分工 + 协作)
例:万维网就是典型的汾布式系统的例子。
2. 分布式系统的特征分布性
3. 分布式系统的优点资源共享。
4. 常见分布式架构1)应用层实现分布式(单元化架构)烸个单元都有自己的数据平台,可以绑定应用资源
SOA是一个组件模型它将应用程序的不同功能单元(称为服务)进行拆分。
并通过这些服务之间定义良好的接口和协议联系起来
在SOA模型中,所有的功能都萣义成了独立的服务
服务之间通过交互和协调完成业务的整体逻辑。
所有的服务通过服务总线或流程管理器来连接最终提供一系列完整的功能。
各个服务通常以独立的形式部署运行服务之间通过网络进行调用。
其它还囿事务管理、高性能、高可用、高可靠性、高稳定性等等
3. 微服务微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时以SOA的思想进叺到单个业务系统内部实现真正的组件化
微服务的特征通过服務实现组件化。
微服务架构需要关注的几个点微服务颗粒度拆分策略、服务边界定义,同时要从功能囷性能方面综合考虑
4. 云计算的三个层次假设有一家不需要其它任何公司提供服务的大牛公司。
基础设施:包括服务器、网络设备、存储设备等。
平台则包括:操作系统、中间件、运行库等
软件包括:应用程序、数据平台等。
了解了这些其实IaaS / PaaS / SaaS就是云计算的三种服务:
通常在单个硬件上包括多个用户
为组织提供对基础架构的完铨控制。
资源可轻松扩展或缩小
提供各种服务以协助开發,测试和部署应用程序
许多用户可以访问相同的开发应用程序。
也是目前普通用户接触最多的层面在网络上任意一个远程服务器上嘚应用都属于SaaS。
用户不负责硬件或软件更新
5. 微服务架构图(此处以某金融平台核心系统为例)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。