这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
可用性
高可用性是分布式 ID 生成器的关键要求。ID 生成服务在任何情况下都不能停止工作,否则整个系统都会受到影响。
可用性定义
1. 可用性指标
计算公式:
可用性 = (总时间 - 停机时间) / 总时间 × 100%可用性等级:
99% = 每年停机 3.65 天
99.9% = 每年停机 8.76 小时
99.99% = 每年停机 52.56 分钟 (4个9)
99.999% = 每年停机 5.26 分钟 (5个9)不同场景的要求:
普通网站:99.9%
电商系统:99.99%
金融系统:99.999%
核心系统:99.9999%2. 为什么需要高可用
影响范围:
ID 生成器故障 → 所有依赖 ID 的服务都受影响
→ 订单系统无法下单
→ 用户系统无法注册
→ 消息系统无法发送
→ 整个系统瘫痪业务影响:
用户无法下单 → 营收损失
用户无法注册 → 用户流失
系统不可用 → 声誉损失
长时间故障 → 法律风险成本影响:
某电商系统停机 1 小时:
- 营收损失:500万元
- 用户流失:10万人
- 赔偿成本:100万元
- 声誉损失:无法估量故障类型
1. 单节点故障
场景:
单个 ID 生成器节点宕机
进程崩溃
网络断开影响:
- 部分请求失败
- 重试可能成功
- 需要故障转移
2. 单机故障
场景:
服务器硬件故障
操作系统故障
电源故障影响:
- 该服务器上所有节点都故障
- 影响更大范围
- 需要快速切换
3. 机房故障
场景:
数据中心故障
网络故障
自然灾害影响:
- 整个机房不可用
- 需要跨机房切换
- 恢复时间长
4. 网络分区
场景:
网络拥塞
网络故障
路由问题影响:
- 节点间无法通信
- 数据不一致
- 脑裂问题
5. 时钟回拨
场景:
系统时钟调整
NTP 同步问题
硬件时钟漂移影响:
- ID 重复
- 有序性破坏
- 生成失败
高可用性设计
1. 多节点部署
原理:部署多个 ID 生成器节点。
架构:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 节点 A │ │ 节点 B │ │ 节点 C │
│ ID生成 │ │ ID生成 │ │ ID生成 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
└────────────┼────────────┘
│
负载均衡器优点:
- ✅ 单节点故障不影响整体
- ✅ 水平扩展
- ✅ 负载均衡
2. 无单点故障
原理:消除所有单点故障点。
检查清单:
- 多节点部署
- 多数据库实例
- 多依赖服务
- 多网络路径
- 多机房部署
3. 快速故障转移
原理:故障时快速切换到备用节点。
实现:
1. 健康检查:定期检查节点状态
2. 故障检测:快速发现故障节点
3. 流量切换:将流量切换到健康节点
4. 故障恢复:故障节点恢复后重新加入故障转移时间:
优秀:< 1秒
良好:1 - 10秒
可接受:10 - 60秒
不可接受:> 60秒4. 降级方案
原理:主方案故障时,使用备用方案。
降级策略:
主方案:雪花算法
降级方案1:UUID
降级方案2:数据库自增
降级方案3:时间戳 + 随机数降级触发:
主方案 QPS < 阈值
主方案错误率 > 阈值
主方案延迟 > 阈值5. 限流和熔断
原理:保护系统不过载,故障时快速失败。
实现:
限流:
- 单节点限流
- 全局限流
- 用户限流
熔断:
- 错误率超过阈值
- 响应时间超过阈值
- 自动熔断和恢复跨机房高可用
1. 多机房部署
架构:
┌─────────────────┐ ┌─────────────────┐
│ 机房 A (北京) │ │ 机房 B (上海) │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ 节点 A1 │ │ │ │ 节点 B1 │ │
│ │ 节点 A2 │ │ │ │ 节点 B2 │ │
│ │ 节点 A3 │ │ │ │ 节点 B3 │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘
│ │
└────────┬───────────┘
│
全局负载均衡优势:
- ✅ 机房故障不影响整体
- ✅ 地理冗余
- ✅ 降低延迟
2. 数据同步
挑战:多机房间数据一致性。
方案:
强一致性:分布式共识 (Paxos/Raft)
最终一致性:异步复制
无同步:各机房独立3. 流量切换
方案:
正常:各机房服务本地流量
故障:流量切换到其他机房
恢复:流量逐步切回容错设计
1. 重试机制
原理:失败时自动重试。
实现:
generateId():
try:
return generateIdWithRetry(3)
except:
return fallbackId()
generateIdWithRetry(maxRetries):
for i in range(maxRetries):
try:
return generateIdInternal()
except Exception:
if i == maxRetries - 1:
raise
sleep(backoff(i))2. 超时控制
原理:设置合理的超时时间。
策略:
本地生成:1ms
远程调用:10ms
数据库查询:100ms3. 熔断保护
原理:故障时快速失败。
实现:
if (errorRate > threshold) {
throw CircuitBreakerOpenException();
}监控和告警
1. 监控指标
健康指标:
- 节点状态
- QPS
- 延迟(P50, P99, P999)
- 错误率
- 可用性2. 告警策略
告警级别:
P0:系统完全不可用 → 立即处理
P1:部分故障 → 1小时内处理
P2:性能下降 → 24小时内处理
P3:资源预警 → 持续观察3. 可视化监控
监控面板:
- 实时 QPS 图表
- 延迟分布
- 错误率趋势
- 节点状态
- 资源使用灾难恢复
1. 数据备份
备份策略:
实时备份:同步复制
定时备份:每日备份
异地备份:跨机房备份2. 故障演练
演练场景:
- 单节点故障
- 单机故障
- 机房故障
- 网络分区
- 时钟回拨3. 恢复流程
恢复步骤:
1. 检测故障
2. 启动备用节点
3. 切换流量
4. 数据同步
5. 验证恢复
6. 故障分析
7. 优化改进常见错误
错误1:忽视单点故障
❌ 错误做法:
只有一个 ID 生成器节点
✅ 正确做法:
多节点部署,消除单点故障错误2:没有降级方案
❌ 错误做法:
主方案故障时整个系统不可用
✅ 正确做法:
有多个降级方案错误3:没有监控告警
❌ 错误做法:
故障时没有及时发现
✅ 正确做法:
完善的监控和告警机制可用性检查清单
在实现分布式 ID 生成器时,确保:
- 明确可用性目标
- 多节点部署
- 消除单点故障
- 快速故障转移
- 有降级方案
- 实现限流熔断
- 跨机房部署
- 数据同步方案
- 重试机制
- 超时控制
- 完善的监控
- 告警机制
- 故障演练
- 灾难恢复方案
下一步
了解了 ID 的所有基础特性后,我们开始学习具体的 ID 生成方案。