想象你是一家计划在全国开分店的连锁奶茶店老板。选址、后厨、收银、冷链都要复制到每一家分店,而顾客无论走进哪一家,都应该喝到同一杯配方、付同一套价格。这正是云原生分布式数据库要做的事:数据散落在多个节点,却对外表现得像一台可靠的机器。TiDB、CockroachDB、YugabyteDB 就是三位装修风格完全不同的店长,他们的后厨布局,直接决定这杯茶怎么做、做多快、能不能防泼洒。本文会走进这三家后厨,对比它们存储原料的方式、点单的方言、做奶茶的事务流程,以及全国门店如何同步,最后帮你算一笔加盟账。
学习云原生数据库架构,能让你在技术选型、性能诊断和迁移方案设计时,不只看到表面跑分,而是理解每款产品背后的取舍逻辑,成为团队里最懂“怎么选”的那位专家。
目录
可视化演示
展示TiDB/CockroachDB/YugabyteDB分布式架构、多模型对比与水平扩展分片,交互切换查看核心设计。
本节配有交互动效(进入视口后自动加载,约 3KB)。
分布式架构 多节点Raft共识,Leader处理写入Follower同步 SQL层与存储层分离,计算无状态可弹性扩展 Quorum = floor(N/2) + 1 调节节点数查看共识与副本变化
架构全景:三家连锁的“后厨总览”
想象你是一家计划在全国开分店的连锁奶茶店老板。选址、后厨、收银、冷链都要复制到每一家分店,而顾客无论走进哪一家,都应该喝到同一杯配方、付同一套价格。这正是云原生分布式数据库要做的事:数据散落在多个节点,却对外表现得像一台可靠的机器。TiDB、CockroachDB、YugabyteDB 就是三位装修风格完全不同的店长,他们的后厨布局,直接决定这杯茶怎么做、做多快、能不能防泼洒。
三个后厨都分三层:门口的收银员负责听顾客点单、承诺出杯时间,这就是无状态的 SQL 层;中间的原料仓库负责存储茶、奶、珍珠,这就是存储引擎;店长则调度哪家分店缺货、新店开在哪里,这就是调度组件。TiDB 把这三层拆成 TiDB Server、TiKV、PD 三个独立角色;CockroachDB 把所有角色塞进同一个二进制,只在逻辑上区分 SQL 层、事务层和存储层;YugabyteDB 用 YB-Master 管元数据、YB-TServer 管数据。无论分工怎么变,它们都共用一句行话:过半确认。
这句行话正是 Raft 共识协议。在一个有 n 个副本的集群里,只有超过一半副本确认,一条数据才能算真正提交。n=3 时需要 2 票,n=5 时需要 3 票。这样少数派节点慢一点、甚至暂时宕机,集群都不会卡死,也不会出现两个节点都宣称写入成功的数据分叉。
回到奶茶店,三套方案都守着同一条规矩:过半门店确认新配方收到,新品才允许上架。后厨可以各有千秋,但这条“过半再开卖”的底线,是所有云原生分布式数据库共同的骨架。
- n 表示副本总数指参与投票确认的节点数量,比如 3 个分片副本。
- 整除 2 向下取整先看“一半”是多少,再取整数部分,忽略小数。
- 加 1 形成多数在半数基础上多 1 票,保证任何两个多数派必然有重叠。
存储引擎:奶茶原料的摆放密码
茶叶、牛奶、珍珠摆在哪里,决定了后厨效率。TiDB 的 TiKV 把每一行奶茶数据编码成一个键值对,底层借助 RocksDB 落盘;CockroachDB 用 Go 语言重写了 Pebble 引擎,追求更小的内存开销;YugabyteDB 的 DocDB 则把一行记录当成一份文档,兼顾 JSON 灵活性与关系表的严谨。
光有原料还不够,分店多了要按地区切分库存。TiKV 把数据切成默认约 96MB 的 Region,CockroachDB 切成约 64MB 的 Range,YugabyteDB 切成 Tablet。每个分片都拥有多副本,散落在不同节点,这样既能横向扩容,又能在节点故障时把副本补位。
无论哪种引擎,落盘前都要给行数据一个唯一地址。地址由表前缀和行 ID 拼接,再对分片数量取模,就知道该进哪个格子。
三家的货架摆法各有味道:TiKV 像把每杯成品分装成独立小包装,CockroachDB 用更轻的 Pebble 抽屉减少浪费,YugabyteDB 的 DocDB 则在每张卡片上写满配方、温度、甜度。但殊途同归,都是为了在海量订单里快速找到一杯茶,并把新店无痛接入。
- 键值对编码整行数据作为 value,key 是它在分布式系统中的唯一地址。
- key 拼接表前缀避免不同表的数据混淆,rowID 在一张表内唯一。
- 哈希运算把 key 打散成看似随机的数字,让数据均匀分布到 N 个分片。
- 取模定位对 N 取余数,决定这条数据属于哪个 Region、Range 或 Tablet。
SQL 兼容层:点单要用什么方言
点单要靠方言。TiDB 选择说 MySQL 方言,无数老应用只要改改连接串就能进门;CockroachDB 和 YugabyteDB 选择说 PostgreSQL 方言,支持更丰富的类型、索引和窗口函数;YugabyteDB 还额外派出一个会讲 Cassandra 方言的服务生 YCQL,照顾过去用 NoSQL 的客人。
说方言只是第一步,真正考验人的是后厨协作。SQL 层收到一条查询后,不会把整张表拉回一台机器硬算,而是把查询计划拆成多个子任务,交给不同分片的存储节点并行执行,最后再合并结果。这就是分布式执行器。
所以选店不能只看招牌。如果老团队只会 MySQL 话术,TiDB 是顺手的续杯;如果团队天天写 PostgreSQL,CockroachDB 和 YugabyteDB 更亲切。点单方言影响迁移成本,分布式执行器则决定大单会不会压垮后厨。
- 分片关系 \(R_r\)表示第 r 个分片中的那张表的数据。
- 过滤操作 \(\sigma_{\theta}\)按查询条件 \(\theta\) 只留下满足条件的行。
- 并集合并把每个分片的过滤结果合并成完整结果集。
事务模型:做一杯奶茶如何不洒
做一杯奶茶,最怕做到一半洒了。分布式数据库的事务,就是保证“茶、奶、珍珠要么都加,要么都不加”。TiDB 采用 Percolator 模型的两阶段提交,先给主记录打 prepare 标记,所有参与者确认后再写 commit;CockroachDB 用混合逻辑时钟 HLC 给事务排序,实现可串行化快照隔离;YugabyteDB 则用 DocDB 的冲突检测与重试,在写冲突时自动回滚。
三家的最终目标都是 ACID 事务。TiDB 靠全局时间戳决定先后,CockroachDB 靠 HLC 保证不依赖单一授时中心,YugabyteDB 则把事务状态记录在 DocDB 里。它们都遵循一个朴素法则:先准备,再落锤。
就像你点单时,收银员先跟后厨确认所有原料都齐,再一次性打小票。TiDB 靠中央时间戳,CockroachDB 靠自带时钟,YugabyteDB 靠文档状态机;不管哪种办法,都没人敢在原料没备齐时先把奶茶递给顾客。
- 事务状态集合事务只有在 prepare、commit、abort 三种状态间流转。
- commit_ts 是提交时间戳记录事务真正生效的全局时间点。
- 提交条件提交时间戳必须大于所有已开始事务的开始时间戳,才能保证不会读到旧数据。
多区域高可用:全国门店如何同步
全国门店同步,最难的是跨城市保持一致。三款数据库都把 Raft 作为复制骨架:每个分片的多个副本分布在不同的机房或区域,Leader 更新日志后,Follower 跟着补货。只有多数派确认,数据才算安全。
差异在策略细节。TiDB 的 PD 可以根据机房拓扑下发 Placement Rules,把副本放到指定城市,还能用 Raft Learner 做异地只读备份;CockroachDB 提出区域生存目标,可以选择“区域级可用”或“机房级别可用”,并用 leaseholder 把读写放到离用户最近的副本;YugabyteDB 默认同步复制,也提供 xCluster 做跨集群异步容灾。
所以跨城调货,永远看最远的确认店脸色。想要顾客在成都拿到和北京同一口味的奶茶,商家必须算清楚:哪些城市进 Q 集合,以及 Leader 该放在离用户最近的地方。
- 多数派集合 Q是本轮提交必须确认的那组副本。
- 往返延迟 RTT(L, i)Leader L 与副本 i 之间一次网络请求的往返时间。
- 取最大值同步复制不会比最慢的确认者更快。
性能与选型:哪家出杯快
比出杯速度,不能只看单店效率。跨地域延迟上,CockroachDB 的 leaseholder 路由和区域表设计优势明显;扩展性上,三款都能水平扩分片,但 YugabyteDB 对高并发写入的吞吐提升更直接;TiDB 的独门武器是 TiFlash 列存,让同一份数据既能做事务又能跑分析,也就是 HTAP。
运维复杂度同样影响“出杯”。TiDB 组件多,部署和调优门槛高;CockroachDB 只有一个二进制,上云最省心;YugabyteDB 居中,还保留了 PostgreSQL 生态的运维习惯。性能对比不能只看跑分,还要看团队养得起几个店长。
快不是唯一指标。TiDB 像大而全的旗舰店,CockroachDB 像标准化的连锁快闪店,YugabyteDB 像会多国语言的社区店;选哪家,得看你手里有多少店员、顾客分布在哪里,以及是不是马上要上数据分析。
- 实际写入字节数磁盘物理层真正落盘的字节数,包含排序、合并等额外写操作。
- 逻辑写入字节数应用层认为业务数据只写入了多少字节。
- 比值含义比值越大,SSD 磨损越严重,高并发写入性能越差。
选型场景:你的店该加盟哪家
加盟哪家品牌,本质是选适配自己场景的答案。已经有 MySQL 存量代码、还想在一个集群里跑风控报表,TiDB 的兼容性和 HTAP 能力最省事;业务横跨多个大区、订单对一致性要求极高,CockroachDB 的多区域强一致更安心;团队熟悉 PostgreSQL、又希望写入能随业务暴涨而水平扩展,YugabyteDB 值得优先测试。
部署考量也不可少:自建机房与公有云托管、副本数、跨区域带宽、监控告警、备份恢复,都应该变成可以打分的指标。
没有最好的奶茶店,只有最适合你的加盟方案。先把自己的需求列成评分表,再用三家后厨的真实架构打分,答案往往不会太远。
- 第 i 个维度权重 \(w_i\)表示这个维度对你业务的重要性,比如金融业务更看重强一致。
- 第 i 个维度得分 \(s_i\)对每款数据库在该维度上的表现打一个分。
- 加权求和所有维度的权重乘得分累加,得到一个可比较的总分。
AI 应用场景
金融核心系统迁移适配
阶段:数据基础设施选型与迁移
解决的问题:传统银行系统基于 MySQL,单库容量见顶,分库分表改造成本高、运维复杂。TiDB 提供 MySQL 协议兼容和 HTAP 能力,让同一套集群既能跑在线交易,又能支撑实时风控和报表,大幅降低迁移风险。
具体案例:某支付平台把账户流水从分库分表架构迁到 TiDB,SQL 层基本不改,仅调整连接串和少量语法,同时用 TiFlash 列存能力支持实时对账查询。
跨境电商多区域订单中心
阶段:在线交易数据层
解决的问题:订单数据需要跨区域强一致,传统主从复制延迟高、故障时可能丢数据。CockroachDB 通过多区域 Range 和 leaseholder 路由,让读写尽量发生在用户就近的区域,同时保持强一致。
具体案例:跨境电商把订单和库存表设置为区域表,欧、亚、美三地用户下单,写入延迟明显下降,跨区域故障时依然可以自动切换。
AI 实时推荐的特征存储
阶段:特征服务数据层
解决的问题:推荐系统需要高频写入用户行为、实时读取特征,PostgreSQL 单机写入容易成为瓶颈。YugabyteDB 提供 PostgreSQL 兼容接口和水平写入扩展,同时支持事务性更新特征。
具体案例:内容推荐团队把用户画像表迁移到 YugabyteDB,保留原有 ORM 代码,通过 YSQL 接口访问,写入吞吐提升明显,且多副本保证特征不丢。
Python 演示
# 一个简化版 Raft 投票模拟器, 用于理解分布式数据库多数派机制def quorum(n): return n // 2 + 1 class RaftVote: def __init__(self, total): self.total = total self.approved = 0 def approve(self): self.approved += 1 def can_commit(self): return self.approved >= quorum(self.total) PROFILES = [ {"name": "TiDB", "engine": "TiKV/RocksDB", "dialect": "MySQL"}, {"name": "CockroachDB", "engine": "Pebble", "dialect": "PostgreSQL"}, {"name": "YugabyteDB", "engine": "DocDB/RocksDB", "dialect": "PostgreSQL"},] if __name__ == "__main__": print("=== Cloud-native DB profiles ===") for item in PROFILES: print("name:", item["name"], "| engine:", item["engine"], "| dialect:", item["dialect"]) vote = RaftVote(3) vote.approve() vote.approve() print("3 replicas, 2 approved, commit allowed:", vote.can_commit()) print("Expected majority count:", quorum(3))
def quorum(n):定义多数派门槛函数,这是 Raft 提交的核心规则。return n // 2 + 1整数除法向下取整后加 1,得到过半票数。class RaftVote:模拟一次分布式写入的投票过程。self.approved += 1每收到一个副本确认,就把赞成票加一。return self.approved >= quorum(self.total)赞成票达到多数派时允许提交。PROFILES = [用列表记录三款数据库的存储引擎和 SQL 方言。vote.approve()模拟两个副本给出确认,对应三副本中的多数派。
常见误区
误区TiDB 兼容 MySQL,CockroachDB 兼容 PostgreSQL,那我原来用的存储过程、触发器、分区语法应该都能无缝迁移吧?
正解兼容层主要覆盖常用 SQL 语法、协议握手和连接驱动,不等于实现每一个数据库特性。比如 TiDB 对存储过程和触发器的支持有限,CockroachDB 对部分 PostgreSQL 扩展也有差异。比喻:两家店都叫“奶茶店”,点单方式一样,但这家有芋圆那家没有。选型前一定要做 SQL 兼容性测试。
为何常见:因为厂商宣传常强调“兼容”,用户容易把“协议兼容”理解成“语义完全一致”。
误区为了保证强一致,三副本肯定要三个节点都写完才能给客户端返回成功吧?
正解Raft 只需多数派确认即可提交,三副本中两票就能成功。少数派落后只会被 Leader 日志追平,不会阻塞正常写入。比喻:店长只要收到两家分店“已收到”就开卖,第三家稍后补签,不会让顾客等所有店长都点头。
为何常见:直觉上“全确认最安全”,忽略了多数派与少数派互补的数学性质。
误区把 MySQL 打成 Docker 镜像扔到 Kubernetes 上,就是云原生数据库了吧?
正解云原生数据库的核心是架构上计算与存储分离、分片弹性扩缩容、按需使用;跑在 K8s 只是部署形态之一。比喻:把奶茶店搬进购物中心不叫连锁化,真正的连锁要统一配方、实时调货、复制分店。
为何常见:因为“云原生”这个词和容器、Kubernetes 经常一起出现,产生语义混淆。
误区三款分布式数据库都能横向扩展,那分析型大查询也交给同一个集群跑就行了吧?
正解TiDB 有 TiFlash 列存专门支持分析负载;CockroachDB 和 YugabyteDB 主要还是 OLTP 优化,重型分析查询仍需要外部数仓或数据导出。比喻:能快速出杯不等于能包下整场宴会的外烩,后厨设备不同。
为何常见:因为三者在宣传中都会讲“扩展能力”,用户把扩展性等同于全场景能力。
面试题
Q1. TiDB 的 SQL 层主要负责什么?
- A.兼容 MySQL 协议并生成分布式执行计划← 正确答案
- B.直接存储每一行数据
- C.负责 Raft 日志复制
- D.只做负载均衡不解析 SQL
答案:A。TiDB Server 是无状态 SQL 层,负责协议接入、解析、生成执行计划;数据存储由 TiKV 负责,调度和分片由 PD 负责。B、C、D 都把职责错误地安到 SQL 层身上。
Q2. 三款云原生数据库共同使用的多副本共识协议是?
- A.Paxos
- B.Raft← 正确答案
- C.PBFT
- D.Gossip
答案:B。TiDB、CockroachDB、YugabyteDB 都使用 Raft 保证多副本日志一致。Paxos 是另一种共识算法,PBFT 用于拜占庭容错,Gossip 常用于节点信息传播而非强一致日志复制。
Q3. 三副本 Raft 集群中,Leader 提交一条日志至少需要几个副本确认?
- A.1 个
- B.2 个← 正确答案
- C.3 个
- D.0 个(不需确认)
答案:B。根据多数派公式,3 个副本需要 2 个确认即可提交。Leader 自身算一票,再加任意一个 Follower 确认就达到多数派,这也是 Raft 容错 1 个节点故障的原因。
Q4. CockroachDB 使用哪种机制为分布式事务排序?
- A.Unix 时间戳
- B.混合逻辑时钟 HLC← 正确答案
- C.单调递增计数器
- D.原子钟同步
答案:B。CockroachDB 使用混合逻辑时钟,把物理时间和逻辑计数器结合,避免依赖单一授时中心。Unix 时间戳无法保证跨节点因果顺序,单调计数器无法全局统一,原子钟同步成本过高。
Q5. YugabyteDB 的 YSQL 接口主要兼容哪种数据库方言?
- A.MySQL 8.0
- B.PostgreSQL← 正确答案
- C.Oracle
- D.SQL Server
答案:B。YugabyteDB 的 YSQL 主要兼容 PostgreSQL,YCQL 则兼容 Cassandra 风格。TiDB 面向 MySQL 生态,CockroachDB 也更贴近 PostgreSQL 方言。
Q6. TiDB 集群中负责分片调度与全局时间戳分配的核心组件是?
- A.TiKV
- B.TiDB Server
- C.PD← 正确答案
- D.TiFlash
答案:C。PD(Placement Driver)负责维护元数据、分片调度、负载均衡和全局时间戳分配。TiKV 负责存储,TiDB Server 负责 SQL 层,TiFlash 负责列存分析。
Q7. 关于三款数据库的多区域高可用机制,正确的说法包括哪些?
- A.都使用 Raft 在副本间复制日志← 正确答案
- B.都支持把副本部署到不同机房或区域← 正确答案
- C.都只能部署在单个可用区
- D.多数派确认后才能提交写入← 正确答案
答案:ABD。三款数据库都用 Raft 复制日志,且支持跨机房、跨区域部署,提交时遵循多数派确认。C 说“只能部署单可用区”与云原生多区域方向完全相反。
Q8. 云原生分布式数据库的典型架构特征有哪些?
- A.计算层无状态,可弹性伸缩← 正确答案
- B.数据按分片分布并多副本← 正确答案
- C.所有数据仅保存在单个节点
- D.通过共识协议保证容灾← 正确答案
答案:ABD。云原生数据库强调计算与存储分离、分片扩展、多副本容灾,并通过共识协议保持一致性。C“单节点保存所有数据”是单体数据库的特征,不属于分布式架构。
Q9. 从技术选型角度看,以下判断正确的有哪些?
- A.TiDB 便于 MySQL 存量业务平滑迁移← 正确答案
- B.CockroachDB 对多区域强一致访问友好← 正确答案
- C.YugabyteDB 完全不支持 PostgreSQL 特性
- D.运维复杂度应计入选型评分权重← 正确答案
答案:ABD。TiDB 兼容 MySQL 协议,适合 MySQL 迁移;CockroachDB 的多区域路由和区域表适合跨地域强一致;运维复杂度会直接影响长期成本,应当计入评分。C 错误,YugabyteDB 的 YSQL 非常重视 PostgreSQL 兼容。
Q10. 一个已有 PostgreSQL 应用且需要高写入扩展的团队,最应该优先考察哪款数据库?
- A.优先选 TiDB 做平滑迁移
- B.优先选 CockroachDB 做跨域强一致
- C.优先选 YugabyteDB 做写入扩展← 正确答案
- D.优先选 SQLite 做单机存储
答案:C。已有 PostgreSQL 应用意味着需要保留 PostgreSQL 兼容层,高写入扩展要求良好的分片写入能力,YugabyteDB 的 YSQL 兼容 PostgreSQL,并以 Tablet 分片支撑横向扩展。TiDB 更偏 MySQL,CockroachDB 强项不在“高写入扩展”这个诉求,SQLite 则完全不支持分布式。