在AWS上构建有状态服务的混合多租户架构

概述

在构建大规模、有状态的SaaS(例如广告服务平台)时,核心的SRE挑战在于如何在保证租户隔离(避免“嘈杂邻居”问题)和实现高效运营(降低成本、加快上线)之间取得平衡。传统的完全隔离(每个租户独立AWS账户)虽然安全,但会导致极高的运营复杂度、资源浪费和缓慢的客户引入流程。本文介绍的混合多租户架构在AWS上提供了一种解决方案:通过共享账户但保持集群级隔离,在提升资源效率的同时,维护了必要的安全与可靠性边界。

核心概念

  • Cellular Architecture(蜂窝式架构):早期采用的模型,为每个租户分配独立的AWS账户、VPC和负载均衡器。其优点是隔离性强,但带来了巨大的运维开销和扩展限制。
  • Noisy Neighbor(嘈杂邻居)问题:在共享基础设施上,一个租户的资源消耗(如内存)过高,会影响其他租户的性能。对于有状态服务(数据加载在内存中),此问题尤为突出。
  • 有状态服务:在本案例中,广告服务器会为每个租户在内存中维护数据,以提升性能。这使得传统的共享计算资源模式变得困难。
  • 三层级层次结构:为解决AWS服务限制(如ALB目标组数量、账户ENI限制)而设计的可扩展架构。
    1. Tier(层级):最顶层的逻辑分组,代表一类共享基础设施足迹的租户。所有下游连接(如PrivateLink)在Tier层面预配置。
    2. Cell(单元):一个AWS账户边界,是账户级别的水平扩展单元。
    3. Infra Group(基础设施组):Cell内的自包含基础设施单元,包含一个VPC、一个ALB、一组ECS集群(每个租户一个)、IAM角色和监控栈。

实践

实施步骤概览

该架构的核心在于将基础设施依赖项的预配置与租户上线流程解耦。新的租户上线主要是一个配置操作,而非基础设施部署项目。

  1. 配置 Route 53 加权路由:为每个Tier创建一个区域性的DNS端点(如 tier-1.us-east-1.example.com),使用加权路由策略将流量分配到多个Cell或Infra Group中的ALB。此步骤实现了流量的透明分发和水平扩展。
  2. 部署带有租户特定监听规则的 ALB:每个Infra Group包含一个ALB。通过监听规则,根据请求中的租户标识符(如路径 /tenant-a/* 或HTTP头部)将流量路由到对应的租户ECS集群。
  3. 为每个租户创建独立的 ECS 集群:在Infra Group的VPC内,为每个租户创建一个专用的ECS集群(命名规范例如:tier-1-cell-1-ig-1-tenant-a)。在任务定义中,将租户ID作为环境变量传递,以便应用加载正确的数据。
  4. 建立到共享依赖项的 AWS PrivateLink 连接:这是在Tier创建时完成的关键步骤。在Infra Group的VPC中创建到下游服务的VPC接口端点。新租户加入该Tier后,自动继承这些预配置的连接,无需单独设置。
  5. 配置租户隔离、扩展与可观测性:
    • 隔离:通过ALB路由、专用ECS集群和内存数据隔离三层保障。
    • 扩展:垂直扩展(增加单个ECS任务资源)或水平扩展(增加Infra Group或Cell)。通过Route 53加权路由透明地管理扩展。
    • 可观测性:从每个ECS服务中发出带有 tenant_id 维度的CloudWatch指标(如内存使用率、延迟、错误率)。使用结构化日志和CloudWatch Logs Insights进行跨租户分析。

架构扩展策略

当需要扩展时,可以依据不同的AWS限制使用相应的扩展杠杆:

触发条件操作添加的单元
ALB目标组限制(约50租户/Infra Group)在同一Cell内添加新的Infra GroupInfra Group(VPC + ALB + ECS集群)
AWS账户级限制(ENI, VPC端点)添加新的CellCell(新的AWS账户)

SRE 要点

与可靠性、可观测性、事件响应的关联

  • 可靠性:架构通过集群级隔离防止了“嘈杂邻居”导致的级联故障。Tier级别的健康检查(Route 53、ALB)确保了服务在部分单元故障时的可用性。扩展时使用加权路由进行渐进式迁移,降低了变更风险。
  • 可观测性:设计强制要求了以租户为中心的监控。关键SLI如每个租户的内存使用率(预示有状态数据增长)、延迟(TargetResponseTime)和错误率(HTTPCode_Target_5XX_Count)都必须被单独监控和告警。这为计算Error Budget和容量规划提供了基础。
  • 事件响应:清晰的命名规范(tier-cell-ig-tenant)和租户维度的指标/日志,使得在发生性能问题或故障时,SRE能够快速定位受影响的租户和具体基础设施组件,极大缩短了MTTI(平均调查时间)。

最佳实践与常见反模式

  • 最佳实践:
    • 解耦依赖配置与租户上线:这是提升效率的核心,将上线时间从数周缩短至数天。
    • 使用加权路由实现无停机迁移:在移动租户或扩展基础设施时,避免客户端变更。
    • 为有状态工作负载保持集群级隔离:即使在共享账户内,也确保内存和计算资源的隔离。
    • 实施租户维度的可观测性:所有日志和指标都应携带租户标识符。
  • 常见反模式:
    • 为每个租户创建独立AWS账户:导致极高的运营负担和资源浪费,适用于对隔离有极端金融或合规要求的场景。
    • 在共享集群中混合运行有状态租户:会导致严重的性能干扰和资源竞争,难以预测和保障SLO。
    • 将下游连接配置与每个租户绑定:会线性增加上线复杂度和时间。

相关指标(SLI/SLO/SLA)

  • SLI(服务级别指标):
    • 每个租户的服务延迟(例如 P99 延迟 < 200ms)。
    • 每个租户的服务可用性(例如,非5xx错误响应比例 > 99.9%)。
    • 每个租户的内存使用率(作为容量和性能的前瞻性指标)。
  • SLO(服务级别目标):基于上述SLI为不同Tier的租户制定具体的性能目标。例如,为“高TPS”Tier的租户设定更严格的延迟SLO。
  • 关联:这些SLI/SLO直接关联到架构的多个层面:ALB路由准确性、ECS集群性能、PrivateLink连接稳定性以及底层EC2实例的健康状况。监控数据用于验证架构是否满足业务承诺。

相关页面:multi-tenant-slos, cloudwatch-monitoring, capacity-planning