分布式系统需要关注的技术点和面试经常问的点

news2024/11/13 8:00:03

1、分布式系统概述
关于什么是分布式系统,有很多文章介绍,其实这个并不难理解,大白话讲就是:工厂活多了一个人撑不住,那就多找些工人一起干,要让这么多人为了一个目标干得快干得好,就需要一些规矩和套路,否则就乱了。从实践来看分布式系统属于重要的架构模式,对于互联网工程架构的演进,简单提一下为什么会出现分布式系统以及什么是分布式系统:

业务量的迅速增大,普通的单机系统无法满足要求,要么垂直扩展升级机器硬件,要么水平扩展堆廉价服务器,这也是主流可以想到的解决方法,目前来看互联网领域选择了后者-水平扩展。

水平扩展机器多机房部署升级服务集群规模来应对业务的增长,也就出现了分布式系统,这些分布式系统中的物理节点可能是多机房多网络场景部署的,相互之间通过网络进行通信和协作。分布式系统就是为了解决巨大业务量和数据量而生的,但是庞大数量的节点来一起正确有序的完成共同的目标是需要理论和实践来锤打的,这也是分布式系统的重点内容。


2、分布式系统的分类
一般我们常接触的分布式系统包括两大类:分布式存储和分布式计算

分布式系统那么多机器要一起协调去完成任务也不是一件容易的事情,所以我们通常认为分布式系统是个熵增过程。

熵是描述一个系统内在混乱程度的物理量,对于一个宏观熵看孤立的系统来说,在没有外力干预做功的前提下,系统内在混乱程度是会不断增加的,也就是熵是增加的。
为了让系统保持有序就必须对其进行外力干涉,对于分布式系统而言,我们必须使用相应的策略和算法使整个系统保持有序和正确,所以认为分布式系统是个熵增过程。
这个并不难理解,就像我们为了保持房屋整洁,定期必须打扫,要不然就乱成一锅粥了。如果对于系统不加以控制和干预,系统将自主走向混乱和无序。


3、分布式一致性问题的理解
分布式一致性到底是什么一致?

分布式的一致性可以表现在很多方面,这些都是个性问题,然而无论这些个性问题有多少,任何行为和状态的展示必然是以数据为基础的,所以这些个性的一致性问题最终都会映射到一个共性问题–分布式数据的一致性。

分布式系统中拥有很多独立的节点,这些节点一般来说可以独立进行存储和计算任务,这两项是最主要的任务类型,本质上计算和存储的过程仍然是围绕数据展开的,所以最终还是数据一致性。

中心化结构中,存在管理节点和任务节点的区别,也就是每个节点的权利和义务是不一样的,管理节点可能负责分配任务给下属节点和收集计算结果等,总体承担协调者的角色,任务节点主要是承接任务,这样容易出现管理节点的单点问题。

去中心化的结构中,各个节点的权利和义务是相同的,尽管没有单独指定领导者,在实际的运行中仍然会选举出领导者和failover动态更新领导者的问题,完全的去中心化系统并不多,相比中心化系统来说,去中心系统更加扁平也更加稳定,像Redis官方集群就是去中心化的实现,任何一个节点的故障都不会带来特别大的问题,因为节点是平等的。

无论在中心化还是去中心化的分布式系统中,任何一个节点的计算和存储结果都会对其他节点产生影响,这些独立的节点通过基础和特定的网络协议进行协作,从而形成一个整体。


4、严格意义的数据一致性
我们必须要有个共识:严格意义上的分布式数据一致性是不存在的。为啥不存在呢?

在分布式系统中数据存储是多节点主从备份的,一般做成读写分离,当客户端将数据通过主库的代理写入之后,在极其短暂的瞬间,主节点的数据是无法复制到从节点的,这个瞬间其他客户端读取到的从库数据都是旧数据。

我们以redis主从节点之间的数据复制来看同步复制和异步复制场景下的数据一致性问题:

在这里插入图片描述

在这里插入图片描述

一般来说,为了保证服务的高可用,主从节点的数据复制是异步的,因为同步复制延时无法保证,当然有的场景也是同步复制的,这样整体延时是无法保证的,假如是一主多从就更无法保证了同步复制的延时了。

