云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)
在云应用/服务的 5 层架构里,数据库服务层稳坐第 4 把交椅,堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏,不少人都将它视为整个架构中的 “终极挑战”。
不过,也有人觉得可扩展存储系统才是最难啃的 “硬骨头”,其实这场关于谁更复杂的争论没有标准答案,很大程度上取决于具体的业务应用模式(就可扩展存储系统,老夫打算在后续的文章中具体再聊)。
对于那些涉及复杂交易处理的应用来说,数据库服务层实现面临的挑战难度显然更高,每一次数据的读写、每一个事务的处理,都像是在走钢丝,稍有不慎就可能引发数据混乱、系统崩溃等严重问题,实现过程中的挑战难度堪称地狱级别。
但如果是单纯处理海量数据的简单事件应用,数据库服务层反而显得有些 “多余”,这时候,云存储层摇身一变,就成为了整个系统的 “难点 C 位”,承担起了更为复杂的任务。
数据库扩展大体有纵向扩展、主仆读代理模式、主–主模式、分区模式和分布式共识模式5类解决方案。这些方案共同构成了可扩展数据库的 “魔法宝典”,助力企业在数据的海洋中乘风破浪。
(1)纵向扩展
在数据库扩展的工具箱里,纵向扩展就像是给系统注入一剂强化针。它最直观的方式,是对硬件配置大刀阔斧地升级 —— 换上更强劲的 CPU、扩充海量内存、搭载读写速度更快的存储设备,如同给数据库系统装上超级引擎,让数据处理的吞吐量直线飙升。
同时,纵向扩展也在软件层面持续发力。以表结构优化为例,它会巧妙运用索引,让系统能快速定位数据;极力避免多表间复杂的关联查询,减少系统的运算负担。这种软硬件协同优化的方式,曾是第二平台应用扩展的黄金法则,在当时的技术环境下屡试不爽。
然而在第三平台云应用时代,纵向扩展就显得有些力不从心了。云应用庞大的用户规模与爆发式增长的数据需求,仅靠纵向扩展的单打独斗,根本无法满足日益严苛的可扩展性要求,逐渐在新的技术舞台上退居幕后 。
(2)主仆读代理模式
数据库服务层的横向扩展方法有多种,其中最基础(简洁)的是主-仆模式,如图1所示。

