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 | 分片单元,过大自动分裂 |
| Replica | Raft 组内副本,Leader 处理读写 |
| Leaseholder | Range 的租约持有者,优化本地读 |
| Zone / Region | 拓扑标签,控制副本地理分布 |
| Survival Goal | ZONE / REGION 级故障容忍策略 |
核心特性
| 特性 | 说明 |
|---|---|
| 强一致 | 默认 Serializable,无「读己之写」外的常见脏读 |
| PG 兼容 | 多数 SQL、驱动按 PostgreSQL 使用 |
| 多区域 | REGIONAL BY ROW / GLOBAL 表类型,就近读、控制延迟 |
| 弹性 | 加节点自动再均衡 Range |
| 云原生 | K8s Operator、托管版 CockroachDB Cloud |
与 TiDB / OceanBase / Vitess 对比
| 维度 | CockroachDB | TiDB / OceanBase |
|---|---|---|
| 协议 | PostgreSQL | MySQL(及 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 运维脚本 |
| K8s | 见 Kubernetes |
Spring / Java
使用 PostgreSQL 驱动:
spring:
datasource:
url: jdbc:postgresql://crdb-public:26257/app_db?sslmode=require
username: root
password: ***- PostgreSQL — SQL 与类型参考
- MyBatis、JPA(方言选 PostgreSQL)