分布式系统怎么将任务分发到这些计算机节点呢?|

一。什么是分布式系统 分布式系统是由一组计算机节点组成的系统,这些计算机节点通过网络进行通信并协调它们的工作以完成共同的任务。分布式系统的出现,就是利用廉价普通的机器来完成单台计算机无法完成的计算和存储任务。目的是使用更多的机器来处理更多的数据。首先需要明确的是,只有当单个节点的处理能力无法满足不断增加的计算和存储任务,硬件升级(加内存、加磁盘、使用更好的CPU)高到无法满足得不偿失,应用程序当我们无法进一步优化时,我们需要考虑分布式系统。因为分布式系统本身要解决的问题和单机系统是一样的,而且由于分布式系统的拓扑结构是多节点,通过网络进行通信,会引入很多问题-单独的系统没有。为了解决这些问题,会引入更多的机制和协议,带来更多的问题。. . 在很多文章中,分布式系统主要分为分布式计算(computation)和分布式存储(storage)。计算和存储相辅相成。计算需要来自实时数据(流数据)或存储数据的数据;计算结果也需要存储。计算和存储在操作系统中进行了非常详细的讨论,而分布式系统只是将这些理论推广到多个节点。那么分布式系统是如何将任务分配给这些计算机节点的呢?简单的思路就是分而治之,也就是分区。

对于计算来说,就是切换计算任务,计算每个节点的一部分,最后总结。这就是MapReduce的思路;对于存储,最好理解为每个节点存储一部分数据。当数据规模变大时,Partition 是唯一的选择,同时也带来了一些好处:(1)提高性能和并发,操作分布到不同的shard,相互独立(2)提高系统的可用性,即使有些分片不可用,其他分片也不会受到影响。理想情况下是有分片的,但实际情况并不理想。原因是分布式系统中有大量节点,并通过网络进行通信。单个节点的故障(进程崩溃、电源故障、磁盘损坏)是小概率事件,但整个系统的故障率会随着节点的增加呈指数级增长,网络通信也可能出现断线、高延迟的情况。在这种不可避免会发生的“异常”情况下,分布式系统仍然需要持续稳定地提供服务,也就是需要很强的容错能力。最简单的方法是冗余或复制集(Replication)。),即多个节点负责同一个任务。最常见的是分布式存储,其中多个节点以复杂的方式存储相同的数据以提高可用性和可靠性。同时,Replication 也会提升性能,比如数据的局部性可以减少用户的等待时间。

分区和复制是解决分布式系统问题的组合拳。这个想法可以解决很多具体的问题。但这不是灵丹妙药,通常解决一个问题,它会引入更多的问题,例如用于可用性和可靠性保证的冗余(复制集)。有了冗余,副本之间的一致性问题就成了一个头疼的问题,一致性从系统的角度和用户的角度分为不同的层次。如果要保证强一致性,会影响可用性和性能,这在某些应用(如电子商务、搜索)中是无法接受的。如果是最终一致性节点延迟是什么意思,则需要处理数据冲突的情况。CAP 和 FLP 的理论告诉我们,在分布式系统中,没有最优选择,并且需要权衡取舍才能做出最合适的选择。分布式系统挑战 分布式系统需要大量机器协同工作,面临诸多挑战: 一、异构机器和网络:分布式系统中的机器有不同的配置,运行在其上的服务也可能用不同的语言编写,架构是实现的,所以处理能力也不同;节点之间通过网络连接,不同网络运营商提供的网络带宽、时延、丢包率不同。如何保证大家齐头并进,共同实现目标,这四个挑战都不小。二、常见节点故障:虽然单个节点的故障概率较低,当节点数量达到一定规模时,失败的概率会变得更高。分布式系统需要保证在发生故障时系统仍然可用,这就需要监控节点的状态,并在节点发生故障时将节点负责的计算和存储任务转移给其他节点。三、网络不可靠:节点通过网络进行通信,网络不可靠。可能的网络问题包括:网络分段、延迟、丢包和乱序。与单机程序调用相比,网络通信中最麻烦的是超时:节点A向节点B发送请求,但在约定的时间内没有收到节点B的响应,则不确定B是否已经处理完毕。要求。这种不确定性会带来很多问题。最简单的就是是否重试请求,Node B 是否会多次处理同一个请求。总而言之,分发的挑战来自于不确定性,不确定计算机何时崩溃或断电,何时磁盘损坏,每次网络通信会延迟多长时间,以及通信对等方是否处理发送的消息。. 分布的规模放大了这种不确定性,而不确定性是烦人的,所以有很多分布式的理论和协议来保证系统在这种不确定性下能够继续正常运行。工作。而且,实际系统中的很多问题都来自设计时的盲目乐观,认为这个那个应该不是问题。

