云原生数据库新选择:TiDB vs CockroachDB vs YugaByte 对比
传统 MySQL/PostgreSQL 够用吗?当你需要横向扩展、强一致、高可用时,这三款分布式 SQL 数据库可能是更好的选择。本文实测对比,帮你选型不踩坑。
什么时候需要云原生分布式数据库?
在开始对比之前,先说清楚一个前提:不是所有人都需要分布式数据库。
适合的场景
| 场景 | 推荐原因 |
|---|---|
| —— | ———- |
| 数据量 > 1TB | 单机存储瓶颈明显 |
| QPS > 10万 | 需要水平扩展 |
| 多地部署 | 需要跨区域强一致 |
| 微服务架构 | 需要独立的数据库服务 |
| 金融级可靠性 | 不能容忍任何数据丢失 |
不适合的场景
三大数据库核心对比
产品定位
| 特性 | 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 踩坑
1. 大事务限制:单事务不超过 10MB,建议分批处理
2. 热点问题:自增主键会导致写入热点,改用 UUID 或分布式 ID
3. 索引选择:唯一索引和主键分离,避免 TiKV 热点
CockroachDB 踩坑
1. 写入放大:写入延迟比 MySQL 高,批量写入更优
2. SQL 限制:某些 PostgreSQL 特性不支持(如触发器)
3. Cost Based Optimizer:新版本才稳定,老版本慎用
YugaByte 踩坑
1. 文档较少:遇到问题需要看源码
2. 版本兼容:PostgreSQL 兼容模式偶有不兼容
3. 运维经验:社区案例少,遇到问题较难找到解决方案
总结
| 维度 | TiDB | CockroachDB | YugaByte |
|---|---|---|---|
| —— | —— | ————- | ———- |
| **性能** | 🥇 | 🥉 | 🥈 |
| **MySQL 兼容性** | 🥇 | ❌ | ❌ |
| **PostgreSQL 兼容性** | ❌ | 🥇 | 🥈 |
| **强一致性** | 🥈 | 🥇 | 🥇 |
| **全球部署** | 🥈 | 🥇 | 🥈 |
| **运维简单** | 🥈 | 🥉 | 🥈 |
| **中文支持** | 🥇 | ❌ | ❌ |
最终建议:
分布式数据库不是银弹,迁移前务必做好充分测试!
关于作者
长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。
个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。
