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


阿里云推广

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

传统 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 双兼容
  • 分布式数据库不是银弹,迁移前务必做好充分测试!


    关于作者

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

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

    发表评论