分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式技术)
分析探索从起源到现今的巅峰之旅
- 背景介绍
- 数据可伸缩性
- 案例
- 计算可伸缩性
- 案例
- 代价和权衡
- 分布式的代价
- 分布式的权衡
- 权衡策略
- 分布式技术方向
- 数据系统
- 运算系统
- 分布式数据系统
- Partition(分区)
- Round-Robin(轮询)
- 局限性
- Range(范围)
- 局限性
- Hash(平均)
- Consistent Hashing(一致性哈希)
- 局限性
- Manual(手动制表)
- 局限性
- 技术取舍简介
- 案例介绍
- Replication(复制)
- 数据复制
- 非强一致性
- 同步复制
- 同步复制和异步复制
- Quorum算法
- 公式介绍
- 批量出发同步
- CAP最终一致性
背景介绍
一个系统之所以逐渐走向分布式架构,必然有其深刻且必要的动因。在众多驱动因素中,伸缩性(Scalability)无疑是最为显著的。对于Scalability的需求,我们可以细致地划分为两个维度进行剖析:
数据可伸缩性
随着数据量的急剧增长,单台机器很难以经济高效的方式承载所有资料。因此,将数据分布到多个节点上成为了解决之道,从而确保了数据的可靠性、可扩展性以及处理性能。
案例
一个典型的例子便是分布式数据库,它采用分布式架构,能够轻松应对海量数据的存储和访问需求。
计算可伸缩性
当面对复杂且计算量巨大的任务时,如科学运算等,单台机器往往难以在合理的时间内完成运算。为了提升运算效率,我们需要将计算任务分散到多个节点上并行处理。这种分散式计算模式不仅提高了运算速度,还降低了成本,使得大规模计算任务变得更为可行。
案例
Apache Hadoop、Apache Spark、Apache Flink和Apache Storm是大数据分布式计算框架的代表,其中Hadoop包括HDFS用于存储大规模数据和MapReduce用于并行处理,Spark则在内存中提供高性能数据处理,Flink支持流式和批处理,而Storm则专注于实时数据流的高吞吐量处理。
以上两个维度都是推动系统走向分散式架构的重要力量。通过合理地利用分布式架构的优势,我们可以有效地解决数据存储和运算能力上的挑战,为系统的可持续发展奠定坚实基础。
代价和权衡
分布式的代价
接下来,我将深入剖析这两种需求在实施过程中可能遭遇的难题及其常见的解决策略。无论选择哪种需求,一旦决定采用分布式架构,就意味着需要做出一些必要的妥协:
- 效率上的牺牲:在分布式架构中,网络延迟以及节点间协同工作的复杂性常常导致执行效率的降低。
分布式系统所固有的特性,需要我们在追求高可用性、扩展性的同时,对执行效率做出一定的妥协。
- AP弹性的折中:单机环境下轻松应对的运算任务,在分散式架构中可能会面临实现上的挑战。
分布式系统需要处理更多的分布式协调和数据一致性问题,从而导致某些运算任务的难度增加。
- 运维能力的考验:分布式架构中的问题通常具有难以复现和追踪的特性,这无疑增加了系统维护的难度。
运维人员需要面对更复杂的系统结构和更多的潜在故障点,这需要在维护分布式系统时具备更高的技术水平和更丰富的经验。
与单机系统相似,分布式架构在系统设计上同样存在一些权衡与取舍。这些取舍要求我们根据实际情况做出合理的选择和权衡,以实现系统的整体性能和稳定性的最大化。
分布式的权衡
如同单机系统一般,分布式架构在系统设计上也存在一系列权衡和考量。这些设计决策涉及多方面的因素,需要我们综合考虑系统性能、可扩展性、容错性等多个维度,以实现最优的系统设计和性能表现。
权衡策略
我们分析以下针对于分布式系统的性能和可用性的权衡策略和方向,总体为以下三点为主:
- 致力于精细调整CPU使用效率和IO效率,旨在实现系统性能的最大化。
- 针对读取和写入操作,我们采取专项优化策略,以提升数据处理效率,确保数据处理的迅捷与高效。
- 注重平衡Throughput(吞吐量)与Latency(延迟)之间的关系,以满足不同业务场景对性能的不同需求,实现系统性能的综合提升。
选择了不同的权衡策略,就意味着会形成迥异的系统架构。在后续的探讨中,我们将深入剖析那些面向设计的决策因素,它们如何塑造出各具特色的分布式系统。
分布式技术方向
分布式系统具有高度的特化性,而非通用性。因此,不同的设计决策将产生出不同应用功能的系统。正如先前所述,我初步将分布式系统划分为两大类:数据系统和运算系统。
数据系统
数据系统的核心技术手段主要聚焦于partition(分区)和replication(复制),在以不同的读写方式,便能衍生出众多不同的变种。在此过程中,几个关键的设计决策起着至关重要的作用。
- 资料分区:通过有效的资料分区策略,实现数据的合理分布与存储,提升系统处理性能。
- 读写分离:将读写操作进行分离处理,优化系统资源的分配与利用,提高系统的并发处理能力。
- 数据复制:采用数据复制技术,实现数据的冗余存储,提高系统的可用性和容错能力。
- 错误恢复:建立完善的错误恢复机制,快速响应并处理各种异常情况,确保系统的稳定运行和数据安全。
- 处理粒度:合理设定处理粒度,以平衡计算资源的使用与系统性能,实现高效的数据处理。
- 可用性保证:通过多种技术手段确保系统的高可用性,减少服务中断的风险,保障用户持续稳定的访问体验。
运算系统
运算系统而言,其核心技术手段在于数据平行化和运算平行化。尤其在运算过程中涉及状态变更或参照易变资料时,情况会变得更加错综复杂。几个关键的设计决策涵盖:
- 分工模式:合理设计系统内部的分工模式,以优化资源分配和提高处理效率。
- 信息交互:高效的信息交换方式,确保各组件之间的顺畅通信,降低通信延迟。
- 运算支持:不同运算需求,提供丰富的运算种类支持,满足多样化的业务场景。
- 可用性保障:采取多种措施确保系统的高可用性,降低服务中断的风险,提升用户体验。
- 状态管理与回滚机制:建立完善的状态管理机制,并引入回滚机制,以应对异常情况,保障系统的稳定运行。
分布式数据系统
分布式数据系统的两大核心问题根源在于partition(分区)和replication(复制)。
Partition(分区)
首先,我们来谈谈partition。当数据量庞大到无法单独存储在一台机器上,或者对数据的运算需求超出了单台机器的处理能力时,就需要考虑进行partition。简而言之,partition就是将数据切分并分散存储到多台机器上,以此实现数据的水平扩展和高效处理。
Round-Robin(轮询)
将数据依次轮流分配给多台机器,其显著优势在于实现负载均衡,确保每台机器都能得到适量的处理任务。
**优化Round-Robin策略,可以采用线程池作为变型方案:**每台机器分配固定数量的线程,以限制单个运算的耗时,避免长时间占用资源而影响后续运算,能有效提高系统的吞吐量和响应速度。
局限性
不适用于涉及会话(session)或数据相依性(如需要join操作)的应用场景,因为轮流分配可能导致相关数据分散在不同机器上,从而增加处理复杂性和延迟。
Range(范围)
为每台机器划定一个数据范围,例如,将key值在1- 5000之间的数据分配给A机器,将key值在5001 - 10000之间的数据分配给B机器。
这种方法的优点是简单直观,仅需维护少量元数据。
局限性
弹性较差,难以应对动态变化的需求;同时可能存在热点问题,即大量资料数值集中在某个范围内,导致某台机器负载过重。MongoDB在早期版本就采用了这种切割方式。
Hash(平均)
利用哈希函数来决定资料应存放在哪台机器上。简单的哈希方法如取余数法存在资料迁移问题,特别是在新增机器时。
现在更常用的是一致性哈希(Consistent Hashing)来避免这一问题。一致性哈希能够实现数据的均匀分布,并减少所需维护的元数据量。
Consistent Hashing(一致性哈希)
-
一致性哈希算法的核心在于其独特的数据结构——一致性哈希环。这个环的起点设定在0,终点为2^32 - 1,首尾相连,形成了一个闭合的圆环。环上的整数依照逆时针方向依次排列,因此整个环的整数分布范围覆盖了从0到
2^32 - 1
的完整区间。 -
整个哈希值空间被巧妙地组织成一个虚拟的圆环。每个节点通过其IP地址或主机名作为关键字进行哈希计算,得到的哈希值确定了该节点在环上的具体位置。当数据需要进行存储时,其哈希值将按顺时针方向在环上寻找最近的节点进行存放。以图中的例子来说,data的哈希位置决定了它应当存放在node2节点上。
-
当从n个节点扩容至n+1个节点时,一致性Hash算法所影响的缓存数据量相对较少,其影响范围仅为0~1/n,这意味着最多只有一个节点的缓存数据会失效。
局限性
缓存在每个节点上分布不均,毕竟 hash 值随机,那节点在环上的位置也随机。
Manual(手动制表)
手动创建一个对照表来指定数据的分配方式,这种方法的优点在于灵活性高,可以根据实际需求进行任意分配。
常见的解决方案是利用Apache ZooKeeper(ZK),它是一个用于维护集群中共享状态的分布式系统。通过ZK来管理这些元数据已经成为众多分布式系统的标准做法。ZK内置了高可用性和一致性机制,确保数据的可靠性和一致性。
在生产环境中,为了确保系统的健壮性,通常建议至少部署2n+1(n>0)个节点(最少为3个节点),这样即使不超过n个节点发生故障,整个系统仍然能够正常运行并提供服务。这种设计使得ZooKeeper成为分布式系统中元数据管理的可靠选择。
局限性
它也带来了额外的挑战,需要手动控制资料和负载的均衡,同时维护大量的元数据。这增加了系统的复杂性和管理成本。
技术取舍简介
在读写操作中常常存在权衡取舍,优化写入操作可能会对读取操作产生负面影响。
-
基于Round-Robin,尽管它能够平均分配写入负载,但在执行范围查询(Range Query)时,需要向所有机器发送查询请求,这可能导致查询效率降低。
-
基于Range,虽然有助于针对范围查询,但写入操作可能集中在同一台机器上,造成写入瓶颈。
案例介绍
若用户表格数据按区域进行切分,这对于那些经常带有区域条件的应用来说是有利的,因为这些应用可以仅锁定几个区域进行查询,而无需将查询请求分散到所有机器上。
注意,这种切分方式可能不利于其他不涉及地区条件的应用,它们可能需要跨多个分区甚至所有分区进行数据检索,从而增加了查询的复杂性和开销。
Replication(复制)
在partition时,首要考虑的是如何合理切分数据。这一决策涉及多个因素,包括数据的访问模式、计算需求、以及系统的容错能力等。一个合理的切分策略能够确保数据分布的均衡性,提高系统的整体性能和可靠性。
数据复制
数据复制是确保系统可用性的关键手段。通过将数据复制到不同的机器上,即使其中一台机器出现故障,我们依然能够获取到所需的数据,从而保障了数据的可靠性和可访问性。
非强一致性
数据复制也带来了一个固有的问题,那就是延迟。在复制完成之前,不同机器上的数据可能会存在不一致的情况。这种不一致性是数据复制过程中不可避免的现象。
有些系统对数据一致性读取的要求非常高,为了满足这一需求,它们会采用同步复制的方式。
同步复制
在这种模式下,只有当数据复制完成后,数据的写入操作才会被认为是完成的。然而,这种同步复制的方式会导致操作速度变慢,特别是在副本数量不断增加的情况下,性能问题会变得更加突出。
同步复制和异步复制
为了提高操作效率,非同步复制成为了一个更为有效的选择。虽然非同步复制会导致数据在一定时间内存在不一致性,但在许多应用场景中,这种短暂的不一致性是可以接受的。通过权衡数据一致性和操作效率,我们可以根据实际需求选择适合的复制方式。
基于前面的介绍,我们了解到同步复制和异步复制各自适用于特定的场景,但它们的选择有时显得较为极端。那么,是否存在一种折衷的方法呢?答案是肯定的。这时候就衍生出了Quorum算法。
Quorum算法
Quorum算法是一种在分布式系统中常用的投票算法,主要用于保证数据冗余和最终一致性。它的主要数学思想来源于鸽巢原理,通过赋予分布式系统中的每一份数据拷贝对象一票,确保每一个读操作或写操作都需要获得足够的票数才能执行。
公式介绍
Quorum算法通过设定R(读)+W(写)>N的条件,实现了分布式系统中数据一致性的保障。这里的N表示数据所具有的副本数,R表示完成读操作所需要读取的最小副本数,W表示完成写操作所需要写入的最小副本数。
当R+W>N时,意味着读操作和写操作所涉及的副本集合有重叠,即至少有一个副本同时参与了读和写操作。这种重叠确保了读操作能够读取到最新的、已经写入的数据,从而保证了强一致性。
批量出发同步
每次数据更新都立即触发复本更新显然不是一种高效的做法。为了提高效率,我们通常会采用批量更新的策略,即累积一定数量的更新操作或等待一段时间后再进行统一的复本更新,这种方式能够显著减少复本更新的频率,进而提升系统的整体性能。
CAP最终一致性
追求最终一致性(Eventually Consistency),最终一致性意味着,只要数据不再更新,最终会有一个时刻,所有节点会协调达到一致的状态。这种说法听起来似乎并不那么稳固可靠。尽管存在这样的不可靠性,但为什么我们还要使用这种机制呢?这依然是权衡取舍的问题。我们选择在某种程度上舍弃强一致性,以换取其他更为重要的特性。
CAP定理告诉我们,在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三个特性最多只能同时满足两个。
相关文章:

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式技术)
分析探索从起源到现今的巅峰之旅 背景介绍数据可伸缩性案例 计算可伸缩性案例 代价和权衡分布式的代价分布式的权衡权衡策略 分布式技术方向数据系统运算系统 分布式数据系统Partition(分区)Round-Robin(轮询)局限性 Range&#x…...

