分布式学习:从分布式系统的特征开始

news2024/10/6 12:29:52

正文  

        

  在延伸feature(分布式系统需要考虑的特性)的时候,我逐渐明白,这是因为要满足这些feature,才设计了很多协议与算法,也提出了一些理论。比如说,这是因为要解决去中心化副本的一致性问题,才引入了Paxos(raft)协议。而每一个分布式系统,如分布式存储、分布式计算、分布式消息队列、分布式RPC框架,根据业务的不同,会使用不同的方法来满足这些feature,对这些feature的支持也可能会有权衡,比如一致性与可用性的权衡。

  所有,我觉得从分布式的特性出发,来一步步学习分布式是一种可行的方式。

从分布式系统的特征出发

分布式的世界中涉及到大量的协议(raft、2pc、lease、quorum等)、大量的理论(FLP, CAP等)、大量的系统(GFS、MongoDB、MapReduce、Spark、RabbitMQ等)。这些大量的知识总是让我们无从下手,任何一个东西都需要花费大量的时间,特别是在没有项目、任务驱动的时候,没有一个明确的目标,真的很难坚持下去。

  所以,我一直在思考,能有什么办法能把这些东西串起来?当我掌握了知识点A的时候,能够自然地想到接下来要学习B知识,A和B的关系,也许是递进的,也许是并列的。我也这样尝试了,那就是《什么是分布式系统,如何学习分布式系统》一文中我提到的,思考一个大型网站的架构,然后把这些协议、理论串起来。按照这个想法,我的计划就是去逐个学习这些组件。

  但是,其实在这里有一个误区,我认为一个大型网站就是一个分布式系统,包含诸多组件,这些组件是分布式系统的组成部分;而我现在认为,一个大型网站包含诸多组件,每一个组件都是一个分布式系统,比如分布式存储就是一个分布式系统,消息队列就是一个分布式系统。

  为什么说从思考分布式的特征出发,是一个可行的、系统的、循序渐进的学习方式呢,因为:

  (1)先有问题,才会去思考解决问题的办法

  由于我们要提高可用性,所以我们才需要冗余;由于需要扩展性,所以我们才需要分片

  (2)解决一个问题,常常会引入新的问题

  比如,为了提高可用性,引入了冗余;而冗余又带来了副本之间的一致性问题,所以引入了中心化副本协议(primary/secondary);那么接下来就要考虑primary(节点)故障时候的选举问题。。。

  (3)这是一个金字塔结构,或者说,也是一个深度优先遍历的过程。

  在这个过程中,我们始终知道自己已经掌握了哪些知识;还有哪些是已经知道,但未了解的知识;也能知道,哪些是空白,即我们知道这里可能有很多问题,但是具体是什么,还不知道。

  

  那么,各个分布式系统如何与这些特征相关联呢?不难发现,每个分布式系统都会或多或少的体现出这些特征,只是使用的方法、算法可能不大一样。所以,我们应该思考,某一个问题,在某个特定系统中是如何解决的。比如元数据管理的强一致性,在MongoDB中是如何实现的,在HDFS中是如何实现的。这也指导了我们如何去学习一个具体的分布式系统:带着问题,只关注关心的部分,而不是从头到尾看一遍。

  下面是,到目前为止,我对分布式特征的思维导图

   

  对于上图,需要声明的是,第一:不一定完全正确,第二:不完整。这是因为,我自己也在学习中,可以看到,很多分支很短(比如去中心化副本协议),不是因为这一块没有内容,而是我压根儿还没去了解,还没去学习。

  我会持续跟新这幅脑图的

  

  下一章,介绍一下分布式系统的各个特征。

分布式系统的一般特征

任何介绍分布式系统的文章或者书籍都会提到分布式系统的几个特性:可扩展性、高性能、高可用、一致性。这几个特性也是分布式系统的衡量指标,正是为了在不同的程度上满足这些特性(或者说达到这些指标),才会设计出各种各样的算法、协议,然后根据业务的需求在这些特性间平衡。

  那么本章节简单说明,为什么要满足这些特性,要满足这些特性需要解决什么问题,有什么好的解决方案。

可扩展性

  

Scalability is the capability of a system, network, or process to handle a growing amount of work, or its potential to be enlarged to accommodate that growth.

  可扩展性是指当系统的任务(work)增加的时候,通过增加资源来应对任务增长的能力。可扩展性是任何分布式系统必备的特性,这是由分布式系统的概念决定的:

