分布式系统核心原理

CAP定理与权衡实践

CAP定理
  • 一致性(Consistency)

    • 强一致性:所有读写操作均基于最新数据(如银行转账)。
    • 最终一致性:数据副本经过一段时间后达到一致(如社交媒体的点赞数)。
    • 技术实现:两阶段提交(2PC)、Paxos/Raft共识算法。
  • 可用性(Availability)

    • 响应要求:系统必须在有限时间内返回结果(即使数据可能过时)。
    • 设计原则:无单点故障、快速失败(Fail Fast)、优雅降级。
  • 分区容错性(Partition Tolerance)

    • 必然性:分布式系统必须容忍网络分区(因网络不可靠是客观存在)。
    • 设计策略:冗余部署、多副本同步、自动故障转移。
CAP的权衡实践
  • CP系统(一致性+分区容错)

    • 特点:在分区发生时,优先保证一致性,牺牲可用性(拒绝部分请求)。
    • 典型系统:ZooKeeper选举Leader期间服务不可写,保证数据一致性;Etcd基于Raft协议,分区时少数派节点不可用。
    • 适用场景:金融交易系统(如支付结算),分布式锁服务(如避免重复扣款)。
  • AP系统(可用性+分区容错)

    • 特点:分区发生时,允许返回旧数据,优先保证服务可用性。
    • 典型系统:Eureka服务注册中心在分区时允许节点独立运行。
    • 适用场景:社交媒体(如点赞、评论功能);实时性要求不高的数据展示(如商品详情页缓存)。
  • CA系统(理论存在,实际不成立)

    • 矛盾点:分布式系统必须面对网络分区,无法完全放弃P。
    • 误解案例:单机数据库(如MySQL主从架构)看似CA,但本质非分布式系统。
CAP的实际工程权衡
  • 强一致性优先(CP) :如订单支付、库存扣减,使用分布式事务(如Seata的AT模式)或同步复制。

  • 高可用优先(AP) :如用户会话管理、新闻Feed流,使用最终一致性(如Redis跨机房异步复制)。

  • 混合策略——分而治之:不同子系统采用不同CAP策略。

    • 订单服务(CP) :强一致性保证支付原子性。
    • 商品服务(AP) :允许缓存短暂不一致,优先展示页面。
  • BASE(Basically Available, Soft state, Eventually consistent)

    • 基本可用:允许降级响应(如返回默认库存值)。
    • 软状态:中间状态允许不同步(如订单“处理中”状态)。
    • 最终一致:通过异步补偿达成一致(如Saga模式)。
网络分区的应对策略
  • 检测与响应

    • 心跳检测:通过ZooKeeper或Consul监控节点健康状态。
    • 多数派仲裁:只有多数节点存活时允许写入(如Paxos要求多数派同意)。
    • Fencing机制:旧Leader被隔离后禁止写操作(如ZooKeeper的ZXID校验)。
  • 恢复后的数据调和

    • Last Write Wins(LWW) :以最新时间戳为准(简单但可能丢数据)。
    • 向量时钟(Vector Clock) :通过逻辑时间戳合并冲突(如DynamoDB)。
    • 人工干预:记录冲突日志供运维介入(如金融对账系统)。

共识算法

Paxos算法
  • 角色

    • Proposer(提议者) :发起提案(如提议某个值)。
    • Acceptor(接受者) :接受或拒绝提案。
    • Learner(学习者) :学习最终达成一致的值。
  • 流程

    • Prepare阶段:Proposer发送提案编号(n)给Acceptors。
    • Promise阶段:Acceptor承诺不再接受编号小于n的提案,并返回已接受的最高编号提案。
    • Accept阶段:Proposer选择多数派Acceptors接受的最高值,发送Accept请求。
    • Learn阶段:一旦提案被多数派接受,Learner广播最终值。
Raft算法
  • 设计目标:简化Paxos的理解与实现,明确角色划分。
  • 角色

    • Leader(领导者) :唯一处理客户端请求的节点,负责日志复制。
    • Follower(跟随者) :被动接收Leader的日志条目。
    • Candidate(候选者) :在Leader失效时发起选举。
  • Leader选举

    • Follower在超时(Election Timeout)后成为Candidate,发起选举。
    • 获得多数派投票的Candidate成为新Leader。
  • 日志复制

    • Leader接收客户端请求,将日志条目广播给Followers。
    • 多数派确认后提交日志,应用到状态机。
  • 安全性保证

    • 选举限制:只有拥有最新日志的Candidate才能成为Leader。
    • 日志匹配:强制Followers的日志与Leader一致。
ZAB协议(ZooKeeper Atomic Broadcast)
  • 设计目标:为ZooKeeper设计的高吞吐量原子广播协议。
  • Leader选举(Fast Leader Election):节点通过交换epoch(时代编号)快速选出最新数据的Leader。
  • 原子广播:Leader为每个事务生成全局有序的ZXID(事务ID);Followers按顺序提交事务,确保所有节点状态一致。

分布式事务解决方案