基于Python+OpenCV+SVM车牌识别系统(GUI界面)【W3】
简介: 随着交通管理的日益复杂化和智能化需求的增加,车牌识别系统在安防、智慧交通管理等领域中扮演着重要角色。传统的车牌识别系统主要基于图像处理和模式识别技术,随着计算机视觉技术的发展,基于Python、OpenCV和机器学习算法的…...

ansible.cfg forks参数
在Ansible的配置文件ansible.cfg中,forks参数是一个非常关键的设置,它控制了Ansible执行任务时的并发连接数,直接影响到Ansible执行 playbook 或 ad-hoc 命令时的速度和效率。 意义与作用 并发控制:当你使用Ansible来管理多台主…...
Web前端写随机抽奖:技术与创意的碰撞
Web前端写随机抽奖:技术与创意的碰撞 在Web前端的世界里,随机抽奖功能不仅是一种常见的交互元素,更是技术与创意的完美结合。下面,我们将从四个方面、五个方面、六个方面和七个方面,深入探讨Web前端实现随机抽奖的技术…...

Centos系统yum安装mysql数据库
安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明: 系统:CentOS-7-x86_64-DVD-2009 安装为最小化安装,没…...
使用Selenium进行Web自动化:详细操作指南
使用Selenium进行Web自动化:详细操作指南 引言 Selenium是一个广泛使用的开源工具,用于自动化Web浏览器的操作。无论你是进行自动化测试,还是需要抓取网页数据,Selenium都是一个非常有用的工具。本文将详细介绍Selenium的一些常见用法,包括输入框设置值、文件上传、单选…...

