云原生数据库新选择:TiDB vs CockroachDB vs YugaByte 对比

阿里云上云采购季 2核2G云服务器99元/年 续费同价

传统 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 踩坑

  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 兼容性 ❌ 🥇 🥈
强一致性 🥈 🥇 🥇
全球部署 🥈 🥇 🥈
运维简单 🥈 🥉 🥈
中文支持 🥇 ❌ ❌

最终建议:

  • 国内业务:优先 TiDB,PingCAP 技术支持到位
  • 出海/金融:CockroachDB,企业级可靠性
  • 混合架构:YugaByte,PostgreSQL + Cassandra 双兼容

分布式数据库不是银弹,迁移前务必做好充分测试!


关于作者

长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。

个人博客:y1cloud.cn —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。

发表评论