所以我们不讨论严苛意义上的数据一致性,而是研究在我们认为可以接受的时间长度下的数据一致性问题,也就是在自身环境约束下的数据一致性。

单机系统的一致性和事务都是比较容易达到的,在分布式系统中由于所有节点的交互都要通过网络来实现,网络必然存在不稳定并且庞大系统中的单节点稳定性也是需要考虑的。

前面这段话,读起来云里雾里,我想表达的意思是:不要过分把对单机系统中的数据一致性要求照搬到分布式系统中,因为两者的约束不一样,我们要合理分析从而让分布式系统的一致性尽量接近单机系统。


5、CAP理论和PACELC理论

我们知道cap理论描述了一致性、可用性、分区容忍性的关系。

在这里插入图片描述

在分布式系统中,由于节点物理分布和网络稳定性等原因,分区容忍性P是必然存在的,因此分布式系统必然要建立在分布式网络存在分区P的前提下。

在P的基础上我们对于C和A进行选择,当然并不是说在任何时刻我们都必须C和A二选一,在网络正常的情况下C和A我们也是可以都有的,并且每个系统设计目标也不一样,需要更加实际要求来进行选择。

分布式系统中P是必然存在的,我们在设计系统之初就要对C和A做平衡和选择,在正常的情况下跑出正确的结果是基本要求,在异常情况下仍然可以正常运行是设计重点。

在分布式系统中,我们使用PACELC理论比CAP理论更加合适,因为PACELC理论是CAP理论的扩展,简单来说PACELC理论的表述是这样的:

如果分区partition §存在,分布式系统就必须在availability (A) 和consistency ©之间取得平衡作出选择,否则else (E) 当系统运行在无分区P情况下,系统需要在 latency (L) 和 consistency ©之间取得平衡。

PACELC理论比CAP理论更适合分布式系统,它完全展现了出现网络分区和正常情况下的取舍平衡问题,特别地引入了L时延因素,来对一致性C进行说明,也就是我们常说的强一致性和弱一致性。

强一致性不必多说,对主从数据的一致性要求很高,一般会牺牲可用性来保证,弱一致性又可以分为最终一致性/会话一致性/单调读一致性/单调写一致性等情况,从实用的角度来说我们重点关注弱一致性的最终一致性情况即可。
在这里插入图片描述

6、分布式系统所带来的技术问题
那么大家这个时候可以思考一下,如果你的公司是采用这种分布式系统的方式来构建公司的一个大规模系统的,那么这个时候会涉及到哪些技术问题?

(1)分布式服务框架

你如果要让不同的子系统或者服务之间互相通信,首先必须有一套分布式服务框架。

也就是各个服务可以互相感知到对方在哪里,可以发送请求过去,可以通过HTTP或者RPC的方式。

在这里,最常见的技术就是dubbo以及spring cloud,当然大厂一般都是自己有服务框架

(2)分布式事务

一旦你的系统拆分为了多个子系统之后,那么一个贯穿全局的分布式事务应该怎么来实现?

这个你需要了解TCC、最终一致性、2PC等分布式事务的实现方案和开源技术。

具体可以查看分布式事务介绍,了解分布式事务。

(3)分布式锁

不同的系统之间如果需要在全局加锁获取某个资源的锁定,此时应该怎么来做?

毕竟大家不是在一个JVM里了,不可能用synchronized来在多个子系统之间实现锁吧,是不是?

(4)分布式缓存

如果你原来就是个单块系统,那么你其实是可以在单个JVM里进行本地缓存就可以了,比如搞一个HashMap来缓存一些数据。

但是现在你有很多个子系统,他们如果要共享一个缓存,你应该怎么办?是不是需要引入Redis等缓存系统?

(5)分布式消息系统

在单块系统内,就一个JVM进程内部,你可以用类似LinkedList之类的数据结构作为一个本地内存里的队列。

但是多个子系统之间要进行消息队列的传递呢?那是不是要引入类似RocketMQ、ActiveMQ、Kafka之类的分布式消息中间件?

(6)分布式搜索系统