手机照片免费数据恢复软件EasyRecovery2024免费版下载
大家好!今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道,电脑中的重要文件一旦丢失,对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器!它能够帮助我们快速、有效地恢…...

【工具】新手如何正确使用Pycharm?
1. 什么是JetBrains Toolbox JetBrains Toolbox是一个管理工具,用于安装、更新和管理JetBrains开发工具的所有版本。它可以简化多个IDE的管理,并确保你总是使用最新版本的软件。 2. 安装JetBrains Toolbox 步骤1:下载Toolbox 访问JetBrai…...

【JavaEE精炼宝库】多线程(6)线程池
目录 一、线程池的概念及优势 1.1 线程池的概念: 1.2 线程池的优势: 二、工厂模式 三、标准库中的线程池 3.1 标准库线程池参数解释: 3.1.1 corePoolSize | maximumPoolSize: 3.1.2 keepAliveTime | unit: 3.1…...
数据仓库和数据库的区别
数据仓库和数据库在许多方面存在显著的区别,主要体现在数据的用途、架构、设计原则和性能优化上。以下是两者之间的详细区别: 1. 目的和用途 数据库(Database): 主要用途:用于日常业务操作和事务处理。数据…...

芯片验证分享7 —— 代码审查1
大家好,我是谷公子,前几节课给大家分享了如何设计激励,今天我们来如何进行代码审查。 之前讨论的是基于计算机的验证技术,现在讨论非基于计算机的验证过程(即“人工验证”,或代码审查)。代码审查在查找错误方面非常有…...

