跳转至

第八章:生产实践

部署架构

生产环境架构

┌─────────────────────────────────────────────────────────────┐
│                    生产环境架构                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  应用层                                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  App Server 1    App Server 2    App Server 3       │   │
│  │  Sharding-JDBC   Sharding-JDBC   Sharding-JDBC      │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  数据库层                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                      │   │
│  │  DB0 (Master)     DB1 (Master)     DB2 (Master)     │   │
│  │  ├── Slave 1      ├── Slave 1      ├── Slave 1      │   │
│  │  └── Slave 2      └── Slave 2      └── Slave 2      │   │
│  │                                                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

部署要求

硬件要求:
- 应用服务器:8 核 CPU,16GB 内存
- 数据库服务器:16 核 CPU,64GB 内存,SSD 磁盘

网络要求:
- 应用与数据库间延迟 < 1ms
- 带宽 > 1Gbps

分片设计

分片键选择

分片键选择原则:
1. 数据均匀分布
2. 查询频率高
3. 业务逻辑相关
4. 避免跨分片查询

常见分片键:
- 用户表:user_id
- 订单表:user_id, order_id
- 日志表:create_time

分片数量

分片数量计算:
- 单表数据量 < 1000 万
- 单分片 QPS < 10000
- 预留扩展空间

示例:
总数据量:1 亿
单表数据量:1000 万
分片数量:100

分片策略

# 分片策略选择
sharding-algorithms:
  # 用户表:按用户 ID 取模
  user_mod:
    type: MOD
    props:
      sharding-count: 10

  # 订单表:按用户 ID 哈希取模
  order_hash_mod:
    type: HASH_MOD
    props:
      sharding-count: 100

  # 日志表:按时间分片
  log_interval:
    type: AUTO_INTERVAL
    props:
      datetime-lower: 2023-01-01 00:00:00
      sharding-seconds: 86400

性能优化

SQL 优化

-- 推荐:带分片键查询
SELECT * FROM t_order WHERE user_id = 1 AND order_id = 100;

-- 不推荐:不带分片键查询(全分片扫描)
SELECT * FROM t_order WHERE amount > 100;

索引优化

-- 分片表索引
CREATE INDEX idx_user_id ON t_order_0 (user_id);
CREATE INDEX idx_user_id ON t_order_1 (user_id);

-- 联合索引
CREATE INDEX idx_user_order ON t_order_0 (user_id, order_id);

连接池优化

spring:
  shardingsphere:
    datasource:
      ds0:
        hikari:
          maximum-pool-size: 50
          minimum-idle: 10
          idle-timeout: 600000
          max-lifetime: 1800000
          connection-timeout: 30000

安全加固

访问控制

spring:
  shardingsphere:
    datasource:
      ds0:
        username: app_user
        password: ${DB_PASSWORD}

SQL 审计

spring:
  shardingsphere:
    props:
      sql-show: true
      sql-simple: false
      check-table-metadata-enabled: true

敏感数据加密

spring:
  shardingsphere:
    rules:
      encrypt:
        tables:
          t_user:
            columns:
              password:
                cipher-column: password
                encrypt-algorithm-name: aes
        encrypt-algorithms:
          aes:
            type: AES
            props:
              aes-key-value: 123456

监控告警

监控体系

监控层级:
1. 应用监控
   - JVM 内存
   - GC 频率
   - 线程数

2. ShardingSphere 监控
   - SQL 执行次数
   - SQL 执行时间
   - 分片路由

3. 数据库监控
   - 连接数
   - 查询性能
   - 慢查询

告警规则

groups:
- name: shardingsphere-critical
  rules:
  - alert: ShardingSphereDown
    expr: up{job="shardingsphere"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "ShardingSphere 服务不可用"

故障处理

常见问题

1. 分片路由慢

# 检查分片配置
# 优化分片算法
# 增加缓存

2. 连接池耗尽

# 增加连接池大小
# 检查连接泄漏
# 优化 SQL

3. 数据倾斜

# 检查分片键分布
# 调整分片算法
# 重新分片

最佳实践

1. 分片设计

分片设计原则:
- 选择合适的分片键
- 合理的分片数量
- 预留扩展空间
- 避免跨分片查询

2. SQL 编写

SQL 编写原则:
- 带分片键查询
- 避免全分片扫描
- 使用绑定表
- 合理使用广播表

3. 事务管理

事务管理原则:
- 最小事务范围
- 选择合适的事务类型
- 异常处理
- 幂等设计

4. 运维管理

运维管理原则:
- 监控告警
- 日志收集
- 定期备份
- 故障演练

小结

生产实践要点:

  • 部署架构:生产环境架构、部署要求
  • 分片设计:分片键选择、分片数量、分片策略
  • 性能优化:SQL 优化、索引优化、连接池优化
  • 安全加固:访问控制、SQL 审计、敏感数据加密
  • 监控告警:监控体系、告警规则
  • 故障处理:常见问题
  • 最佳实践:分片设计、SQL 编写、事务管理、运维管理

完成本教程后,你应该能够在生产环境中部署和管理 ShardingSphere 分库分表系统。