如果在单块系统内,你可以比如在本地就基于Lucene来开发一个全文检索模块,但是如果是分布式系统下的很多子系统,你还能直接基于Lucene吗?

明显不行,你需要在系统里引入一个外部的分布式搜索系统,比如Elasticsearch。

(7)其他很多的技术

比如说分布式配置中心、分布式日志中心、分布式监控告警中心、分布式会话,等等,都是分布式系统场景下你需要使用和了解的一些技术。

因为沿用单块系统时代的那些技术已经不行了,比如说你单块系统的时候,直接在本地用一个properties文件存放自己的配置即可,

日志也写到本地即可。但是分布式时代呢?

你那么多的子系统,怎么共享同一份配置?怎么把各个系统的日志聚合写到一个地方来查看?

单块系统的时候,你一个web应用直接基于Servlet API提供的Session会话功能即可,那么分布式时代呢,你有N多个子系统如果要共享会话该怎么做?

7、中间件系统及大数据系统

分布式系统本身是一个非常复杂的话题,因为刚才说的只是一个分布式业务系统要依赖哪些技术来进行构建。

但是其实比如Kafka、Rocket等中间件,本身他也是分布式的,你要搞明白他们自己是如何实现分布式的,又是一个非常复杂的话题。

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

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

相关文章

自主可控智能网联汽车操作系统

开发自主可控智能网联汽车操作系统的必要性 当下,传统汽车操作系统行业的核心技术几乎由国外的黑莓、谷歌、风河、Vector、ETAS等垄断。操作系统已成为我国智能网联汽车发展过程中的关键卡脖子技术,开发自主可控的智能网联汽车操作系统势在必行。 操作…

CVPR 2023 | 达摩院REALY头部重建榜单冠军模型HRN解读

团队模型、论文、博文、直播合集,点击此处浏览 前言 高保真 3D 头部重建在许多场景中都有广泛的应用,例如 AR/VR、医疗、电影制作等。尽管大量的工作已经使用 LightStage 等专业硬件实现了出色的重建效果,从单一或稀疏视角的单目图像估计高精…

微服务架构设计与实践

随着互联网的发展,软件开发已经成为各种企业发展的重要手段。然而,单体应用在长时间的维护中会变得复杂、难以扩展、难以修改。因此,为了满足业务需求,微服务架构应运而生。本篇文章将深入探讨微服务架构的设计与实践。 一、微服务…

C++中的类与对象

类与对象 我们在C语言中自定义的struct 叫做结构体,而在C中我们把struct升级为了类,并且还加入了一个class,也称为类,那么我们今天就来看一下结构体和类的不同和相同 1.结构体与类 我们在C语言中的结构体是struct,而…

QT学习笔记(持续更新)

QT 一、按钮 1.效果 2.代码 #include<QPushButton>//头文件myWidget::myWidget(QWidget *parent): QWidget(parent) {//方法1QPushButton *btnnew QPushButton;//btn->show();//以顶层方式显示btn->setParent(this);//在myWidget窗口中btn->setText("按钮…

JS编程中的API hook

JavaScript奇技淫巧&#xff1a;Hook与反Hook 作者&#xff1a;专注于JS混淆加密的 JShaman API HOOK技术&#xff0c;在PC时代曾盛行&#xff0c;是高端的技术。在JavaScript编程中&#xff0c;也可以应用API Hook技术实现不寻常的效果。 例&#xff0c;eval hook&#xff1a…

Kotlin 基础 笔记

这里写目录标题 变量函数条件语句if/else 语句when 语句if/else 表达式 和 when 表达式 Kotlin 中的null使用 ?: Elvis 运算符 类和对象构造函数类之间的关系可见性修饰符定义属性委托 变量 变量是存储单项数据的容器&#xff0c;必须先声明变量&#xff0c;才可以使用。 常见…

Centos7.5 如何安装Bacula 11.05详细教程

环境: 本地华为桌面云服务器环境 Centos 7.5 Bacula 11.05 问题描述: Centos7.5 如何安装Bacula 解决方案: 一、官网下载Bacula 1.下载Source Files11.0.5 2.先安装C 和 C++ 编译器 root@localhost ~]# yum install -y gcc gcc-c++ 1 已安装: 2 gcc.x86_64 0:…

