扩缩容 #

一、扩缩容概述 #

1.1 扩缩容特点 #

text
CockroachDB 扩缩容特点
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   在线扩缩容:                                               │
│   ├── 无需停机                                             │
│   ├── 自动数据均衡                                         │
│   └── 透明切换                                             │
│                                                             │
│   线性扩展:                                                 │
│   ├── 添加节点增加容量                                     │
│   ├── 添加节点增加性能                                     │
│   └── 线性扩展能力                                         │
│                                                             │
│   自动均衡:                                                 │
│   ├── Range自动分布                                        │
│   ├── Leader自动分布                                       │
│   └── 负载自动均衡                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、扩容操作 #

2.1 添加节点 #

bash
# 添加新节点到现有集群
cockroach start \
    --join=existing-node1:26257,existing-node2:26257,existing-node3:26257 \
    --store=path=/data/cockroach \
    --cache=8GB \
    --max-sql-memory=4GB \
    --locality=region=us-east,zone=us-east-1a \
    --background

# 新节点会自动:
# 1. 加入集群
# 2. 同步数据
# 3. 接收Range副本
# 4. 成为Leader候选

2.2 验证扩容 #

sql
-- 查看节点状态
SELECT 
    node_id,
    is_live,
    locality,
    replicas,
    lease_holder
FROM crdb_internal.kv_node_status;

-- 查看集群大小
SELECT COUNT(*) AS node_count
FROM crdb_internal.kv_node_status
WHERE is_live = true;

-- 查看Range分布
SELECT 
    node_id,
    COUNT(*) AS range_count
FROM crdb_internal.ranges
CROSS JOIN UNNEST(replicas) AS node_id
GROUP BY node_id
ORDER BY node_id;

2.3 监控均衡进度 #

sql
-- 查看Range迁移状态
SELECT 
    range_id,
    replicas,
    voting_replicas
FROM crdb_internal.ranges
ORDER BY range_id
LIMIT 20;

-- 查看数据分布
SELECT 
    locality,
    COUNT(*) AS range_count
FROM crdb_internal.ranges r
CROSS JOIN UNNEST(r.replicas) AS replica
JOIN crdb_internal.kv_node_status n ON n.node_id = replica
GROUP BY locality;

-- 查看均衡进度
-- 在 Web UI 中查看: http://localhost:8080
-- 导航到 Overview > Replication

三、缩容操作 #

3.1 安全移除节点 #

bash
# 步骤1: 排空节点数据
cockroach node drain <node-id> --host=<any-node>:26857

# 步骤2: 停止节点
cockroach quit --host=<node-to-remove>:26257

# 步骤3: 下线节点
cockroach node decommission <node-id> --host=<any-node>:26257

# 步骤4: 等待数据迁移完成
cockroach node status --decommission --host=<any-node>:26257

# 步骤5: 确认节点已移除
cockroach node status --host=<any-node>:26257

3.2 缩容SQL操作 #

sql
-- 查看节点状态
SELECT 
    node_id,
    is_live,
    draining,
    decommissioning,
    membership
FROM crdb_internal.kv_node_status;

-- 开始排空节点
-- (通过命令行执行)
-- cockroach node drain <node-id>

-- 监控排空进度
SELECT 
    node_id,
    replicas,
    lease_holder
FROM crdb_internal.kv_node_status
WHERE node_id = <node-id>;

-- 确认节点可以安全移除
-- 确保 replicas = 0 且 lease_holder = 0

3.3 缩容注意事项 #

text
缩容注意事项
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 确保足够的副本数                                       │
│      ├── 移除前检查副本数                                  │
│      ├── 确保移除后仍有足够副本                            │
│      └── 最少保持3副本                                     │
│                                                             │
│   2. 避免同时移除多个节点                                   │
│      ├── 一次移除一个节点                                  │
│      ├── 等待数据迁移完成                                  │
│      └── 确认集群稳定后再移除下一个                        │
│                                                             │
│   3. 监控数据迁移                                           │
│      ├── 确保数据迁移完成                                  │
│      ├── 检查集群健康状态                                  │
│      └── 监控性能影响                                      │
│                                                             │
│   4. 选择低峰期操作                                         │
│      ├── 减少对业务的影响                                  │
│      └── 有足够时间处理问题                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

四、数据均衡 #

4.1 自动均衡 #

