跳转至

扩展策略

KanjiIQ的设计支持从当前的单节点部署扩展到多节点、多区域架构,以应对流量增长。

当前状态

指标
集群节点数 1(Hetzner专用服务器)
应用副本数 2
数据库 单PostgreSQL实例
流量处理 每IP约100请求/分钟(速率限制)

这足以从容应对当前流量。以下各节概述了需求增长时的扩展路径。

水平Pod自动扩缩容 (HPA)

第一步扩展是添加HPA,根据负载自动调整副本数量:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: jlpt-kanji-hpa
  namespace: jlpt-kanji
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: jlpt-kanji
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

前提条件:需要安装Metrics Server(k3s默认包含)。

效果:应用根据CPU/内存压力在2-10个副本之间自动扩缩容,无需代码更改。

多节点集群

当单节点达到资源上限时,向k3s集群添加工作节点:

# On the new worker node
curl -sfL https://get.k3s.io | K3S_URL=https://master:6443 \
  K3S_TOKEN=<node-token> sh -

Kubernetes自动将Pod调度到所有可用节点上。应用无需任何更改——它已经是无状态的。

节点亲和性(可选)

控制Pod放置:

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchLabels:
                app: jlpt-kanji
            topologyKey: kubernetes.io/hostname

这将副本分散到不同节点上,提高容错能力。

数据库扩展

连接池

添加PgBouncer作为Sidecar容器来池化数据库连接:

containers:
  - name: pgbouncer
    image: edoburu/pgbouncer
    ports:
      - containerPort: 6432
    env:
      - name: DATABASE_URL
        valueFrom:
          secretKeyRef:
            name: jlpt-kanji-secrets
            key: database-url

后端连接到PgBouncer的:6432端口而非直接连接PostgreSQL,减少连接开销。

只读副本

对于读密集型工作负载(闪卡查询),添加PostgreSQL流复制:

  1. 主实例处理写操作(学习会话、测验结果)
  2. 只读副本处理读操作(汉字/词汇查询)
  3. 后端根据操作类型路由查询

托管数据库

最简单的数据库扩展路径是迁移到托管服务:

  • AWS RDS:多可用区、自动备份、只读副本
  • GCP Cloud SQL:高可用配置、自动故障转移
  • Hetzner托管PostgreSQL:推出后可用

详见可移植性了解迁移详情。

CDN层

静态前端资源可通过CDN提供全球性能优化:

graph LR
    U[User] --> CF[Cloudflare CDN]
    CF -->|Cache HIT| U
    CF -->|Cache MISS| N[Nginx Frontend]
    N --> CF

由于Flutter Web前端生成静态文件(JS、CSS、图片),这些是理想的CDN候选资源:

  • 缓存策略:哈希资源缓存1年,index.html不缓存
  • 全球PoP:从最近的边缘节点提供内容
  • DDoS防护:CDN吸收流量型攻击

Cloudflare DNS已就位——启用代理模式即可激活CDN层。

扩展路线图

流量级别 基础设施 关键更改
当前(低) 1节点,2副本,单PG 无需更改
增长期(中等) 1节点,HPA(2-10副本) 添加HPA清单
高流量 2-3节点,HPA,PgBouncer 添加工作节点 + 连接池
超高流量 多节点,托管数据库,CDN 迁移数据库到RDS/Cloud SQL,启用CDN
全球化 多区域集群,只读副本 重大架构演进

每一步都是渐进式的——无需重写。应用代码在所有扩展级别上保持不变。