百万美元工程问题

Achille Roussel,里克•布兰森2017年3月14日

对于早期的启动,使用云即使是这些天甚至是一个问题。没有RFP,供应订单或服务器的物理出货量。只是在几分钟内在“无限可扩展”计算电源上起床和运行的承诺。

但是,能够使用单一API呼叫提供数千美元的基础设施的能力附带非常大的隐藏成本.这是您在任何定价页面上都找不到的东西。

因为外包基础设施非常简单(RDS, Redshift, S3等),它很容易陷入一个循环中对任何问题的第一次回答是花更多的钱__。

如果你的初创公司正试图尽快行动,那么公司可能很快就会陷入困境新万博app2.0下载五,六,七位数的账单在每个月底。

在细分市场,我们发现自己在去年年底附近的类似情况。我们正在击中经典的启动缩放问题,我们的成本开始太快地增长。所以我们决定专注于减少主要贡献者:我们的AWS账单。

经过三个月的专注工作,我们设法将AWS账单减少每年一百万美元.下面是我们如何做到的故事。

现金统治我周围的一切

在深入讨论之前,有必要解释一下促使我们围绕基础设施成本建立纪律的商业原因。

大多数SaaS产品的成本倾向于在早期发现规模经济。如果你只是销售软件,发行基本上是免费的,你可以在初始开发后支持数百万用户。但基础设施即服务产品(如Segment)的成本往往会增长线性的采用。不是亚线性的。

作为一个具体示例:单个Salesforce服务器支持数千个或数百万用户,因为每个用户每秒生成少数请求。另一方面,单个段容器必须处理成千上万的人每秒钟的消息——所有这些消息都可能来自单个客户。

截至2016年第三季度末,我们销售成本(COGS)的三分之二来自AWS的账单。这是每月支出的图表,与5月份的支出相比较。

变焦和保证金

我们的基础设施成本高得令人无法接受,并开始影响我们创建可持续长期业务的努力。是时候改变了。

了解一下情况

如果减少成本的第一步是“承认你有问题”,第二步是“识别潜在的节省”。随着AWS,结果表明是一个令人惊讶的事情。

您如何确定每小时收费的环境的成本,并使用混合年度承诺,自动扩展实例和带宽成本?

有很多工具可以帮助优化你的基础设施支出,但让我们来解决这个问题:没有魔法子弹

在我们的情况下,这意味着逐行逐行挖掘并仔细审查每个单一资源。

要执行此操作,我们已启用AWS详细的结算.它将实例小时、已供应的数据库和所有其他资源的完整原始日志转储到S3中。然后,我们将数据导入到Redshift中Heroku的Awsbilling.进一步分析。

变焦和保证金

这是一个混乱的数据集,但一些深入的分析列出了前15个问题领域,总计占我们每月账单的40%左右。

一些问题是公平的行人:数百个大型EBS驱动器,过度配置的缓存和RDS实例。从增加的负荷事件留下的遗物,没有规模回来。

但有些问题需要明确的投资和专门的工程努力来解决。其中,有三点最让我们印象深刻:

  • DynamoDB热碎片(每年30万美元)

  • 服务自动缩放(每年60,000美元)

  • 装箱和合并实例类型(每年$240,000)

降低成本的长尾占剩下的400,000美元/年。虽然有一些课程消除这些作品,但我们将专注于前三名。

DynamoDB Hot Sharards.

该段对我的处理管道的各个部分进行了大量使用DynamoDB。Dynamo是亚马逊的托管版Cassandra - 它是一个NoSQL数据库,它充当了K / V和Document Store。它支持辅助索引来执行多个查询并有效扫描,并摘要底层分区和复制方案。

Dynamo定价模型的工作方式吞吐量。作为用户,您在给定表格上支付一定容量(在每秒读取和写入方面),Dynamo将扼杀越过您容量的任何读取或写入。在面值,感觉就像一个相当简单的模型:你付出的越多,你得到的吞吐量就越多。

然而,正确地提供所需的吞吐量有一些细微的差别,需要理解内部发生了什么。

