跳转至

CockroachDB 分布式 SQL

CockroachDB 是一款"打不死"的分布式 SQL 数据库(名字来自蟑螂的生存能力),兼容 PostgreSQL 协议,自动分片和故障恢复,适合需要高可用和跨区域部署的大规模数据平台。

核心知识点

知识点说明
数据库类型分布式 SQL 数据库(NewSQL)
开发团队Cockroach Labs
许可证BSL(Business Source License)
PostgreSQL 兼容兼容 PostgreSQL wire protocol
核心优势自动分片、强一致性、多活部署、故障自愈
一致性模型可序列化隔离(Serializable Isolation)
适用场景金融交易、多区域部署、高可用关键应用

安装配置

方法一:二进制安装

# 下载 CockroachDB
curl https://binaries.cockroachdb.com/cockroach-latest.linux-amd64.tgz | tar -xz
sudo cp cockroach-*/cockroach /usr/local/bin/  # 安装到系统路径

# 启动单节点(开发/测试)
cockroach start-single-node \
  --insecure \                         # 不启用 TLS(开发环境)
  --listen-addr=localhost:26257 \      # 监听地址
  --http-addr=localhost:8080 \         # Web UI 地址
  --store=cockroach-data               # 数据存储目录

# Web UI: http://localhost:8080

方法二:Docker

docker run -d \
  --name cockroach \
  -p 26257:26257 \                    # SQL 端口
  -p 8080:8080 \                      # Web UI 端口
  cockroachdb/cockroach start-single-node --insecure

# 连接
cockroach sql --insecure --host=localhost:26257
# 或者用 psql(兼容 PostgreSQL)
psql -h localhost -p 26257 -U root

基本使用

因为兼容 PostgreSQL,SQL 语法基本相同

-- 创建数据库和表
CREATE DATABASE bioinfo;              -- 创建数据库
SET DATABASE = bioinfo;               -- 使用数据库

CREATE TABLE samples (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),  -- UUID 主键(分布式友好)
    sample_id STRING UNIQUE,                        -- 样本 ID
    diagnosis STRING NOT NULL,                      -- 诊断
    bmi DECIMAL(5,2),                              -- BMI
    metadata JSONB,                                -- JSON 元数据
    created_at TIMESTAMPTZ DEFAULT now()           -- 时间戳
);

-- 增删改查
INSERT INTO samples (sample_id, diagnosis, bmi, metadata)
VALUES ('T2D_001', 'T2D', 28.5, '{"platform": "NovaSeq"}');

SELECT sample_id, diagnosis, bmi FROM samples WHERE diagnosis = 'T2D';

-- JSONB 查询(和 PostgreSQL 一样)
SELECT sample_id, metadata->>'platform' AS platform FROM samples;

CockroachDB 特有功能

-- 查看数据分布(哪些节点存了哪些数据)
SHOW RANGES FROM TABLE samples;       -- 查看表的 Range 分布

-- 多区域配置(跨地域部署)
ALTER DATABASE bioinfo SET PRIMARY REGION = "us-east1";
ALTER DATABASE bioinfo ADD REGION "us-west1";
ALTER DATABASE bioinfo ADD REGION "eu-west1";

-- 表级别的数据本地化
ALTER TABLE samples SET LOCALITY REGIONAL BY ROW;  -- 数据就近存储

高级用法

1. 事务处理

-- CockroachDB 默认使用可序列化隔离级别(最高安全级别)
BEGIN;
  INSERT INTO samples (sample_id, diagnosis, bmi)
  VALUES ('T2D_010', 'T2D', 27.5);

  UPDATE samples SET bmi = 28.0 WHERE sample_id = 'T2D_001';
COMMIT;

-- 如果事务冲突,CockroachDB 会自动重试

2. Python 操作

import psycopg2  # 用 PostgreSQL 驱动连接 CockroachDB

conn = psycopg2.connect(
    host="localhost",
    port=26257,
    user="root",
    database="bioinfo",
    sslmode="disable"  # 开发环境
)
cursor = conn.cursor()

cursor.execute("SELECT sample_id, bmi FROM samples WHERE diagnosis = %s", ("T2D",))
for row in cursor.fetchall():
    print(f"样本: {row[0]}, BMI: {row[1]}")

conn.close()

常见报错与解决

报错信息原因解决方法
connection refused :26257服务未启动启动 CockroachDB
TransactionRetryError事务冲突重试事务(CockroachDB 常见)
PostgreSQL 语法不支持部分 PG 扩展不兼容查看兼容性文档
性能低于预期单节点瓶颈添加更多节点组成集群

速查表

-- ===== CockroachDB 速查表 =====

-- 安装启动
-- cockroach start-single-node --insecure

-- 连接
-- cockroach sql --insecure
-- psql -h localhost -p 26257 -U root

-- 基本操作(PostgreSQL 语法)
CREATE DATABASE db;
CREATE TABLE t (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name STRING);
INSERT INTO t (name) VALUES ('test');
SELECT * FROM t;

-- 分布式特有
SHOW RANGES FROM TABLE t;             -- 数据分布
SHOW CLUSTER SETTING all;             -- 集群配置

-- CockroachDB vs TiDB vs PostgreSQL
-- CockroachDB: PG 兼容, 可序列化隔离, 多活部署
-- TiDB: MySQL 兼容, HTAP, TiFlash 列存
-- PostgreSQL: 单机最强, 扩展丰富, 生态完善

-- Python: pip install psycopg2-binary(直接用 PG 驱动)