CockroachDB

返回 分布式数据库

CockroachDB(CRDB)是受 Google Spanner 启发、开源的分布式 SQL 数据库:默认 Serializable 隔离,PostgreSQL 线协议兼容(常用 postgresql JDBC),数据按 Range 分片并多副本,擅长**多区域部署、生存目标(Survival Goals)**与弹性扩缩。适合 PG 技术栈、全球化部署、强一致 场景,而非 MySQL 协议栈。


架构

应用(PostgreSQL 协议 / pgx、JDBC)
        │
        ▼
   SQL 层(无状态,可水平扩展)
        │
        ▼
   KV 层:Range(连续 key 区间)→ 多副本(Raft)
        │
   每个 Range 默认多副本分布在不同节点/可用区
概念说明
Range分片单元,过大自动分裂
ReplicaRaft 组内副本,Leader 处理读写
LeaseholderRange 的租约持有者,优化本地读
Zone / Region拓扑标签,控制副本地理分布
Survival GoalZONE / REGION 级故障容忍策略

核心特性

特性说明
强一致默认 Serializable,无「读己之写」外的常见脏读
PG 兼容多数 SQL、驱动按 PostgreSQL 使用
多区域REGIONAL BY ROW / GLOBAL 表类型,就近读、控制延迟
弹性加节点自动再均衡 Range
云原生K8s Operator、托管版 CockroachDB Cloud

与 TiDB / OceanBase / Vitess 对比

维度CockroachDBTiDB / OceanBase
协议PostgreSQLMySQL(及 OceanBase Oracle 模式)
隔离级别默认 Serializable常用 RR / 快照隔离(产品实现各异)
强项多区域、全球表、PG 生态国内 OLTP/HTAP、MySQL 迁移
典型客户画像全球化 SaaS、PG 团队国内互联网、金融 MySQL 栈

已有 MySQL 存量且不愿改驱动时,优先 TiDB/OceanBase/Vitess;PG 或新系统且要多活,可评估 CRDB。


多区域(简述)

-- 区域级表:行数据归属某 region(就近访问)
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  region crdb_internal_region NOT NULL,
  name STRING
) LOCALITY REGIONAL BY ROW;
 
-- 全局表:所有区域可读,写延迟较高
CREATE TABLE config (
  key STRING PRIMARY KEY,
  value STRING
) LOCALITY GLOBAL;

设计时明确:延迟 vs 一致性 vs 读本地 的权衡,避免把所有表设为 GLOBAL。


使用注意

建议
热点避免单调递增主键打满单 Range(可用 UUID、hash 前缀)
大事务控制事务大小,Serializable 下冲突会重试
序列使用 unique_rowid() 或应用 分布式 ID
与 MySQL 工具迁移需评估方言,不能直接用 MySQL 运维脚本
K8sKubernetes

Spring / Java

使用 PostgreSQL 驱动

spring:
  datasource:
    url: jdbc:postgresql://crdb-public:26257/app_db?sslmode=require
    username: root
    password: ***

相关链接