Shell脚本从入门到实战
一、概述 shell 是一个命令行解释器,它接受应用程序、用户命令,然后调用操作系统内核。 shell 还是一个功能强大编程语言,易调试,易编写,灵活性强。 二、mac 怎么重启docker 1.如何重启 Docker on Mac 在 macOS 上…...

使用 python 将 Markdown 文件转换为 ppt演示文稿
在这篇博客中,我们将展示如何使用 wxPython 创建一个简单的图形用户界面 (GUI),以将 Markdown 文件转换为 PowerPoint 演示文稿。我们将利用 markdown2 模块将 Markdown 转换为 HTML,并使用 python-pptx 模块将 HTML 内容转换为 PowerPoint 幻…...

Arnoldi Iteration 思考
文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q,构建一个投影平面P,使得给定任何向量v,可以通过公式 p P v pPv pPv,快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…...
【Kafka】SpringBoot整合Kafka详细介绍及代码示例
Kafka介绍 Apache Kafka是一个分布式流处理平台。它最初由LinkedIn开发,后来成为Apache软件基金会的一部分,并在开源社区中得到了广泛应用。Kafka的核心概念包括Producer、Consumer、Broker、Topic、Partition和Offset。 Producer:生产者&a…...
C++ 质数因子分解
描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 输入描述: 输入一个整数 输出描述: 按照从小到大的顺序输出它的所有质数的…...