分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统

  分布式系统的出现是为了解决单个计算机无法完成的计算、存储任务。那么当任务规模增加的时候,必然就需要添加更多的节点,这就是可扩展性。

  扩展性的目标是使得系统中的节点都在一个较为稳定的负载下工作,这就是负载均衡,当然,在动态增加节点的时候,需要进行任务(可能是计算,可能是数据存储)的迁移,以达到动态均衡。

  那么首先要考虑的问题就是,如何对任务进行拆分,将任务的子集分配到每一个节点,我们称这个过程问题Partition(Sharding)

第一:分片分式,即按照什么算法对任务进行拆分

  常见的算法包括:哈希(hash),一致性哈希(consistency hash),基于数据范围(range based)。每一种算法有各自的优缺点,也就有各自的适用场景。

第二:分片的键,partition key

  partition key是数据的特征值,上面提到的任何分片方式都依赖于这个partition key,那么该如何选择呢

 based on what you think the primary access pattern will be

  partition key会影响到任务在分片之间的均衡,而且一些系统中(mongodb)几乎是不能重新选择partition key的,因此在设计的时候就得想清楚

第三:分片的额外好处

  提升性能和并发:不同的请求分发到不同的分片

  提高可用性:一个分片挂了不影响其他的分片

第四:分片带来的问题

  如果一个操作需要跨越多个分片,那么效率就会很低下,比如数据中的join操作

第五:元数据管理

  元数据记录了分片与节点的映射关系、节点状态等核心信息,分布式系统中,有专门的节点(节点集群)来管理元数据,我们称之为元数据服务器。元数据服务器有以下特点:

  高性能:cache

  高可用:冗余 加 快速failover

  强一致性(同时只有一个节点对外提供服务)

第六:任务的动态均衡

  为了达到动态均衡,需要进行数据的迁移,如何保证在迁移的过程中保持对外提供服务,这也是一个需要精心设计的复杂问题。

可用性

  

  可用性(Availability)是系统不间断对外提供服务的能力,可用性是一个度的问题,最高目标就是7 * 24,即永远在线。但事实上做不到的,一般是用几个9来衡量系统的可用性,如下如所示:

  

  也就是如果要达到4个9的可用度(99.99%),那么一年之中只能有52.6分钟不可用,这是个巨大的挑战

  为什么分布式系统中必须要考虑可用性呢,这是因为分布式系统中故障的概率很高。分布式系统由大量异构的节点和网络组成,节点可能会crash、断电、磁盘损坏,网络可能丢包、延迟、网络分割。系统的规模放大了出故障的概率,因此分布式系统中,故障是常态。那么分布式系统的其中一个设计目标就是容错,在部分故障的情况下仍然对外提供服务,这就是可用性。

  冗余是提高可用性、可靠性的法宝

  冗余就是说多个节点负责相同的任务,在需要状态维护的场景,比如分布式存储中使用非常广泛。在分布式计算,如MapReduce中,当一个worker运行异常缓慢时,master会将这个worker上的任务重新调度到其它worker,以提高系统的吞吐,这也算一种冗余。但存储的冗余相比计算而言要复杂许多,因此主要考虑存储的冗余。

  维护同一份数据的多个节点称之为多个副本。我们考虑一个问题,当向这个副本集写入数据的时候,怎么保证并发情况下数据的一致性,是否有一个节点有决定更新的顺序,这就是中心化、去中心话副本协议的区别。

中心化与去中心化

  中心化就是有一个主节点(primary master)负责调度数据的更新,其优点是协议简单,将并发操作转变为顺序操作,缺点是primar可能成为瓶颈,且在primary故障的时候重新选举会有一段时间的不可用。

  去中心化就是所有节点地位平等,都能够发起数据的更新,优点是高可用,缺点是协议复杂,要保证一致性很难。

  提到去中心化,比较有名的是dynamo,cassandra,使用了quorum、vector clock等算法来尽量保证去中心化环境下的一致性。对于去中心化这一块,目前还没怎么学习,所以下面主要讨论中心化副本集。

节点更新策略

  primary节点到secondary节点的数据时同步还是异步,即客户端是否需要等待数据落地到副本集中的所有节点。

  同步的优点在于强一致性,但是可用性和性能(响应延迟)比较差;异步则相反。

数据流向

  即数据是如何从Primary节点到secondary节点的,有链式和主从模式。

  链式的优点时充分利用网络带宽,减轻primary压力,但缺点是写入延迟会大一些。GFS,MongoDB(默认情况下)都是链式。

