提示:AI 结果必须带引用;若证据不足会提示“未找到可靠证据”。
云数据库代理网关技术架构(生产级多租户 v4)
版本:v4.0
日期:2026-02-15
适用仓库:/Users/Zhuanz/work-space/cloud-data-proxy
1. 目标与硬指标
1.1 业务目标
- 统一接入多个应用(首年 20 个应用)。
- 应用侧去除数据库直连配置(不再保存 DB host/user/password/db)。
- 应用间强隔离(身份、权限、资源、审计四层隔离)。
- 运维操作通过 Web 控制台完成(注册、开通、轮换、禁用、审计查询)。
1.2 生产硬指标(SLO)
- 可用性:
99.99%(月故障预算约 4 分 23 秒)。 - 吞吐:分阶段从
10万 QPS扩展到100万 QPS。 - 延迟预算(代理附加开销):
P99 <= 2ms,P99.9 <= 5ms(同地域同机房)。 - 隔离:任意跨应用访问必须失败并留痕(拒绝率 100%)。
2. 现状与差距(基于当前仓库)
| 维度 | 当前状态 | 与目标差距 |
|---|---|---|
| 租户隔离 | 已支持每应用独立 DB 用户/库(AUTO_PROVISION_DB=true) |
缺少租户级资源策略(并发/细粒度限额) |
| 管理面 | 有 /admin API + /console 页面 |
缺少生产级审批、批量运维、策略模板 |
| 元数据存储 | SQLite | 100k+ QPS/多实例下不适合作为中心状态 |
| 数据面协议 | HTTP SQL(`/v1/query | exec |
| 可观测 | 基础日志、metrics、审计 | 缺少 SLO 看板、高并发压测基线、自动扩缩容策略 |
| 高可用 | 单实例部署为主 | 未形成多实例无状态集群 + 跨可用区容灾 |
3. 总体架构(目标态)
flowchart LR
subgraph APP[应用层]
A[应用A]
B[应用B]
C[应用C]
D[应用D]
end
subgraph CP[控制面]
W[Web Console]
API[Admin API]
JOB[Provision/Rotate Job]
end
subgraph DP[数据面集群]
G1[Gateway Pod 1]
G2[Gateway Pod 2]
GN[Gateway Pod N]
RP[Redis: Token/Policy Cache]
end
subgraph STATE[状态与审计]
META[(Metadata DB)]
AUD[(Audit Store)]
MQ[(Kafka/NATS)]
end
subgraph DB[数据库层]
RW[(MySQL Primary)]
RO[(MySQL Read Replicas)]
end
APP -->|API Key / mTLS| DP
W --> API
API --> META
API --> JOB
JOB --> DB
DP --> RP
DP --> META
DP --> MQ
MQ --> AUD
DP --> RW
DP --> RO
flowchart LR
subgraph APP[应用层]
A[应用A]
B[应用B]
C[应用C]
D[应用D]
end
subgraph CP[控制面]
W[Web Console]
API[Admin API]
JOB[Provision/Rotate Job]
end
subgraph DP[数据面集群]
G1[Gateway Pod 1]
G2[Gateway Pod 2]
GN[Gateway Pod N]
RP[Redis: Token/Policy Cache]
end
subgraph STATE[状态与审计]
META[(Metadata DB)]
AUD[(Audit Store)]
MQ[(Kafka/NATS)]
end
subgraph DB[数据库层]
RW[(MySQL Primary)]
RO[(MySQL Read Replicas)]
end
APP -->|API Key / mTLS| DP
W --> API
API --> META
API --> JOB
JOB --> DB
DP --> RP
DP --> META
DP --> MQ
MQ --> AUD
DP --> RW
DP --> RO3.1 关键设计原则
- 控制面和数据面分离:配置变更与查询执行解耦。
- 数据面无状态:可水平扩展,实例可随时替换。
- 隔离以数据库权限为主、SQL 护栏为辅:避免仅靠正则拦截。
- 读写分离与连接池配额:防止单租户噪声放大。
- 审计异步化:避免审计写入拖慢业务路径。
4. 多租户隔离模型
4.1 身份隔离
- 每应用独立
api_key(支持轮换、失效、禁用)。 - 数据库侧每应用独立
db_user,仅授权自身db_name。 - 控制面管理员 token 与应用 token 严格分离。
4.2 权限隔离
- 应用用户只授予本库最小权限(按读写/DDL能力模板)。
- 禁止数据面回落使用 admin 账号执行 SQL。
- 支持按应用配置能力集(
read/write/ddl/tx)。
4.3 资源隔离
- 每应用独立 QPS 配额。
- 每应用独立并发上限(inflight)。
- 每应用连接池上限(避免占满 MySQL 连接)。
4.4 审计隔离
- 审计记录必须包含
tenant_id/app_id/request_id。 - 审计查询默认按租户过滤,跨租户查询仅管理员允许。
5. 数据库能力支持策略(“全功能”目标)
结论:若目标是“数据库全功能支持 + 高并发 + 多语言驱动兼容”,最终应演进到 MySQL 协议代理路径;仅 HTTP SQL 很难完全覆盖。
5.1 三阶段能力路线
- 阶段 A(当前增强):HTTP SQL 模式增强,覆盖 DQL/DML/DDL + 审计 + 限流。
- 阶段 B(过渡):引入事务会话 API(
begin/commit/rollback+ session token)。 - 阶段 C(目标):引入 MySQL 协议代理数据面(推荐 ProxySQL/Vitess 思路),实现驱动侧近似透明接入。
5.2 兼容性要求
- 必须支持预编译参数化查询。
- 必须支持事务与隔离级别配置。
- 必须支持大结果集受控传输(流式/分页)。
- 必须支持 DDL 变更审计与风险护栏。
6. 高并发与扩展设计(10万~100万 QPS)
6.1 容量分解(建议)
- 10万 QPS:网关 8~12 实例(按压测修正),单实例 8C16G 起步。
- 50万 QPS:网关 30+ 实例,读流量优先走只读副本。
- 100万 QPS:需网关集群 + 协议代理层 + 高命中缓存 + 数据分层策略。
6.2 关键技术点
- 认证与策略走内存/Redis 缓存,减少元数据库热点。
- 连接池分层:全局上限 + 租户上限 + 读写分池。
- 慢 SQL 与大事务保护:阈值告警 + 熔断。
- 热租户治理:自动限速、熔断、降级。
7. 99.99 可用性设计
7.1 单点消除
- 网关至少 2 实例 + 负载均衡健康检查。
- 元数据存储采用高可用主从/多副本。
- 审计与指标链路异步化,避免主路径硬依赖。
7.2 发布与回滚
- 蓝绿或金丝雀发布,按租户灰度。
- 每次发布必须有自动回滚开关。
- 变更窗口必须绑定 Runbook 与值班负责人。
8. 安全设计
- API Key 仅存 hash,不存明文。
- 应用 DB 密码必须加密存储(AES-GCM/KMS)。
- 管理会话防 CSRF、防重放。
- 敏感字段日志脱敏(token/password/sql 原文可配置关闭)。
- 支持 mTLS/IP allowlist(生产建议)。
9. 监控与告警
9.1 必备指标
- 网关:QPS、错误率、P95/P99/P99.9、inflight、429 比例。
- 租户:每 app 的 QPS、错误率、慢 SQL 数、拒绝数。
- MySQL:连接数、主从延迟、行锁等待、死锁、慢查询。
9.2 告警门槛(建议初版)
- 5 分钟错误率 > 1% 告警。
- 5 分钟 P99 > 目标上限 2 倍告警。
- 单租户拒绝率异常飙升告警。
- 审计写入堆积超过阈值告警。
10. 落地决策(ADR)
- ADR-001:隔离边界以数据库权限为主,不依赖 SQL 文本规则。
- ADR-002:控制面保留 HTTP;数据面长期演进到 MySQL 协议代理。
- ADR-003:元数据从 SQLite 迁移到高可用数据库(MySQL/PostgreSQL)。
- ADR-004:审计链路异步化,主路径仅写轻量事件。
11. 验收标准
- 隔离验收:20 应用互相越权访问 100% 拒绝。
- 性能验收:分阶段达到 10万/50万/100万 QPS 目标。
- 稳定性验收:连续压测 72 小时无 P0 故障。
- 可用性验收:上线后月度达到 99.99%。