laravel版本≥ 8.1
laravel10 php ≥ 8.1 且 ≤ 8.3? 8.1 < php < 8.3PHP版本要求在 8.1 到 8.3 之间,包括这两个版本。具体来说:"≥ 8.1" 表示 PHP 的版本至少是 8.1,也就是说 8.1 及以上的版本都可以。 "≤ 8.3" 表示 P…...

【iOS】MRC下的单例模式批量创建单例
单例模式的介绍和ARC下的单例请见这篇:【iOS】单例模式 目录 关闭ARC环境MRC下的单例ARC下的单例批量创建单例Demo 关闭ARC环境 首先关闭ARC环境,即打开MRC: 或是指定某特定目标文件为非ARC环境: 双击某个类文件,指定…...
计算机网络期末复习
今天考专四,环境都蛮好的,试卷也很新,老师人也不错,明年再来。 又到期末考试咯,大家复习没有?还没复习啊?还不复???? 目录 第一章 1-02 试简述…...
python写一个获取竞品信息报告
要编写一个获取竞品信息报告的Python程序,首先需要明确您想要获取的竞品信息以及数据来源。在这个示例中,我将展示如何从网页提取竞品信息,并编写一个简单的报告。 假设您想要获取以下竞品信息: 1. 产品名称 2. 产品价格 3. 产品特…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...