两阶段提交(2PC,Two-Phase Commit)
  • 准备阶段(Prepare Phase)

    • 协调者(Coordinator) 向所有参与者(Participant) 发送事务请求,询问是否可以提交。
    • 参与者执行事务操作(但不提交),锁定资源,并返回“同意”(Yes)或“拒绝”(No)。
  • 提交阶段(Commit Phase)

    • 若所有参与者返回“Yes”,协调者发送提交命令,参与者提交事务并释放锁。
    • 若有任一参与者返回“No”,协调者发送回滚命令,参与者撤销操作。
三阶段提交(3PC,Three-Phase Commit)
  • CanCommit阶段:协调者询问参与者是否“可能提交”(不锁定资源)。
  • PreCommit阶段:若所有参与者同意,协调者发送预提交请求,参与者锁定资源并准备提交。
  • DoCommit阶段:协调者发送最终提交或回滚命令。
补偿事务(Saga模式)
  • 编排式(Choreography) :各服务通过事件(如消息队列)自主协调,无中心协调者。
  • 编排式缺点:逻辑分散,难维护;需处理事件丢失和重复消费。
  • 编排式工具:Kafka、RabbitMQ。
  • 编排式(Orchestration) :协调者服务集中管理事务流程,调用各服务接口(Cadence、AWS Step Functions)定义Saga步骤。
TCC(Try-Confirm-Cancel)
  • Try阶段:预留资源(如冻结库存、预扣款)。
  • Confirm阶段:确认操作,提交资源(如实际扣款、减少库存)。
  • Cancel阶段:回滚Try阶段的预留(如解冻库存、释放预扣款)。
  • 幂等性:每个阶段需支持重试(如通过唯一事务ID)。
  • 空回滚:Try未执行时收到Cancel,需忽略操作。
  • 悬挂控制:Confirm/Cancel可能先于Try到达,需记录状态。
基于消息队列的最终一致性
  • 本地事务 + 消息表:业务操作与消息写入本地数据库(原子性保证);后台任务轮询消息表,将消息投递到MQ。
  • 消息消费:下游服务消费消息并执行业务,成功后确认消息;失败时重试或进入死信队列人工处理。
  • 事务消息:发送半消息到MQ → 执行本地事务 → 提交/回滚消息;MQ定期检查未确认消息,回调生产者确认状态。

分布式ID生成方案

