可用性

高可用性是分布式 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
数据库查询:100ms

3. 熔断保护

原理:故障时快速失败。

实现

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 生成方案。

👉 下一章:UUID 方案