主-仆模式通常由一个Master(主)节点“挑大梁”,包揽所有数据的读写操作,同时配备一个或多个 Slave(仆)节点组成 “辅助小队”,专门负责数据的只读任务。
这样的设计和分工相当巧妙,相当于给数据读取能力装上了“加速器”,数倍提升读取效率,而主节点卸下部分读负载后,写操作的处理也更加游刃有余。我们知道大多数数据库系统读操作的数量远远超过写操作(如更改、删除、添加)的数量,因此读操作的加快能有效解决这类系统的效能瓶颈,让系统运行更加丝滑流畅。
主 - 仆模式能高效运转的关键在于 “单点写入” 的设计智慧。样的设计只让主节点执行写操作,就像给数据管理立下了一个唯一指挥权的规矩,这就从根源上规避了多点同时写入引发的数据同步混乱。
不过,主节点在完成写操作后,还得肩负起数据搬运工的重任,及时将更新的数据同步到各个只读节点。这就好比一场数据接力赛,要求主仆节点之间必须搭建起高带宽、低时延,否则一旦数据复制延迟,就会出现数据读取与写入 “对不上号” 的尴尬局面。
通常来说,为了让这个架构发挥最大威力,工程师们往往会在主 - 仆数据库架构中安插负载均衡组件。它就相当于一名智能调度员,可以精准分配数据读取任务,确保每个 Slave 节点都能物尽其用。
值得注意的是,这一层的负载均衡操作主要集中在 TCP/UDP 层,并且常常基于定制的数据库通信协议展开,和应用服务层常见的标准 HTTP (S) 负载均衡大不相同,堪称数据库横向扩展里的专属秘籍。
(3)主-主模式
前面咱们通过主-仆模式解决了系统读操作可扩展难题,那么,可写操作的 “扩容困境” 该怎么破呢?答案是确切的——有,只不过要攻克的复杂度会高很多。
回顾之前的章节中我们讨论过的CAP理论,在强一致性的数据库系统(ACID 系统)里,数据一致性就是一条金线,不可动摇。
因此,这类系统最大的挑战是如何保证各节点间所采用的架构能实现数据一致性。
但让多个节点同时支持并发读写,就像在数据王国里打开了 “潘多拉魔盒”,稍有不慎就会引发节点间的数据不一致危机。这类系统的终极挑战,就像在刀尖上跳平衡舞 —— 既要让写操作能横向扩展,又得像精密齿轮般确保所有节点的数据严丝合缝、毫无偏差。
强一致性的数据库系统(ACID系统)强调CAP中的数据一致性,而多节点同时支持并发读写操作极易造成节点间出现数据非一致性,因此,这类系统最大的挑战是如何保证各节点间所采用的架构能实现数据一致性——这类系统的终极挑战,就像在刀尖上跳平衡舞 —— 既要让写操作能横向扩展,又得像精密齿轮般确保所有节点的数据严丝合缝、毫无偏差。
要知道,多节点并发写跟奏交响乐没啥差别,每个节点的写入动作都可能影响全局。如何设计出既能承载高并发写操作,又能通过巧妙的架构(比如分布式共识算法、复杂的数据复制协议等)把一致性牢牢 “钉住”,简直是对工程师创造力和耐心的双重极限考验。这时候的系统设计,不再是主 - 仆模式那样的 “线性思维”,而是要构建一套如同精密钟表般的复杂协作机制,让每个写操作都能在多节点间找到自己的时间刻度,最终拼成完整一致的数据表盘。
以下图2为例,MySQL数据库的多Master节点模式采取了环状复制数据同步机制,就像搭建了一个紧密的接力环。在3个数据库服务器集群中,数据同步形成了一条闭合的环形链路:

- 第一集群的 Master 节点先将更新数据同步给第二集群的对应 Slave 节点,此时第二集群的节点 “接棒” 后切换身份,以 Master 节点的角色将数据传递给第三集群的 Slave 节点;
- 第三集群的节点 “接力” 后同样转换为 Master,再将数据回传给第一集群的同一节点,最终形成 “第一集群→第二集群→第三集群→第一集群” 的环形同步闭环。
这种设计的核心逻辑是用环型时序规避冲突。当多个节点需要同时更新数据时,环形链路为每个数据集分配了唯一的 “传递时区”—— 每个节点在环中只能按固定顺序接收和发送数据,就像列车沿着固定轨道行驶,避免了多节点并发写入同一目标时因 “路径交叉” 导致的数据交集冲突。例如,若两个节点同时向同一目标节点发送更新,环形机制会强制数据按顺序通过链路流转,确保后到达的数据能基于前序更新进行合并,而非直接覆盖,从而从架构层面降低了数据不一致的风险。
不过,这种 “环形接力” 也需要付出代价:
- 链路依赖强:任意一环的延迟或故障都会像 “多米诺骨牌” 一样影响整个集群的同步效率;
- 一致性延迟:数据需绕环一周才能完成全集群同步,在高并发场景下可能出现短期的节点间数据差异;
- 复杂度跃升:相比主仆模式的单向同步,环形架构的拓扑管理、故障恢复机制需要更精细的设计,堪称 “用架构复杂度换一致性保障” 的典型案例。
避免在多Master节点数据库系统中发生数据一致性冲突的解决方法有以下4种:
①彻底避免多节点写操作(这样又回到了主-仆模式)。
②在应用服务层逻辑上严格区分不同Master节点的写入区域,确保它们之间无交集(如不出现同时间内更改同一行数据的操作)。
③保证不同Master节点在不重叠的时间段内对同一区域进行操作。
④同步复制,所有节点会同时进行写操作,且当所有节点完成后,整个操作才会返回。这种模式显然对网络带宽的要求极高,并且为了满足数据的一致性而牺牲了可用性。
以下图所示的分布式数据库为例,我们可以按表1设计数据库CS中的表,以确保位于旧金山、纽约和达拉斯的Master节点可以同时完成写操作,并且不会出现冲突。