延迟为零。

带宽是无限的。

网络是安全的。

拓扑不变。

有一名管理员。

运输成本为零。

网络是同质的。刘杰在《分布式系统原理导论》中指出,处理这些异常的最佳原则是:在设计、推导和验证分布式系统的协议和流程时,最重要的任务之一就是思考在流程的每一步执行,一旦发生各种异常,对系统的处理方式和由此产生的影响。分布式系统特性和度量标准透明性:使用分布式系统的用户并不关心系统是如何实现的,也不关心他们读取的数据来自哪个节点。对于用户来说,分布式系统的最高层次是用户从根本上不认为这是一个分布式系统。在《分布式系统原理与范式》一书中,作者是这样说的:分布式系统是独立计算机的集合,在用户看来是一个单一的连贯系统。可扩展性能:分布式系统的基本目标是处理单台计算机无法处理的任务。当任务数量增加时,分布式系统的处理能力需要增加。简单来说,增加机器数量来应对数据量的增加会更方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。分布式系统是独立计算机的集合,在用户看来是一个单一的连贯系统。可扩展性能:分布式系统的基本目标是处理单台计算机无法处理的任务。当任务数量增加时,分布式系统的处理能力需要增加。简单来说,增加机器数量来应对数据量的增加会更方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。分布式系统是独立计算机的集合,在用户看来是一个单一的连贯系统。可扩展性能:分布式系统的基本目标是处理单台计算机无法处理的任务。当任务数量增加时,分布式系统的处理能力需要增加。简单来说,增加机器数量来应对数据量的增加会更方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。分布式系统的基本目标是处理单台计算机无法处理的任务。当任务数量增加时,分布式系统的处理能力需要增加。简单来说,增加机器数量来应对数据量的增加会更方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。分布式系统的基本目标是处理单台计算机无法处理的任务。当任务数量增加时,分布式系统的处理能力需要增加。简单来说节点延迟是什么意思,增加机器数量来应对数据量的增加会更方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。增加机器数量来应对数据量的增加更加方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。增加机器数量来应对数据量的增加更加方便。同时,当任务规模缩小时,可以去掉部分冗余机器,达到动态扩展的效果。可用性和可靠性:一般来说,分布式系统需要长时间甚至7*24小时提供服务。

可用性是指系统在各种情况下对外提供服务的能力。简单来说,可以通过知道不可用时间和正常服务时间来衡量;而可靠性是指计算结果正确且存储的数据不丢失。高性能:无论是单机还是分布式系统,大家都很关心性能。不同的系统有不同的性能指标。最常见的有:高并发,单位时间内处理的任务越多越好;低延迟:每个任务的平均时间越少越好。这其实和操作系统 CPU 的调度策略非常相似:分布式系统一般会引入冗余(复制集)以提高可用性和可靠性。那么如何保证这些节点上的状态是一致的,这是分布式系统不得不面对的一致性问题。有许多级别的一致性。一致性越强,越人性化,但会限制系统的可用性;一致性级别越低,用户需要兼容不一致的数据,但系统的可用性和并发性要高得多。组件、理论、协议 回页首 假设这是一个向外界提供服务的大型分布式系统,用户连接到系统,做一些操作,生成一些需要存储的数据,那么有哪些组件和理论在这个过程中会遇到 协议与请求相关联。用户使用Web、APP、和 SDK 通过 HTTP 和 TCP 连接到系统。在分布式系统中,为了高并发和高可用,通常多个节点提供相同的服务。那么,第一个问题就是选择哪个节点来提供服务,也就是负载均衡。

负载均衡的思想很简单,但是应用非常广泛。它用于分布式系统和大型网站的各个方面。也就是说,只要涉及多个节点提供同质服务,就需要负载均衡。通过负载均衡找到节点后,接下来就是实际处理用户的请求了。请求可能很简单,也可能很复杂。简单的请求,比如读取数据,很可能会被缓存,也就是分布式缓存。如果缓存没有命中,则需要去数据库拉取数据。对于复杂的请求,可能会调用系统中的其他服务。继续上面,假设服务A需要调用服务B的服务。首先,两个节点需要通信。网络通信基于 TCP/IP 协议。然而,为每个应用程序手动编写套接字既复杂又低效。因此,需要对应用层进行封装,于是就有了HTTP、FTP等各种应用层协议。当系统变得更加复杂时,也很难提供大量的http接口。因此,还有一个更进一步的抽象,即RPC(remote producer call)。是的,远程调用和本地过程调用一样方便,屏蔽了网络通信等很多细节,增加新接口也更方便。一个请求可能包含很多操作,即对服务A进行一些操作,然后对服务B进行其他操作。例如简化版的网上购物、订单服务上的发货、账户扣款服务。

