分布式系统的介绍(2)--分布式系统&中间件从入门到精通(二)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 分布式系统的介绍(2)--分布式系统&中间件从入门到精通(二)

上篇文章我们说了分布系统存在的意义,基础的线程进程运行模式,进程之间内存是相互独立的,多线程是在进程内部,共享同一个进程里的内存,进程之间也可以共享对象,但是就有了序列化和反序列化的开销。网络通信知识有BIO/NIO/AIO、java通常用的NIO非阻塞,把出现的事件交给event handler处理,不需要一个socket分配一个线程,一个线程可以处理多个socket套接字工作。

分布式系统的介绍(1)--分布式系统&中间件从入门到精通(一)

前面提到了计算机由五个部分组成,输入设备,CPU(运算、控制器),外存/内存,输出设备,那么大型分布式是不是也可以从这个维度来分析呢。


输入设备的变化


分布式系统由多个单节点组成,那么输出设备可以看做两种,一种是互相连接的多个节点,一个节点向另一个节点发送数据,那么这个发送数据的节点就是输出设备,另一种就是传统意义上的人机交互,输入设备。


输出设备的变化


和输入设备变化类似,一种就是多个节点相互连接的情况下,一个节点接收另一个节点发送的数据,那么这个接收数据的节点就是输入设备,另一种就是传统意义上的人机交互,输出设备。


控制器的变化


在单个机器中,控制器和运算器都在cpu中。在分布式系统中,则控制器指的是分布式系统中如何由多个节点通过网络连接在一起并通过消息的传递进行协调的系统,控制器主要作用就是协调或者控制节点之间接收或者传输信息的动作。

第一种:可以使用硬件负载均衡器来完成,请求发起方和请求处理方中有一个硬件负载均衡器设备,所有的请求和接收都会通过这个负载均衡器来控制,这是一种控制方式。

第二种:如果换成软件负载均衡也是可以的,比如换成LVS,这种方式的特点是代价低,可控制性强,即你可以想对自由的按照自己的需求去增加负载均衡策略。

上面这两种方式称为透明代理。在集群中,这种对于请求方和发起方都是透

的,他们只需要在负载均衡设备/负载均衡软件把消息发送/接收,发起消息方不用关系有多少台服务器提供服务,也不需要提供服务的地址。但这种方式有两点不足,一方面会增加服务器的开销,开销指流量的开销,还有延迟的开销(实际使用的时候延迟影响很小)。另一不足就是这个透明代理是处于必经之路,当代理出现宕机的时候,则会出现所有请求不能发送的场景,这种时候我们则需要考虑代理服务器热备份。不过在切换的时候请求还是会受到影响。

第三种:名称服务。名称服务跟透明服务最大的区别就是,请求发起和请求处理方中间没有代理服务,而是通过名称服务来获取需要发送的ip服务名称,或者通过名称服务爱获取需要接受的ip服务名称。这样当服务名称机器宕机的时候,可以给他一个默认的ip来直接连接请求处理的服务。所以这个优点就是当名称服务宕机的时候,我们有很多办法可以保证请求处理正常。缺点就是代码升级比较复杂,需要处理当名称服务宕机的时候业务逻辑。

第四种:规则服务。这个和名称服务类似,不需要通过负载均衡,直接请求者与发送者直接连接,那么请求发起如何获取请求处理的ip呢,则是通过规则服务的机器来负载均衡获取的。这种情况下,请求发起方和规则服务来进行交互就好,来实现负载,请求处理服务不需要与规则服务交互。

第五种:Master+Worker。这种方式是存在一个master节点来管理任务,由master把任务分配给不同的worker去进行处理。这种方式和前面场景不太一样,主要是任务分配和管理。


运算器的变化


在单机系统中,运算器具体的电子元件,而在分布式系统中,运算器由多个节点来组成的,计算机的单机能力又上线,而分布式系统中运算器运用多个节点的计算能力来完成任务。

首先我们如果有10个用户,10个用户全部访问单个服务器,压力太大,所以这时候就增加多个网站服务来增加运算,那么如何保证他们能负载均衡访问呢,通过DNS服务器进行调度和控制。

在日志的处理有一个经典的场景,当一个日志服务需要处理太多其他服务的日志,这时候就需要增加日志的服务器,这时候可以用前面说的master+worker解决,或者用规则服务器来解决。


存储器变化


传统的单机模式会吧存储器分为内存和外存,内存在系统宕机后就会消失,外存的数据则会持久化,当然也不会是绝对就吃华可靠的,在分布式系统中,我们需要把承担存储的多个节点组织起来,最基础的是key-value场景存储。