今天先到此结束,下篇内容我们再叙分区模式和分布式共识两种模式。88~
(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)
相关文章:

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)
在云应用/服务的 5 层架构里,数据库服务层稳坐第 4 把交椅,堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏,不少人都将它视为整个架构中的 “终极挑战”。 不过,也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...

AI Agent | Coze 插件使用指南:从功能解析到实操步骤
一、前言 在人工智能技术飞速发展的今天,低代码开发模式正成为构建智能应用的主流趋势。对于希望快速搭建 AI Bot 的开发者和业务人员而言,coze作为一款强大的低代码 AI 开发平台,凭借其高度模块化的插件体系脱颖而出。这些插件就像搭建智能…...
06、基础入门-SpringBoot-依赖管理特性
06、基础入门-SpringBoot-依赖管理特性 Spring Boot 的依赖管理特性是其核心优势之一,极大地简化了项目的构建和维护过程。以下是其主要特点: ## 1. 父项目依赖管理 ### 1.1 继承 spring-boot-starter-parent 在 pom.xml 文件中,通过继承 spr…...

MK米客方德SD NAND:无人机存储的高效解决方案
在无人机技术迅猛发展的当下,飞控系统的数据记录对于飞行性能剖析、故障排查以及飞行安全保障极为关键。以往,SD 卡是飞控 LOG 记录常见的存储介质,但随着技术的革新,新的存储方案不断涌现。本文聚焦于以 ESP32 芯片为主控制器的无…...

【vscode】解决vscode无法安装远程服务器插件问题,显示正在安装
文章目录 现状分析采用VSIX离线安装第一步:离线下载插件包第二步:把下载好的插件文件上传到远程服务器上第三步:在windows下打开vscode,并链接远端,进行安装 现状分析 vscode无法远程安装扩展插件,显示正在…...
1688 数据接口调用秘籍:高效获取商品实时信息的开发指南
在电商行业竞争白热化的当下,企业想要抢占市场先机,实时掌握商品信息至关重要。作为国内 B2B 电商巨头,1688 平台汇聚海量商品资源,通过高效调用其数据接口获取商品实时信息,能为企业价格策略制定、库存管理、竞品分析…...

【Spring】Spring的请求处理
欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 目录 引言HTTP/HTTPS协议Spring Web与Spring Web MVCSpring WebFlux 自定义的TPC/IP协议FTP、S…...

粒子群算法(PSO算法)
粒子群算法概述 1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…...
git提交库常用词
新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作
LLM智能体(LLM agents)是能够自主行动以实现特定目标的AI系统。在实际应用中,智能体能够将用户请求拆解为多个步骤,利用知识库或API获取数据,最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…...

SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)
1,现象 安装完VSCode以及各种需要的插件(比如SAP CDS Language Support),就可以做CAP开发。 用这个命令创建Project:cds init CAP-Test03 --add java 然后出来一个乱码错误 adding java The derived package name c…...

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤: 第一步: 第二步: 第三步: 第四步: 第五步…...

进阶-数据结构部分:2、常用排序算法
飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法,它们的优劣和适用场景如下: 冒泡排序(Bubble Sort):简单易懂,时间复杂度较高&…...
解决 Three.js Raycaster 点击位置与实际交点偏差问题
当使用 Three.js 的 Raycaster 时,如果发现点击位置与显示的碰撞点之间存在较大偏差,这通常是由于坐标系统不匹配或参数设置不正确导致的。以下是系统性的排查和解决方案: 1. 检查鼠标坐标转换 最常见的偏差原因是鼠标坐标到标准化设备坐标…...