根据官方文档,DynamoDB服务器基于一致的哈希方案划分分区:

变焦和保证金

在内部,这意味着对给定键的所有写操作都将转到相同的服务器和相同的分区。

现在,读和写的分布应该是均匀分布的,这是有道理的。您不希望在其他服务器处于空闲状态时,某个热分区或单个服务器不断因写操作而超载。

不幸的是,我们看到了一个限制了,即使我们在DynamoDB实例上提供了更大的容量。

要了解上游事件,我们的发电机设置看起来像这样:

变焦和保证金

我们有一堆未分区、随机分布的队列,可供多个消费者读取。然后将这些对象写入Dynamo。如果Dynamo变慢,它将导致整个队列备份。更重要的是,我们必须提高生产能力比所需的写吞吐量更大为了排出队列。

让我们感到困惑的是,我们的密钥是由最终被跟踪的用户划分的。以及每天在数亿用户中追踪按键应该均匀地分配写负荷。我们遵循AWS文档的确切建议:

变焦和保证金

那为什么迪纳摩还在被扼杀?似乎有两个答案。

第一个是:发电机的吞吐量定价实际上决定了分区数量而不是的总吞吐量。

这很容易被忽视,但是当提到分区时,Amazon DynamoDB文档声明如下:

这里的含义是你没有支付总吞吐量, 反而分区数.如果你碰巧有一些饱和相同的单独分区的键,你必须双能量将单个热分区分割到它们自己的分区,而不是线性地扩展容量。即使在这种情况下,单个分区的吞吐量也受到限制。

当我们与AWS团队交谈时,他们的内部监测结果与我们想象中的“均匀分布”不同。这解释了为什么我们看到的吞吐量远低于我们的预期:

变焦和保证金

这是他们提供的总分区的热图,以及每个分区的关键压力。y轴映射分区(我们在这个表上有647个分区)和x访问标记一小时内的时间。更频繁访问的“热”分区显示为红色,而未访问的分区显示为蓝色。

垂直,非蓝色,线条是好的 - 它们表明散装负荷发生了,并且均匀地遍布钥匙空间,最大化我们的吞吐量。但是,如果你俯视第19个分区,你可以看到一个薄的红色条纹:

变焦和保证金

哦哦。我们发现了我们的吸烟枪:一个慢分区。

很明显,我们需要做些什么。他们提供的热图是一个主键,但它的粒度是在分区级别,而不是键。不幸的是,没有现成的方法来识别热键(提示提示!)

所以我们梦想着一个简单的黑客,向我们提供我们需要的数据:每当我们被DynamoDB限制时,我们都会记录密钥.该表的供应容量被暂时减少,以诱导节流行为。然后将日志聚合在一起,提取顶级密钥。

调查结果?许多键是结果,我们所说的“创意”的段。

这是我们所看到的一个例子:

发现问题?

在每一天的一定时间,它出现了对我们的生产API进行了每日自动化测试,导致了数十万个事件的爆发单个userid.(字面上地user_id在这种情况下)。并且该用户ID可在静态或不正确插值。

虽然我们可以修复自己代码中的错误,但我们无法控制我们的客户。manbetx客户端应用下载

