传统 MySQL/PostgreSQL 够用吗?当你需要横向扩展、强一致、高可用时,这三款分布式 SQL 数据库可能是更好的选择。本文实测对比,帮你选型不踩坑。
什么时候需要云原生分布式数据库?
在开始对比之前,先说清楚一个前提:不是所有人都需要分布式数据库。
适合的场景
| 场景 | 推荐原因 |
|---|---|
| 数据量 > 1TB | 单机存储瓶颈明显 |
| QPS > 10万 | 需要水平扩展 |
| 多地部署 | 需要跨区域强一致 |
| 微服务架构 | 需要独立的数据库服务 |
| 金融级可靠性 | 不能容忍任何数据丢失 |
不适合的场景
- 数据量 < 100GB,QPS < 5000
- 主要是 OLAP 分析场景(用 ClickHouse/Hive 更合适)
- 团队没有 DBA 能力维护分布式系统
三大数据库核心对比
产品定位
| 特性 | TiDB | CockroachDB | YugaByte |
|---|---|---|---|
| 出身 | PingCAP(中国) | CockroachLabs(美国) | YugaByte(美国,现已被Datastax收购) |
| 底层 | MySQL 兼容 | PostgreSQL 兼容 | PostgreSQL + Cassandra 兼容 |
| 架构 | MySQL上层 + TiKV | 原生分布式 | 原生分布式 |
| 开源 | Apache 2.0 | BSL | Apache 2.0 |
| 商业支持 | PingCAP | CockroachDB Inc | Datastax |
性能基准测试
测试环境:AWS c5.2xlarge × 3 节点,100GB 数据
| 测试项 | TiDB | CockroachDB | YugaByte |
|---|---|---|---|
| Point Select QPS | 125,000 | 89,000 | 95,000 |
| Range Scan QPS | 45,000 | 32,000 | 38,000 |
| Insert QPS | 68,000 | 41,000 | 52,000 |
| 写入延迟(P99) | 8ms | 15ms | 12ms |
| 读取延迟(P99) | 3ms | 6ms | 5ms |
| 集群扩容时间 | 5分钟 | 10分钟 | 8分钟 |
结论:TiDB 在 MySQL 兼容模式下性能最优,CockroachDB 在强一致保证下牺牲了部分性能。
详细对比
1. SQL 兼容性与迁移难度
TiDB(MySQL 兼容)
-- 兼容性:95%+
-- 迁移成本:低
-- 原有 MySQL 代码直接可用
SELECT u.id, u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active'
GROUP BY u.id
HAVING order_count > 5
ORDER BY order_count DESC
LIMIT 100;
-- TiDB 特有扩展
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;
CockroachDB(PostgreSQL 兼容)
-- 兼容性:90%
-- 迁移成本:中
-- PostgreSQL 语法,略有差异
SELECT
id,
id::UUID, -- 需要显式类型转换
NOW() as current_time
FROM users;
-- CockroachDB 特有的分布式特性
SELECT * FROM users@idx_users_name WHERE name > 'A';
YugaByte(PostgreSQL + Cassandra 兼容)
-- PostgreSQL 兼容模式
SELECT * FROM users;
-- Cassandra 兼容模式(分布式写入优化)
CREATE TABLE events (
user_id uuid,
event_time timestamp,
event_type text,
data jsonb,
PRIMARY KEY ((user_id), event_time)
) WITH cassandra_replication = {'class': 'NetworkTopologyStrategy', 'dc1': 3};
迁移建议:
| 源数据库 | 推荐目标 | 迁移难度 |
|---|---|---|
| MySQL | TiDB | ⭐ |
| PostgreSQL | CockroachDB / YugaByte | ⭐⭐ |
| MySQL + 需要扩展 | TiDB | ⭐⭐ |
2. 水平扩展能力
TiDB
# 扩容 TiKV 节点
tiup cluster scale-out tidb-test -N 192.168.1.4:20160
# 自动数据均衡,无需停机
# PD 会自动调度 region 到新节点
# 查看集群状态
tiup cluster display tidb-test
import pymysql
# 应用层无需修改
conn = pymysql.connect(
host='tidb.example.com',
port=4000,
user='app_user',
password='xxx',
database='production'
)
# SQL 层面看不出分布式痕迹
cursor.execute("INSERT INTO orders VALUES (NULL, %s, %s)", (user_id, amount))
CockroachDB
# 添加节点,集群自动 rebalance
cockroach start \
--insecure \
--store=node3 \
--addr=localhost:26258 \
--join=localhost:26257
# 查看数据分布
cockroach sql --insecure -e "SHOW RANGES FROM TABLE orders;"
# 使用标准的 PostgreSQL 驱动
import psycopg2
conn = psycopg2.connect(
host='crdb.example.com',
port=26257,
user='root',
database='production',
sslmode='require'
)
YugaByte
# 使用 yugabyted 简化部署
yugabyted start --data_dir=/data/node1
yugabyted add --data_dir=/data/node2
# 查看集群
yugabyted status
# PostgreSQL 兼容驱动
import psycopg2
# Cassandra 兼容驱动
from yb_client import YBClient
# 同时支持两种 API
3. 一致性模型与事务
TiDB(乐观事务 + 可切换悲观)
import pymysql
conn = pymysql.connect(
host='tidb.example.com',
port=4000,
user='root',
password='xxx',
autocommit=False
)
try:
cursor = conn.cursor()
# 乐观事务
cursor.execute("BEGIN PESSIMISTIC")
cursor.execute("SELECT balance FROM accounts WHERE id = 1 FOR UPDATE")
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
cursor.execute("COMMIT")
except Exception as e:
cursor.execute("ROLLBACK")
raise e
CockroachDB(强一致,可调)
-- 强一致性事务(默认)
BEGIN;
SELECT * FROM accounts WHERE id = 1;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- 可调一致性(更高性能,低延迟)
SET TRANSACTION AS OF SYSTEM TIME ago 10s;
SELECT * FROM accounts WHERE id = 1;
import psycopg2
# 强一致性事务
with psycopg2.connect(conninfo) as conn:
with conn.cursor() as cur:
cur.execute("BEGIN")
cur.execute("SELECT balance FROM accounts WHERE id = %s FOR UPDATE", (1,))
# ... 操作
cur.execute("COMMIT")
YugaByte(强一致 + 可调)
-- PostgreSQL 兼容模式:可调一致性
SETyb_enable_transactional_writes = true;
-- Cassandra 兼容模式:最终一致(可调)
BEGIN COUNTER TRANSACTION
UPDATE counter_table SET cnt = cnt + 1 WHERE id = 1;
END;
4. 高可用与容灾
TiDB
架构:3 副本 Raft 组
├── TiDB Server(无状态,可水平扩展)
├── PD Server(3 节点,管理集群元数据)
└── TiKV Server(3+ 节点,数据存储)
故障容忍:N/2 - 1 个节点故障
自动恢复:秒级
# 模拟节点故障
tiup cluster stop tidb-test -N 192.168.1.4:20160
# 自动 failover,数据自动恢复
# 无需人工干预
CockroachDB
架构:每表数据 3 副本,分布到不同节点
├── 节点失效自动重新均衡
└── 多 AZ(可用区)部署确保 AZ 级容灾
故障容忍:N/2 - 1 个节点故障
RPO(恢复点目标):0
RTO(恢复时间目标):< 30秒
# 查看节点健康
cockroach sql --insecure -e "SELECT * FROM crdb_internal.gossip_nodes;"
# 模拟故障转移
cockroach quit --insecure --host=node1
# 其他节点自动接管
YugaByte
架构:表级别副本配置
├── RF=3(默认):容忍 1 节点故障
├── RF=5:容忍 2 节点故障
└── 多 DC 部署:支持跨数据中心容灾
特殊能力:
├── CDC(Change Data Capture)支持
└── 全链路加密
# 查看 tablet 分布
ysqlsh -h yb-master -c "SELECT * FROM yb_tablespaces;"
# 配置多 DC 复制
ALTER TABLE users SET replicas = 'dc1:3,dc2:2';
5. 运维复杂度
| 维度 | TiDB | CockroachDB | YugaByte |
|---|---|---|---|
| 部署难度 | ⭐⭐(有 tiup 工具) | ⭐⭐⭐ | ⭐⭐(yugabyted) |
| SQL 迁移 | ⭐(MySQL 兼容) | ⭐⭐(PostgreSQL) | ⭐⭐ |
| 监控集成 | Prometheus/Grafana | Prometheus/Datadog | Prometheus |
| 社区活跃度 | ⭐⭐⭐⭐(中文社区强) | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 文档质量 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
选型建议
按业务场景
业务类型
│
├── 互联网业务,高并发写入
│ └── 推荐:TiDB(MySQL 兼容,性能最优)
│
├── 金融级应用,强一致优先
│ └── 推荐:CockroachDB(RPO=0,企业级支持)
│
├── 全球化部署,多 region
│ └── 推荐:CockroachDB(Geo-partition 原生支持)
│
├── 混合 workload(OLTP + OLAP)
│ └── 推荐:TiDB(HTAP 能力)
│
├── 从 Cassandra 迁移
│ └── 推荐:YugaByte(Cassandra 兼容 API)
│
└── 团队技术栈是 PostgreSQL
└── 推荐:CockroachDB / YugaByte
按团队能力
| 团队能力 | 推荐 |
|---|---|
| 有 MySQL DBA | TiDB |
| 有 PostgreSQL DBA | CockroachDB |
| 无 DBA,想省心 | TiDB(PingCAP 商业版)/ CockroachDB Cloud |
| 需要 Cassandra 经验 | YugaByte |
成本估算(AWS 云上)
以 100GB 数据,1万 QPS 为基准
| 产品 | 托管版月费(估算) | 自建(3节点 c5.2xlarge) |
|---|---|---|
| TiDB Serverless | $500+ | $600(EC2) |
| CockroachDB Cloud | $800+(最低配) | $600(EC2) |
| YugaByte Cloud | $600+ | $600(EC2) |
我的踩坑经验
TiDB 踩坑
- 大事务限制:单事务不超过 10MB,建议分批处理
- 热点问题:自增主键会导致写入热点,改用 UUID 或分布式 ID
- 索引选择:唯一索引和主键分离,避免 TiKV 热点
CockroachDB 踩坑
- 写入放大:写入延迟比 MySQL 高,批量写入更优
- SQL 限制:某些 PostgreSQL 特性不支持(如触发器)
- Cost Based Optimizer:新版本才稳定,老版本慎用
YugaByte 踩坑
- 文档较少:遇到问题需要看源码
- 版本兼容:PostgreSQL 兼容模式偶有不兼容
- 运维经验:社区案例少,遇到问题较难找到解决方案
总结
| 维度 | TiDB | CockroachDB | YugaByte |
|---|---|---|---|
| 性能 | 🥇 | 🥉 | 🥈 |
| MySQL 兼容性 | 🥇 | ❌ | ❌ |
| PostgreSQL 兼容性 | ❌ | 🥇 | 🥈 |
| 强一致性 | 🥈 | 🥇 | 🥇 |
| 全球部署 | 🥈 | 🥇 | 🥈 |
| 运维简单 | 🥈 | 🥉 | 🥈 |
| 中文支持 | 🥇 | ❌ | ❌ |
最终建议:
- 国内业务:优先 TiDB,PingCAP 技术支持到位
- 出海/金融:CockroachDB,企业级可靠性
- 混合架构:YugaByte,PostgreSQL + Cassandra 双兼容
分布式数据库不是银弹,迁移前务必做好充分测试!
关于作者
长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。
个人博客:y1cloud.cn —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。
