扩缩容 #
一、扩缩容概述 #
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