从检查没有价值的情况下也是清楚的正确处理这个数据,所以是一组被阻塞的键(“userid”,“用户_ID“,”#{用户_id}”和变异)是从节流日志构建的。在几天之后,我们慢慢减少了拨款的能力,阻止了任何新发现的严重表现钥匙。最终我们将容量减少4倍。

当然,修复单个分区和黑名单键只是战斗的一半。我们正在从NSQ转移到Kafka的过程中,Kafka将提供适当的分区上游的的发电机。上游的分区将Dynamo确保我们正在批量提供有效的写作,并在全球范围内融合了一小部分服务器的更改而不是传播写作。

服务自动缩放

关于我们的堆栈的一点背景知识:Segment很早就采用了微服务架构。我们是第一批使用ECS.(EC2容器服务)用于容器编排,以及起程拓殖用于管理所有AWS资源。

ECS管理我们所有的集装箱调度。它是一个托管AWS服务,它要求每个实例运行一个本地ecs -代理。您将作业提交给ECS API,它与运行在每个主机上的代理通信,以确定应该在哪个实例上运行哪个容器。

当我们第一次开始使用ECS时,它很容易自动缩放实例,但是没有方便的方法来自动缩放个体容器

推荐的方法是建造一条弗兰肯斯坦式的管道CloudWatch警报将触发更新ECS API的Lambda函数。但2016年5月,ECS团队推出了一流的自动缩放对于服务。

这种方法很简单。它有效地与自动化方法相同,但需要较少的移动部件。

第一步:为ECS服务设置CPU和内存阈值限制:

变焦和保证金

需要大约30秒钟,然后服务将自动缩放与它使用的资源数量的任务数量上下。

第二步:我们将我们的实例基于所需的ECS资源分配来扩展。这意味着如果群集不再有足够的CPU或内存来放置给定的任务,则会自动将新实例添加到自动缩放组(ASG)。

变焦和保证金

结果如何?

在实践中,这工作得非常好(通过我们的API容器建模):

变焦和保证金

我们的交通负荷与美国的高峰和低谷相当接近(美国东部时间上午9点大幅上升)。因为我们只有60%的流量峰值是在晚上和周末,所以我们可以通过添加自动缩放功能来节省大量的流量,而且不用担心突然的流量峰值。

额外的好处是可以在过度配置后自动缩小规模以处理过多的负载。我们不再需要以容量的2倍运行,因为容量是动态设置的。这就引出了最后一个改进:装箱。

箱包装和整合实例类型

我们长期考虑转换为更大的实例,然后用容器包装它们。但直到我们开始“项目本杰明”(我们的成本削减努力的内部名称),我们没有明确的计划到达那里。

有一个很多写关于在更大的虚拟上运行更好的性能主机。一般的观点是,如果物理机器上只有您一个人,那么您从吵闹的邻居那里得到的窃取就会更少。如果您以最大可能的实例大小运行,那么您将更有可能成为物理机器上唯一的VM。

还有一些额外的好处:较少的主机意味着每次主机监控和更快的图像卷展栏的成本较低。

此外,如果你正在使用相同实例类型(大或小)您可以使用保留实例获得更便宜的账单。预留实例截至每小时价格近40%,但需要年度提交。

因此,我们意识到,最符合我们利益的是开始整合我们正在运行的实例,并开始构建一个c4.8xlarges(我们的工作负载很大程度上是计算和I / O绑定)。但是要到达那里,我们需要一个必要的必要条件:将弹性负载平衡器(eLB)移开到新的应用负载均衡器(ALB)。

要了解搬到ALB的是什么给我们vs经典的插头,值得通过他们在引擎盖下的工作方式谈话。

根据我们的最佳估计,elb本质上是构建在一群运行HAProxy的小型、自动伸缩实例之上的。

变焦和保证金

使用ECS与ELBS时,每个容器都在服务定义指定的单个主机端口上运行。然后,elb连接到该端口并将流量转发到每个实例。

这有三个主要的后果:

  1. 如果您想在给定的主机上运行多个服务,则每个服务必须侦听一个唯一的端口所以他们不碰撞。

  2. 无法在单个主机上运行两个相同服务的容器因为他们会碰撞并尝试侦听同一端口。(没有垃圾箱)

  3. 如果你有n运行容器,你必须保持n + 1主机可用部署新容器(假设您希望在部署期间保持100%健康的容器)。

简而言之,使用eLB与ECS结合使用,要求我们过度配置实例,仅堆叠每隔几个服务。您好城市,人口:我们。

幸运的是,随着ALB的引入,港口碰撞问题得到解决。

变焦和保证金

ALB允许ECS为单个容器动态设置端口,然后将尽可能多的容器打包到给定的实例中。此外,ALB使用一个网格路由系统与单个主机,这意味着它不需要“预热”,可以自动伸缩,以满足流量需求。

在某些情况下,我们目前在每个实例中装载100-200个容器。这极大地提高了我们的利用率,减少了运行基础设施所需的实例数量(同时我们的api容量增加了4倍)。

变焦和保证金

利用随着时间的推移

Terraform默认情况下很简单

当然,很容易用这些重点的“一次性”努力削减成本。保持坚实边距的最难部分是系统地保持成本低至您的团队和产品规模.否则,我们就注定要在接下来的6个月里重复这一过程。

要做到这一点,我们必须简单的方法,正确的方式.每当工程师团队的成员想要添加一个新的服务时,我们必须确保它能得到我们所有的效率措施免费没有额外的样板或配置。

这就是起程拓殖进来。它是我们在分段中使用的配置语言,以便为我们的生产基础设施进行更改。

作为我们努力的一部分,我们创建了以下模块,为我们的团队成员提供了一组“默认情况下有效”的高级原语。它们不需要提供任何额外的配置,通过使用我们的模块,它们将自动获得以下内容:

  • 簇生它配置链接到ECS群集的自动级别组。

  • 服务设置暴露在ALB后面的ECS服务(应用程序负载平衡器)。

  • 工人设置从队列中使用作业但不公开远程API的ECS服务。

  • 自动伸缩作为在基础架构上运行的所有主机和容器的默认行为。

如果您对他们如何合适的话,您可以在Github上查看我们的开放式版本:段堆栈.它包含开箱即用的所有这些部分,并且很快将自动支持每次服务自动播放。

外卖

在杂草三个月后,我们设法达到了我们的目标。我们在AWS账单中消除了超过1亿美元的美元。并设法将平均利用率提高20%。

变焦和保证金

虽然我们希望在努力降低成本的努力中遇到的一些非常具体的问题背后的一些见解,但有一些更大的外卖器应该是有用的任何人希望提高基础设施的效率:

默认高效:重要的是,效率努力不仅仅是规则书或一次性策略。虽然成本管理确实需要持续警惕,但最重要的投资是防止在第一次出现问题。Easy-Mode应该有效。我们通过提供默认提供服务有效的Terraform中的环境和构建块来完成此操作。

然而,这超越了配置工具,还包括选择简化容量规划的基础设施。S3在这方面是出了名的出色:它不需要预先进行容量规划。当考虑SQL数据库时,团队可能会选择MySQL或PostgreSQL,考虑使用类似亚马逊的Aurora。Aurora以10GB的增量自动扩展磁盘容量,消除了提前规划容量的需要。在这个项目之后,效率成为了我们的默认值,并且现在是我们如何规划基础设施的一部分。

伸缩:在此努力期间,我们发现自动缩放对效率非常重要,但不仅仅是为了缩放需求的明显原因。在实践中,工程师将在他们必须重新评估其容量分配之前将其服务配置为您的服务。这意味着服务实际上正在分配远远超过每周峰值要求。该配置本身通常是不完善的,并且浪费了珍贵的工程时间调整这些设置。在这一点上,我们可以说普遍存在的自动缩放是微服务架构的实用要求。管理整体系统的能力相对容易,但有几十种服务,这成为噩梦。

肘部润滑脂:有一些工具可以帮助云效率努力,但在实践中,它需要工程团队的认真努力。不要落下供应商炒作。只有您了解您的系统,您的要求,您的财务目标,以及正确的权衡。工具可以使这个过程更容易,但它们没有魔法子弹。


对于任何日益增长的启动,成本管理是一项纪律必须随时间建造的。而且像安全,或政策,经常越早开始测量就越容易建立。

既然说了这么多,做了这么多,我们很高兴成本管理和衡量是我们早早开始锻炼的一块肌肉。随着我们不断扩大规模和增长,它应该会继续产生复合效应。

2021年的个性化状况

个性化的,1比1营销是当今数字第一家企业的表股。但随着消费者的期望上升,他们是否能够提供这些经验?

成为数据专家。

将所有关于数据、产品和增长的最新文章直接发送到你的收件箱。