text
自动均衡机制
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Range均衡:                                                │
│   ├── 监控Range分布                                        │
│   ├── 自动迁移Range                                        │
│   └── 目标: 各节点Range数量均衡                            │
│                                                             │
│   Leader均衡:                                               │
│   ├── 监控Leader分布                                       │
│   ├── 自动转移Leader                                       │
│   └── 目标: 各节点Leader数量均衡                           │
│                                                             │
│   存储均衡:                                                 │
│   ├── 监控存储使用                                         │
│   ├── 自动迁移数据                                         │
│   └── 目标: 各节点存储使用均衡                             │
│                                                             │
│   均衡触发条件:                                             │
│   ├── 节点添加                                             │
│   ├── 节点移除                                             │
│   ├── 存储不均衡                                           │
│   └── Range数量不均衡                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4.2 手动干预 #

sql
-- 手动转移Range
ALTER RANGE <range-id> RELOCATE TO [node1, node2, node3];

-- 手动转移Leader
ALTER RANGE <range-id> TRANSFER LEASE TO <node-id>;

-- 查看需要均衡的Range
SELECT 
    range_id,
    replicas,
    lease_holder
FROM crdb_internal.ranges
WHERE array_length(replicas, 1) != (
    SELECT AVG(array_length(replicas, 1))::int
    FROM crdb_internal.ranges
);

4.3 均衡配置 #

sql
-- 查看Zone配置
SHOW ZONE CONFIGURATION FOR RANGE default;

-- 调整均衡速度
-- (需要管理员权限)
SET CLUSTER SETTING kv.snapshot_rebalance.max_rate = '64MiB';

-- 调整副本迁移速度
SET CLUSTER SETTING kv.snapshot_rebalance.min_rate = '8MiB';

五、容量规划 #

5.1 容量计算 #

text
容量规划公式
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   存储容量:                                                 │
│   总存储 = 节点数 × 单节点存储 × (1 - 副本开销)             │
│                                                             │
│   示例:                                                     │
│   节点数: 5                                                 │
│   单节点存储: 2TB                                           │
│   副本数: 3                                                 │
│                                                             │
│   有效存储 = 5 × 2TB ÷ 3 = 3.33TB                          │
│                                                             │
│   性能容量:                                                 │
│   总QPS = 节点数 × 单节点QPS                                │
│                                                             │
│   示例:                                                     │
│   节点数: 5                                                 │
│   单节点QPS: 10,000                                         │
│                                                             │
│   总QPS = 5 × 10,000 = 50,000                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5.2 扩容建议 #

text
扩容建议
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   何时扩容:                                                 │
│   ├── 存储使用超过 70%                                     │
│   ├── CPU使用率持续超过 70%                                │
│   ├── 查询延迟持续增加                                     │
│   └── 需要更高可用性                                       │
│                                                             │
│   扩容数量:                                                 │
│   ├── 存储不足: 根据存储需求计算                           │
│   ├── 性能不足: 根据QPS需求计算                            │
│   └── 建议一次增加奇数个节点                               │
│                                                             │
│   扩容步骤:                                                 │
│   1. 准备新节点                                            │
│   2. 启动并加入集群                                        │
│   3. 监控数据均衡                                          │
│   4. 验证性能提升                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

六、故障处理 #

6.1 节点故障 #

sql
-- 检测节点故障
SELECT 
    node_id,
    is_live,
    updated_at
FROM crdb_internal.kv_node_status
WHERE is_live = false;

-- 处理故障节点
-- 1. 如果节点可恢复: 重启节点
-- 2. 如果节点不可恢复: 移除并替换

-- 移除故障节点
cockroach node decommission <node-id> --host=<any-node>:26257

6.2 数据恢复 #

sql
-- 检查副本不足的Range
SELECT 
    range_id,
    replicas,
    voting_replicas
FROM crdb_internal.ranges
WHERE array_length(replicas, 1) < 3;

-- 检查集群健康
SELECT 
    COUNT(*) AS total_ranges,
    COUNT(CASE WHEN array_length(replicas, 1) >= 3 THEN 1 END) AS healthy_ranges,
    COUNT(CASE WHEN array_length(replicas, 1) < 3 THEN 1 END) AS under_replicated
FROM crdb_internal.ranges;

七、总结 #

扩缩容要点:

操作 说明
添加节点 join参数加入集群
移除节点 drain + decommission
数据均衡 自动或手动
容量规划 存储和性能计算
故障处理 检测和恢复

下一步,让我们学习扩展生态!

最后更新:2026-03-27