这涉及分布式事务的问题。分布式事务从应用层面保证一致性:一定的守恒关系。如前所述,一个请求包含多个操作,但实际上涉及多个服务。分布式系统中有大量的服务,每个服务由多个节点组成。那么一个服务如何找到另一个服务的(一个节点)呢?通讯需要地址。获取这个地址最简单的方法就是把配置文件写死或者写入数据库。但是,当节点数据庞大,动态添加或删除节点时,这些方法很不方便。这个时候就需要服务了。注册和发现:提供服务的节点向协调中心注册自己的地址,使用该服务的节点去协调中心拉地址。由上可知,协调中心提供集中式服务:一组节点提供类似的单点服务,应用广泛,如命令服务、分布式锁等。最著名的协调中心是chubby,zookeeper。回到用户请求的点,请求操作会产生一些数据和日志,通常是信息,而其他一些系统可能对这些消息感兴趣,比如个性化推荐、监控等。这里抽象了两个概念,消息生产者和消费者。那么生产者如何向消费者发送消息呢?RPC 不是一个好的选择,因为 RPC 必须指定消息发送给谁,但实际情况是生产者不知道也不关心谁会消费该消息。,此时消息队列已出。简单来说,生产者只需要将其发送到消息队列中,队列就会根据主题将消息分发给关注该主题的消费者。

消息队列起到异步处理和应用解耦的作用。如上所述,用户操作会产生一些数据,这些数据忠实地记录了用户的操作习惯和喜好,是各行各业最宝贵的财富。如各种推荐、广告、自动识别。这就催生了分布式计算平台,比如 Hadoop、Storm 等来处理这些海量数据。最后,用户操作完成后,需要对用户数据进行持久化,但是数据量太大,单个节点无法存储,这时就需要分布式存储:将数据分到不同节点上,同时,为了防止数据丢失,每条数据都会多点保存。传统的关系数据库是单点存储。为了在应用层透明的情况下划分数据库和表,会额外引用一个代理层。对于 NoSql 来说,分布式一般自然是支持的。在一个简化的架构图下面,用一个不太准确的架构图来尽可能还原分布式系统的组件(但它只能反映技术,不能反映理论)

概念与实现 那么对于上述的各种技术和理论,在业界都有哪些实现呢?以下是一个简短的列表。当然,我使用了以下实现的一小部分,我知道为什么;他们中的大多数人都听说过,我知道;有的没听过,分类不一定对,是抄其他文章的。此处列出以供将来研究。负载均衡:Nginx:高性能、高并发的Web服务器;功能包括负载均衡、反向代理、静态内容缓存、访问控制;工作在应用层LVS:Linux虚拟服务器,基于集群技术和Linux操作系统,实现高性能、高可用的服务器;在网络层 webserver 工作:Java:Tomcat、Apache、Jboss Python:gunicorn、uwsgi、twisted、webpy、tornadoservice:SOA、微服务、spring boot、django容器:docker、kubernetescache:memcache、redis等协调中心:zookeeper、etcd等zookeeper使用Paxos协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:tornadoservice:SOA、微服务、spring boot、django容器:docker、kubernetescache:memcache、redis等协调中心:zookeeper、etcd等zookeeper使用Paxos协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:tornadoservice:SOA、微服务、spring boot、django容器:docker、kubernetescache:memcache、redis等协调中心:zookeeper、etcd等zookeeper使用Paxos协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:django容器:docker、kubernetescache:memcache、redis等协调中心:zookeeper、etcd等zookeeper使用Paxos协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:django容器:docker、kubernetescache:memcache、redis等协调中心:zookeeper、etcd等zookeeper使用Paxos协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:zookeeper 和 etcd 等 Zookeeper 使用 Paxos 协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:zookeeper 和 etcd 等 Zookeeper 使用 Paxos 协议。Paxos 是一个高度一致、高度可用的去中心化发行版。zookeeper的使用场景非常广泛,后面会详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:这将在后面详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:这将在后面详细讨论。rpc框架:grpc、dubbo、brpc dubbo是阿里巴巴开源Java语言开发的高性能RPC框架。在阿里巴巴很多架构中使用dubbo+springboot消息队列:kafka、rabbitMQ、rocketMQ、QSP消息队列应用场景:异步处理、应用解耦、流量切割、消息通信实时数据平台:storm、akka离线数据平台:hadoop,火花 PS:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论