部分节点写入异常

  理论上,副本集中的多个节点的数据应该保持一致,因此多个数据的写入理论上应该是一个事务:要么都发生,要么都不发生。但是分布式事务(如2pc)是一个复杂的、低效的过程,因此副本集的更新一般都是best effort 1pc,如果失败,则重试,或者告诉应用自行处理。

primary的选举

  在中心化副本协议中,primary节点是如何选举出来的,当primary节点挂掉之后,又是如何选择出新的primary节点呢,有两种方式:自治系统,依赖其他组件的系统。(ps,这两个名字是我杜撰的 。。。)

  所谓的自治系统,就是节点内部自行投票选择,比如mongodb,tfs,zookeeper

  依赖其他组件的系统,是指primary由副本集之后的组件来任命,比如GFS中的primary由master(GFS的元数据服务器)任命,hdfs的元数据namenode由zookeeper心跳选出。

secondary是否对外提供服务(读服务)

   中心化复制集中,secondary是否对外提供读服务,取决于系统对一致性的要求。

  比如前面介绍到节点更新策略时,可能是异步的,那么secondary上的数据相比primary会有一定延迟,从secondary上读数据的话无法满足强一致性要求。

  比如元数据,需要强一致性保证,所以一般都只会从primary读数据。而且,一般称主节点为active(master),从节点为standby(slave)。在这种情况下,是通过冗余 加上 快速的failover来保证可用性。

一致性

  

  从上面可以看到,为了高可用性,引入了冗余(副本)机制,而副本机制就带来了一致性问题。当然,如果没有冗余机制,或者不是数据(状态)的冗余,那么不会出现一致性问题,比如MapReduce。

  一致性与可用性在分布式系统中的关系,已经有足够的研究,形成了CAP理论。CAP理论就是说分布式数据存储,最多只能同时满足一致性(C,Consistency)、可用性(A, Availability)、分区容错性(P,Partition Tolerance)中的两者。但一致性和可用性都是一个度的问题,是0到1,而不是只有0和1两个极端。详细可以参考之前的文章《CAP理论与MongoDB一致性,可用性的一些思考》

  一致性从系统的角度和用户的角度有不同的等级。

系统角度的一致性

   强一致性、若一致性、最终一致性

用户角度的一致性

   单调读一致性,单调写一致性,读后写一致性,写后读一致性

高性能

  

   正式因为单个节点的scale up不能完成任务,因此我们才需要scale out,用大量的节点来完成任务,分布式系统的理想目标是任务与节点按一定的比例线性增长。

衡量指标

  高并发

  高吞吐

  低延迟

  不同的系统关注的核心指标不一样,比如MapReduce,本身就是离线计算,无需低延迟

可行的办法

  单个节点的scaleup

  分片(partition)

  缓存:比如元数据

     短事务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

司徒理财:8.16黄金行情走势分析及策略美盘看涨

黄金早盘已经给了1902的现价多单,日内最高触及1907!如期拉升!黄金现在筑底阶段,维持低多看涨思路,美盘1900附近继续做多看涨,等待反弹!黄金现在的下跌已经到达日线前低位置,继续破位…

程序员的新型生产力工具,效率起飞了~

文章目录 一、低代码平台存在的意义 二、国内外低代码开发研究现状 三、低代码开发平台设计与实现 系统架构总体设计 01.表单引擎设计 02.流程引擎设计 03.数据库设计 四、总结 一、低代码平台存在的意义 传统软件开发交付链中,需求经过3次传递,用户→业…

录取查询页面怎么做?

招生录取工作开始后,负责招生的老师需要完成一系列任务,其中包括确定招生录取名单和及时向考生公布录取情况。为了快速完成录取查询工作的发布,招生老师们可以采取以下步骤: 1. 整理录取名单:招生老师们首先需要整理好…

使用爱校对软件保证公文材料质量的关键步骤

在日常的公文处理中,保证材料质量是每个企业和机构都追求的目标。而要实现这个目标,使用正确的工具是关键。爱校对软件正是这样一款专业的校对工具,它可以帮助我们保证公文材料的质量。接下来,让我们一起来看看使用爱校对软件保证…

【网络编程系列】网络编程实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

JavaScript【节流(throttle)、Navigator 对象、Screen 对象】(十七)

目录 节流(throttle) 实现 window 对象_属性 window 对象_方法

