StatsdccStatsd兼容高性能多线程网络守护程序用C ++编写。它聚集的统计和将结果发送给后端,尤其是石墨。我们很自豪地宣布,我们今天opensourcing它。退房的代码在https://github.com/wayfair/statsdcc

在Wayfair我们在大的信徒“措施什么,衡量一切,”作为“Statsd在Etsy的node.js重生公告上这么说。我们使用开源工具进行应用程序性能监视石墨,Grafana,ELK堆(弹性搜索/ Logstash / Kibana)还有一些自己开发的工具。直到最近,我们一直在使用Flickr/Etsy的2nd代,node.js-basedStatsd石墨。随着这些指标数量的增加,我们注意到数据中的不一致性,并意识到一些指标被删除了。长话短说,我们尝试了一些架构的改变和扩展Statsd但是随着操作复杂性的增加,我们开始怀疑为什么我们需要这么多盒子。我们发现了一个瓶颈Statsd缓冲和刷新数据,我们决定需要一个不同的版本。

选择:

已经有相当多的替代Statsd实现是可用的,但没有一个真正接近满足我们所有的需求。布鲁贝克我们觉得github很有趣,因为它承诺高吞吐量。不幸的是,它是在我们之前发布的Statsdcc已实现并准备将其投入生产。在那一点上,我们没有理由接受布鲁贝克并扩展它以支持我们需要的特性。但是,我们借用了集成webserver来查看应用程序运行状况的想法布鲁贝克Statsdcc布鲁贝克尝试解决类似的问题。我建议检查所有这些实现,并选择最适合您需要的实现。

博士TL;

如果您对我们在开始破解c++之前所做的尝试感兴趣,请继续阅读。

企图水平缩放与Statsd:

Statsd对传入指标执行聚合,并将聚合发送给流程,而流程又将接收到的指标保存到耳语数据库。

为了扩大规模,我们使用倍数Statsd/链。每个链连接到一个不同的磁盘。代理守护进程散列指标名称以确定使用哪个链。选择哪个代理守护进程取决于轮询DNS。一致的散列确保指标名称得到良好的平衡。

下图描绘了结构。

statsd_architecture

问题:

一年前,我们注意到一组特定的指标被删除,导致监视数据不一致。我们意识到这是由于UDP接收缓冲区的最大值Statsd。所以我们试着加入更多Statsd增加UDP缓冲区大小的进程。

然而,添加一个新流程是复杂的。当一个新的Statsd实例添加时,由反向代理进行的一致散列将把一些指标重新路由到新进程,从而导致不同进程上的文件重复相同度量的节点—一个用于旧数据,一个用于新数据。为了节省空间,和石墨显示所有数据,旧的耳语数据文件应该合并到新的文件中。

最后,我们对单个节点能够处理的流量感到不满意。我们发现问题出在设计上Statsd其中,相同的线程负责两个缓冲传入度量,并在每个刷新时间间隔执行对它们的聚合。当计算聚合,该线程停止监听传入的度量,其被存储在UDP缓冲器。作为指标的增加速率,UDP缓冲区溢出和下降的指标。我们使用单线程,事件循环在少数地方框架(一对夫妇的事情Node.js的基于守护程序,基于Python的gunicorn + GEVENT数),和我们之前已经看到这种类型的问题。该事件循环不帮你,当你有一个阻塞IO操作,可以带来处理停止。有时候,我们解决或解决的事件循环模式中这样的问题,有时候我们采取了完全不同的方法。

在找到实际的根本原因后,我们决定重写Statsd作为一个多线程应用程序,重点关注socket-IO和CPU周期的有效使用。

Statsdcc:

Statsdcc是替代实现Statsd用c++编写的高性能。在Statsdcc,一个或多个服务器线程积极侦听传入指标。服务器线程使用公式在多个工作人员之间分配传入的度量worker =哈希(指标名称)% #workers。工作线程从它们的专用队列中读取并更新它们的账簿,直到有一个时钟线程发出清除信号。在接收到这个信号后,工作线程将它们的账簿移交给短期刷新线程,并继续使用新的账簿,直到下一个信号。为了避免锁争用并更快地在服务器线程和工作线程之间传递指标,使用了boost的无锁队列。

statsdcc_thread

因为我们不想失去对横向扩展的能力,我们还没有摆脱了一致性哈希的。然而,解决了我们以前的架构结垢问题,其中加入了新的过程中需要清理的最后,我们将一致哈希从代理转移到聚合器。代理使用公式在多个聚合器之间分发传入指标聚合器=散列(指标名称)% #聚合器。然后,每个聚合器将度量聚合发送到各自的聚合进程使用一致的散列。与以前的体系结构不同的是进程打开了更多的TCP连接,每个聚合器有一个连接。但是,与Statsd,而不是在每次刷新时重新打开连接,Statsdcc重用已建立的TCP连接,从而避免TCP握手的开销。下图描述了当前的体系结构。

statsdcc_architecture

Statsdcc能处理比Etsy多10倍的负载(高达400,000个指标/秒)吗Statsd。只有一个实例Statsdcc与之前的12个不同,aggregator处理我们所有的生产流量Statsd实例。Statsdcc已投入生产约7个月。我们希望更多的人会发现Statsdcc和我们在Wayfair的一样有用。