UUID
  • 原理:基于时间、MAC地址或随机数生成128位字符串(如550e8400-e29b-41d4-a716-446655440000
  • 无序性:作为数据库主键会导致B+树频繁分裂,降低写入性能。
  • 存储浪费:128位过长(占用36字符),可读性差。
  • 适用场景:日志追踪、临时标识等无需有序性的场景。
数据库自增ID
  • 原理:通过数据库自增字段(如MySQL AUTO_INCREMENT)生成唯一ID。
  • 分库分表:通过步长区分不同分片(如实例1生成1,3,5…,实例2生成2,4,6…)。
  • 批量预取:每次从数据库获取一批ID(如1000个)缓存在本地,减少数据库访问。
  • 适用场景:中小规模系统,非高并发场景。
Snowflake算法
  • 原理:64位ID = 时间戳(41位) + 机器ID(10位) + 序列号(12位)
  • 生成流程:同一毫秒内,通过序列号递增生成多个ID(最多4096个/ms);时间戳回拨时,通过等待或抛出异常处理。
  • 机器ID分配:需通过ZK/DB/配置中心保证机器ID唯一。
Redis生成ID
  • 原理:利用Redis的原子操作INCRINCRBY生成递增ID。
  • 集群分片:不同业务使用不同Key(如order:iduser:id)。
  • 批量预取:每次获取一段ID范围(如1~1000),减少Redis交互。
  • 适用场景:需要递增ID且已部署Redis集群的系统。
分布式ID方案对比
方案唯一性有序性性能依赖适用场景
UUID极高极高日志追踪、临时标识
数据库自增严格递增强(数据库)中小规模系统
Snowflake时间有序极高弱(时钟同步)高并发、需有序的大规模系统
Redis生成递增强(Redis)已有Redis集群的系统
号段模式严格递增弱(数据库)需连续ID的中大规模系统

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

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

相关文章

Step文件无法编辑怎么办?

Step文件无法编辑怎么办? 这里介绍两种方法, 1、 直接导入 准备step文件,solidworks导入后是这样,不能在上面直接编辑 图 1 点击右键,选择解除特征(不同版本的可能不太一样,这里是solidworks2…

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定时器中断配置中,TIM_ITConfig() 和 TIM_Cmd() 是两个关键函数,它们分别控制中断使能和定时器计数器的启停,作用层级不同。以下是详细解释: 1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) 作用 启用定时器的特定中断…

TensorFlow 实现 Mixture Density Network (MDN) 的完整说明

本文档详细解释了一段使用 TensorFlow 构建和训练混合密度网络(Mixture Density Network, MDN)的代码,涵盖数据生成、模型构建、自定义损失函数与预测可视化等各个环节。 1. 导入库与设置超参数 import numpy as np import tensorflow as t…

数据结构实验7.2:二叉树的基本运算

文章目录 一,实验目的二,问题描述三,基本要求四,实验操作五,示例代码六,运行效果 一,实验目的 深入理解树与二叉树的基本概念,包括节点、度、层次、深度等,清晰区分二叉…

直线轴承常规分类知多少?

直线轴承的分类方式多样,以下是从材质、结构形状和常规系列三个维度进行的具体分类: 按主要材质分类 外壳材质:常见的有不锈钢,具有良好的耐腐蚀性,适用于一些对环境要求较高、易受腐蚀的工作场景;轴承…

websocket和SSE学习记录

websocket学习记录 websocket使用场景 即时聊天在线文档协同编辑实施地图位置 从开发角度来学习websocket开发 即使通信项目 通过node建立简单的后端接口,利用fs, path, express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA编程中影响性能的小细节总结

一、内存访问优化 合并内存访问:确保相邻线程访问连续内存地址(全局内存对齐访问)。优先使用共享内存(Shared Memory)减少全局内存访问。避免共享内存的Bank Conflict(例如,使用padding或调整访…

【双指针】对撞指针 快慢指针 移动零

文章目录 双指针介绍对撞指针快慢指针283. 移动零解题思路算法思路算法流程双指针介绍 ​ 算法中的双指针,并不一定是指我们平常在 c/c++ 使用的指针类型,更多时候其实是数组的下标等,因为它们也是有标识某个元素的功能,通常我们也就顺其自然地称其为 “指针” ! ​ 常见…

数据结构0基础学习堆

文章目录 简介公式建立堆函数解释 堆排序O(n logn)topk问题 简介 堆是一种重要的数据结构,是一种完全二叉树,(二叉树的内容后面会出), 堆分为大小堆,大堆,左右结点都小于根节点,&am…

4.17--4.19刷题记录(贪心)

第一部分:准备工作 代码随想录中解释为:贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 而我的理解为:贪心实质上是具有最优子结构的一种算法。所有的解都能由当前最优的解组成。 第二部分:开始刷题 &…

学习笔记十七——Rust 支持面向对象编程吗?

🧠 Rust 支持面向对象编程吗? Rust 是一门多范式语言,主要以 安全、并发、函数式、系统级编程为核心目标,但它同时也支持面向对象的一些关键特性,比如: 特性传统 OOP(如 Java/C)Ru…

【Linux】43.网络基础(2.5)

文章目录 2.4 TCP/UDP对比2.4.1 用UDP实现可靠传输(经典面试题) 2.5 TCP 相关实验2.5.1 理解 listen 的第二个参数 2.4 TCP/UDP对比 我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢? TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较TCP用于可靠传输的情况, 应用于…

three.js与webgl在buffer上的对应关系

一、three.js的类名 最近开始接触three.js 看到three.js中的一些类名和webgl的很相似 不自觉的就想对比一下 二、three.js中绘制4个点 // 创建点的几何体 const vertices new Float32Array([0.0, 0.0, 0.0, // 点11.0, 0.0, 0.0, // 点20.0, 1.0, 0.0, // 点30.…

DataWhale AI春训营 问题汇总

1.没用下载训练集导致出错,爆错如下。 这个时候需要去比赛官网下载对应的初赛训练集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初赛训练集.zip 在命令行执行这个命令解压 2.没定义测试集 te…

CANFD技术在新能源汽车通信网络中的应用与可靠性分析

一、引言 新能源汽车产业正处于快速发展阶段,其电子系统复杂度不断攀升,涵盖众多传感器、控制器与执行器。高效通信网络成为确保新能源汽车安全运行与智能功能实现的核心要素。传统CAN总线因带宽限制,难以满足高级驾驶辅助系统(A…

Python字典深度解析:高效键值对数据管理指南

一、字典核心概念解析 1. 字典定义与特征 字典(Dictionary)是Python中​​基于哈希表实现​​的无序可变容器,通过键值对存储数据,具有以下核心特性: ​​键值对结构​​:{key: value}形式存储数据​​快…

C++中unique_lock和lock_guard区别

目录 1.自动锁定与解锁机制 2.灵活性 3.所有权转移 4.可与条件变量配合使用 5.性能开销 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具&#xff0c;用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别…

Nvidia显卡架构演进

1 简介 显示卡&#xff08;英语&#xff1a;Display Card&#xff09;简称显卡&#xff0c;也称图形卡&#xff08;Graphics Card&#xff09;&#xff0c;是个人电脑上以图形处理器&#xff08;GPU&#xff09;为核心的扩展卡&#xff0c;用途是提供中央处理器以外的微处理器帮…

下载electron 22.3.27 源码错误集锦

下载步骤同 electron源码下载及编译_electron源码编译-CSDN博客 问题1 从github 下载 dugite超时&#xff0c;原因没有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/进阶搜索 思路: 首先,最初始想法,将我们需要枚举的长木棍个数计算出来,在dfs中,我们先判断,此时枚举这根长木棍需要的长度是否为0,如果为0,我们就枚举下一个根木棍,接着再判断,此时仍需要枚举的木棍个数是否为0,如果为0,代表我们这种方案可行,直接打印长木棍长度,接着我们…