← 返回首页
🛡️

冗余设计

📂 architecture ⏱ 1 min 192 words

冗余设计

冗余的基本原则

冗余设计的核心思想是消除单点故障(Single Point of Failure, SPOF)。任何可能成为系统瓶颈的组件都需要进行冗余部署。冗余不等于简单的数量增加,需要考虑故障检测、自动切换、数据一致性等问题。

// 无状态服务的冗余部署示例
@Component
public class OrderService {
    // 无状态设计:不保存会话状态
    // 所有状态存储在外部(Redis、数据库等)
    
    public Order createOrder(CreateOrderRequest request) {
        String sessionId = request.getSessionId();
        // 从外部存储获取会话状态
        Cart cart = redisTemplate.opsForHash()
            .entries("cart:" + sessionId);
        
        Order order = buildOrder(cart);
        // 写入数据库(支持多副本)
        orderRepository.save(order);
        return order;
    }
}

N+1 冗余策略

N+1 冗余是指在满足业务需求的 N 个实例基础上,额外增加 1 个备用实例。当某个实例故障时,备用实例接管其工作。

正常状态:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1  │ │ Node 2  │ │ Node 3  │  ← 3个节点处理请求
│ Active  │ │ Active  │ │ Active  │
└─────────┘ └─────────┘ └─────────┘
     ↑           ↑           ↑
     └───────────┴───────────┘
              请求分发

故障状态:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1  │ │ Node 2  │ │ Node 3  │
│ Active  │ │ Active  │ │  Failed │
└─────────┘ └─────────┘ └─────────┘
     ↑           ↑           
     └───────────┴───── 节点1、2接管所有请求

热备、温备、冷备

备份类型 实时同步 启动时间 数据延迟 适用场景
热备 秒级 接近零 核心交易系统
温备 半实时 分钟级 分钟级 重要业务系统
冷备 定期 小时级 小时级 非实时系统
# Kubernetes 有状态服务冗余配置
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: fast-ssd
        resources:
          requests:
            storage: 100Gi

冗余与一致性

冗余设计需要权衡可用性和一致性。根据 CAP 定理,分布式系统在网络分区时只能在一致性和可用性之间选择。实际应用中通常采用最终一致性模型,在保证高可用的前提下逐步同步数据。