25、DeepSeek-R1论文笔记
DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链(Chain of Thought)6、强化学习算法(GRPO)7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…...

LeetCode --- 156双周赛
题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值,然后相加即可,代码如下 // C class Solution {…...
模型量化AWQ和GPTQ哪种效果好?
环境: AWQ GPTQ 问题描述: 模型量化AWQ和GPTQ哪种效果好? 解决方案: 关于AWQ(Adaptive Weight Quantization)和GPTQ(Generative Pre-trained Transformer Quantization)这两种量化方法的…...

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
一、背景 npm 安装依赖报如下错: gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题,其实并不是你python环境问题…...

初识Linux · IP协议· 下
目录 前言: 内网IP和公网IP 内网IP 公网IP 路由 前言: 前文我们介绍了IP协议的协议头,通过源码等方式我们理解了IP协议中的字段,比如8位协议,比如通过环回问题引出的8位最大生存时间,比如8位协议&…...
5.27本日总结
一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...
JavaScript基础-创建对象的三种方式
在JavaScript中,对象是构建复杂数据结构和实现面向对象编程的核心。掌握如何创建对象对于每个开发者来说都是必不可少的技能。本文将介绍创建JavaScript对象的三种主要方式:对象字面量、构造函数以及类(ES6引入),并探讨…...

JAVA的常见API文档(上)
游戏打包 注意API文档中的方法不需要记忆!! 了解之后如果需要可以查询API文档 对Math的方法总结: 运用刚学的Math方法加快代码的运行效率 可以减少循环次数 找规律: 发现因子有规律: 必定一个大于平方根,…...
JavaScript 中的 for...in 和 for...of 循环详解
在 JavaScript 中,for...in 和 for...of 是两种常用的循环结构,但它们有着不同的用途和行为。很多初学者容易混淆这两者,本文将详细解析它们的区别、适用场景以及注意事项。 目录 for…in 循环 基本用法遍历对象属性注意事项 for…of 循环 …...
AtCoder AT_abc406_c [ABC406C] ~
前言 除了 A 题,唯一一道一遍过的题。 题目大意 我们定义满足以下所有条件的一个长度为 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1,A2,…,AN) 为波浪序列: N ≥ 4 N\ge4 N≥4(其实满足后面就必须满足这…...

Spark,连接MySQL数据库,添加数据,读取数据
连接数据库 可以看到shell中我们读取出的数据 在IDEA中打代码如果能输出跟shell中一样的结果即证明连接成功 【出错反思】 像我前面出错的原因就是在打代码时将密码输入错误 添加数据 读取数据就是在上面代码中一起展示了,这里我就不单独说了...
Linux容器技术详解
容器技术基础 什么是容器 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。 Docker官网:https://www.docker…...

【EDA软件】【联合Modelsim仿真使用方法】
背景 业界EDA工具仿真功能是必备的,例如Vivado自带仿真工具,且无需联合外部仿真工具,例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim,才能实现仿真功能。 方法一:FUXI联合ModelSim 1 添加testbench文件 新建to…...
STM32 __main
STM32开发中__main与用户main()函数的本质区别及工作机制 在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别承担运行时初始化和用户程序入口的职责。以下是它们的核心差异及协作机制: 一、定义与层级差异 __ma…...

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+
本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下: electoral…...
Python训练营打卡Day28
浙大疏锦行 DAY 28 类的定义和方法 知识点回顾: 1.类的定义 2.pass占位语句 3.类的初始化方法 4.类的普通方法 5.类的继承:属性的继承、方法的继承 作业 题目1:定义圆(Circle)类 要求: 1.包含属性&#x…...