java+springboot+mysql企业产品销售管理系统

项目介绍: 使用javaspringbootmysql开发的企业产品销售管理系统,系统包含管理员,员工(客服)、客户角色,功能如下: 管理员:首页(销售统计);系统用…

IntelliJ IDEA 常用快捷键及重构必备(2023)

一、日常必备 快捷键介绍Ctrl F在当前文件进行文本查找 (必备)Ctrl R在当前文件进行文本替换 (必备)Ctrl Z撤销 (必备)Ctrl Q光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候…

开源项目-java内容管理系统

哈喽,大家好,今天给大家带来一个开源项目-java内容管理系统。项目基于SpringBoot+Vue3开发 内容管理系统由前,后台两部分组成。 前端主要有首页,新闻,图片,视频,下载,文库,产品等模块组成 后台主要有内容管理,互动管理,文件管理,配置管理,统计管理,用户管理,…

Python入门--需要学习哪些框架

Python是一门通用编程语言,支持很多不同的应用场景,因此,学习Python需要根据自己的实际需求来选择相应的框架。以下是几个常用的Python框架: Django:用于构建Web应用程序的全栈框架,包含了ORM、模板引擎等组…

[windows]MAT- 下载及安装

1. 下载安装包 1.1MAT下载链接: https://pan.baidu.com/s/1sUWPITSto8MjOrcF0BsJQg?pwd1111 提取码:1111 1.2MAT需要jdk17版本及以上支持,下载链接: https://pan.baidu.com/s/111jz90S4tie_48lQeExcZg?pwd1111 提取码:1…

碎片笔记|图数据与图神经网络基础介绍

前言:前段时间了解了一下图神经网络,本篇博客记录一下相关知识,以备不时之需。 强烈推荐这篇博客(作者来自 Google Research),个人认为是图神经网络基础入门的不二选择! 目录 一、图数据1.1 定义…

@RequestMapping 注解以及其它使用方式

😀前言 本篇主要讲解RequestMapping 注解以及其它使用方式 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉&#…

SpringMVC之异常处理

SpringMVC之异常处理 异常分为编译时异常和运行时异常,编译时异常我们trycatch捕获,捕获后自行处理,而运行时异常是不可预期的,就需要规范编码来避免,在SpringMVC中,不管是编译异常还是运行时异常&#xff…

jenkins 连接服务器,提示Can‘t connect to server

在Jenkins 添加服务器时,提示 Cant connect to server,如图 搞了好久,不知道为什么不行~原来是行的,现在删了 新建一个也不行。

浅谈KNX总线技术在图书馆智能照明系统的应用

安科瑞 华楠 摘要:系统引入KNX总线实现的照明分布式智能控制,在提高馆所照明系统的节能效果、视觉效果和稳定性的基础上,展现了KNX总线部署便捷、扩充性强、可靠性高等自身要求,通过提升照明管理效率,营造了信息时代背…

蒙特卡洛树搜索(MCTS)在AlphaGo Zero中

蒙特卡洛树搜索(MCTS)在AlphaGo Zero中 一、说明 蒙特卡洛树(Monte Carlo Tree)是一种搜索算法,主要用于解决决策问题。它的核心思想是通过模拟游戏过程,评估各个节点的胜率,从而选择最优策略。…

dom靶场

靶场下载地址: https://www.vulnhub.com/entry/domdom-1,328/ 一、信息收集 获取主机ip nmap -sP 192.168.16.0/24netdiscover -r 192.168.16.0/24端口版本获取 nmap -sV -sC -A -p 1-65535 192.168.16.209开放端口只有80 目录扫描 这里扫描php后缀的文件 g…

cadence virtuoso GBW PM公式仿真

在virtuoso中用公式calculate的方法仿真单位增益带宽GBW和相位裕度 首先进行stb仿真 将增益曲线send to calculate,调用cross函数,threshold value设置为0,求0dB时的横坐标 GBW: 将相位曲线send to calculate,调用va…

TuyaOS 3.8.0操作系统新鲜出炉!IoT开发门槛再次被降低

作为降低物联网开发门槛的 TuyaOS 操作系统,此次迎来了重大更新!TuyaOS 3.8.0 新版本不仅更新了物联网各个板块的开发框架,还能实现与其他开发平台的无缝接入,致力于让开发者更轻松便捷地接入涂鸦 IoT PaaS。 TuyaOS 3.8.0 优化和…