梦想云图Node.JS服务(2023.4.19)

说明 后台提供梦想Node.JS服务&#xff0c;方便调用控件后台功能&#xff0c;Windows服务程序所在目录:Bin\MxDrawServer\Windows&#xff0c;Linux服务程序所在目录:Bin\Linux\MxDrawServer 启动服务 Windows:进入Bin\MxDrawServer\Windows目录&#xff0c;运行start.bat启动…

redis原理及进化之路

Redis 的主从复制经历了多次演进&#xff0c;本文将从最基本的原理和实现讲起&#xff0c;并层层递进&#xff0c;逐步呈现 Redis 主从复制的演进历史。大家将了解到 Redis 主从复制的原理&#xff0c;以及各个改进版本解决了什么问题&#xff0c;并最终看清 Redis 7.0 主从复制…

vue+uniapp疫苗预约接种系统 微信小程序

统计分析&#xff1a;查看用户&#xff0c;疫苗&#xff0c;订单数量&#xff1b;统计近7日&#xff0c;30日订单趋势 用户管理&#xff1a;查看注册用户信息&#xff0c;及删除&#xff08;数据库mysql) 疫苗管理&#xff1a;疫苗增删改查以及上下架 接种点管理&#xff1a;接…

vue3.0 详细说明+案例 !!!

提示&#xff1a;vue3.0 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;Vuee.js的最新版本。它提供了一系列全新的特性&#xff0c;包括更快的渲染速度、更好的Tree Shaking支持以及更好的TypeScript支持。 最重要的特性…

centos7重启后/etc/rc.local中的脚本没有执行

前阵子自己安装了WMware16、centos7&#xff0c;配置好jdk、mysql、nginx、redis并设置好开机自动启动后&#xff0c;打算将服务也做成自启动&#xff0c;因为之前做过本以为会很顺利&#xff0c;结果整了快两小时&#xff0c;觉得有必要记录下。 之前自己记录的博客&#xff…

Faster RCNN系列5——RoI Pooling与全连接层

Faster RCNN系列&#xff1a; Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 在RPN网络中&#xff0c;已…

融云出海赋能会干货回顾(二)| 地区、赛道选择和避坑攻略

“出海是这个时代给我们的机遇。”这是很多互联网出海人的心声。关注【融云全球互联网通信云】了解更多 走过跌宕起伏的 15 年出海历程&#xff0c;中国出海人现在面对与此前截然不同的市场环境&#xff0c;很多地区蓝海不再&#xff0c;也有不少赛道变得拥挤。 一体两面&…

交友项目【动态点赞动态喜欢】

目录 1&#xff1a;点赞 1.1&#xff1a;动态点赞 1.1.1&#xff1a;分析&实现 1.2&#xff1a;取消点赞 1.2.1&#xff1a;分析&实现 2&#xff1a;喜欢 2.1&#xff1a;动态喜欢 2.1.1&#xff1a;分析&实现 2.2&#xff1a;取消喜欢 2.2.2&#xff1a…

学成在线笔记+踩坑(5)——【媒资模块】上传视频,断点续传

目录 5 上传视频 5.1 媒资管理页面上传视频流程预览 5.2 断点续传技术 5.2.1 什么是断点续传 5.2.2 测试分块与合并&#xff0c;RandomAccessFile随机流 5.2.3 视频上传流程 5.2.4 测试minio合并文件 5.3 接口定义&#xff0c;检查文件/分块、上传分块、合并分块 5.4…

4年外包终上岸,我只能说这类公司能不去就不去

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

类图(类之间的关系)

一.概述 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。在软件工程中&#xff0c;类图是一种静态的结构图&#xff0c;描述了系统的类的集合…

基于Powell共轭方向法的UWB室内定位构型优化算法

基于Powell共轭方向法的UWB室内定位构型优化算法 阚昊宇 摘要&#xff1a; UWB室内定位系统的服务性能及定位精度很大程度上受UWB基站构型影响&#xff0c;而GDOP是衡量系统定位服务性能的重要指标。目前关于UWB室内定位基站构型的讨论主要集中于最小化限定基站数目下GDOP在自…