如果需要负载均衡则需要采用名称服务或者规则服务来使用,当然也可以用master-worker来分配使用。


分布式的难点


在单机系统中,程序就以自己机器上的时钟为准,那么分布式的情况下,怎么控制呢,每个节点都有字节的时钟,在消息相互发送进行协调时候,如果依赖时钟,则相对难处理。这个问题首先想到的解决办法是保证每个节点的时间一致,当然如果能保证是最好的,但是这个方法本身没有办法实现,因为同步的时候本身就存在时间差,但有的时候,我们需要区分两个动作的先后顺序,而不是一定要知道准确的时间,这种情况,我们可以把工作交给单独的集群来解决。

面对故障独立性,分布式系统由多个节点组成,整个分布式完全出问题的概率是存在的,但多数情况都是出现某个节点不可用,但是其他节点还可以用,在单机的情况下,如果我们不使用多进程的方式,基本不会遇到独立障碍,只要出现机器问题或者OS问题或者程序bug,就会直接整体不可用,但是分布式会出现单个节点不可用而不影响整体使用,这时候就要找出相对应的哪个节点故障。

那发生了单点故障之后,也就是SPoF(Single Point of Failure)。我们需要在分布式系统中尽量避免出现单点故障,避免单点的关键就是把单点编程集群,当然这种比较困难,如果不能把单点部署成集群有另外两种办法。1、给这个单点做个容灾备份,手动恢复,尽量做成自动恢复,减少恢复时间。2、降低故障影响范围。可以把数据库拆分成多份,这样其中一个数据库出现故障,另一个数据库还能访问其他的数据,这样影响范围降低。但是一台数据库拆分成多台之后,会增加出故障的次数和时间,本质上这种方式更多是转移和交换故障。

分布式事务挑战,单机的分布式很好解决,但是不同节点之间的事务回滚就比较难实现,大家或许都听过2pc两阶段提交的缺陷,最终一致性,cap理论等,这些在后面会做详细介绍。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
15天前
|
存储 关系型数据库 分布式数据库
分布式事务:共识之外,分布式系统状态管理的另一大基石
本文深入探讨了分布式系统中“共识”与“事务”两大核心技术的本质区别与协同关系。
165 20
|
4月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
|
3天前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
55 2
|
9天前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
38 1
|
8月前
|
存储 缓存 NoSQL
分布式系统架构8:分布式缓存
本文介绍了分布式缓存的理论知识及Redis集群的应用,探讨了AP与CP的区别,Redis作为AP系统具备高性能和高可用性但不保证强一致性。文章还讲解了透明多级缓存(TMC)的概念及其优缺点,并详细分析了memcached和Redis的分布式实现方案。此外,针对缓存穿透、击穿、雪崩和污染等常见问题提供了应对策略,强调了Cache Aside模式在解决数据一致性方面的作用。最后指出,面试中关于缓存的问题多围绕Redis展开,建议深入学习相关知识点。
587 8
|
4月前
|
消息中间件 存储 中间件
分布式消息中间件基础
消息中间件是一种基于异步消息传递的分布式系统通信工具,核心功能包括消息传输、存储、路由与投递,能够实现系统解耦、异步处理和流量削峰。其主要组件包括生产者、消费者、Broker、主题/队列等,支持点对点和发布-订阅两种消息模型。主流中间件如Kafka(高吞吐)、RabbitMQ(灵活路由)、RocketMQ(事务支持)各有特色,适用于不同场景。此外,中间件还涉及多种协议(AMQP、MQTT等)、可靠性传输机制(持久化、确认机制)、顺序性与重复性问题解决以及事务支持(两阶段提交、本地消息表等)。选择中间件需根据业务需求权衡性能、功能和运维成本。
|
8月前
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
364 5
|
8月前
|
NoSQL 关系型数据库 MySQL
分布式系统学习9:分布式锁
本文介绍了分布式系统中分布式锁的概念、实现方式及其应用场景。分布式锁用于在多个独立的JVM进程间确保资源的互斥访问,具备互斥、高可用、可重入和超时机制等特点。文章详细讲解了三种常见的分布式锁实现方式:基于Redis、Zookeeper和关系型数据库(如MySQL)。其中,Redis适合高性能场景,推荐使用Redisson库;Zookeeper适用于对一致性要求较高的场景,建议基于Curator框架实现;而基于数据库的方式性能较低,实际开发中较少使用。此外,还探讨了乐观锁和悲观锁的区别及适用场景,并介绍了如何通过Lua脚本和Redis的`SET`命令实现原子操作,以及Redisson的自动续期机
915 7
|
11月前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门

热门文章

最新文章