采访 Hostinger
2019年2月6日作者 Brian Brazil
在我们对 Prometheus 用户的系列采访中,来自 Hostinger 的 Donatas Abraitis 分享了他们的监控之路。
你能介绍一下你自己以及 Hostinger 的业务吗?
我是 Donatas Abraitis,是 Hostinger 的一名系统工程师。顾名思义,Hostinger 是一家主机托管公司。自2004年以来,我们拥有约3000万客户,其中包括免费网络托管服务提供商 000webhost.com 项目。
在使用 Prometheus 之前,您的监控体验是怎样的?
当 Hostinger 还是一家小公司时,市面上开源的监控工具只有 Nagios、Cacti 和 Ganglia。这就好比给年轻人解释什么是软盘一样,但 Nagios 和 Cacti 至今仍在更新。
即便当时不存在自动化工具,Bash + Perl 也足以应付。如果你想要扩展你的团队或自我提升,绝不能忽视自动化。没有自动化,就意味着更多的人工手动工作。
那时我们大约有150台物理服务器。相比之下,直到今天,我们拥有约2000台服务器,包括虚拟机和物理服务器。
对于网络设备,SNMP 仍然被广泛使用。但随着“白盒”交换机的兴起,SNMP 的必要性降低了,因为我们可以在上面安装常规工具。
与其使用 SNMP,不如在交换机内运行 node_exporter 或任何其他 exporter,以人类可读的格式导出你需要的任何指标。赏心悦目总比杂乱无章好,不是吗?
我们使用的是 CumulusOS,在我们的案例中,它主要是 x86 架构的,因此运行各种 Linux 相关程序完全没有问题。
你们为什么决定研究 Prometheus?
2015年,当我们开始对所有可自动化的内容进行自动化改造时,我们将 Prometheus 引入了生态系统。起初,我们只有一个监控节点,上面运行着 Alertmanager、Pushgateway、Grafana、Graylog 和 rsyslogd。
我们也评估过 TICK (Telegraf/InfluxDB/Chronograf/Kapacitor) 技术栈,但当时对其有限的功能并不满意。相比之下,Prometheus 在许多方面显得更简单、更成熟。
你们是如何过渡的?
在从旧监控技术栈(NCG - Nagios/Cacti/Ganglia)过渡的期间,我们同时使用了两套系统,最终我们完全依赖了 Prometheus。
在我们的机群中,大约有25个社区指标导出器(exporters),还有一些是我们自研的,例如 lxc_exporter。我们主要通过 textfile collector 导出与业务相关的自定义指标。
切换后你们看到了哪些改进?
新的架构将我们的时间分辨率从5分钟提高到了15秒,这使我们能够进行细粒度且深入的分析。平均检测时间(MTTD)甚至缩短了4倍。
你认为 Hostinger 和 Prometheus 的未来会怎样?
由于自2015年以来我们的基础设施增长了 N 倍,Prometheus 和 Alertmanager 成为了主要的瓶颈。我们的 Prometheus 占用了大约 2TB 的磁盘空间。因此,如果我们重启或维护节点,监控数据会有短暂丢失。目前我们运行的是 Prometheus 2.4.2 版本,但计划在近期升级到 2.6。我们特别关注 性能 和 WAL(预写日志)相关的功能。Prometheus 重启大约需要 10-15 分钟,这是不可接受的。另一个问题是,如果某个地理位置宕机,我们也会丢失监控数据。因此我们决定实现高可用的监控架构:在不同大洲分别部署两个 Prometheus 节点和两个 Alertmanager 节点。
我们的主要可视化工具是 Grafana。至关重要的是,如果主 Prometheus 节点宕机,Grafana 能够查询备用节点。这很简单——在前端放一个 HAProxy 并本地接收连接即可。
另一个问题是:我们该如何防止用户(开发人员和其他内部人员)滥用仪表盘从而导致 Prometheus 节点过载。
或者当主节点宕机时,备用节点出现 惊群效应(Thundering herd problem) 。
为了达到理想状态,我们尝试了 Trickster 。这极大地加快了仪表盘的加载速度。它会缓存时间序列。在我们的案例中,缓存存储在内存中,但也有其他存储选择。即使主节点宕机且你刷新仪表盘,Trickster 也不会因为内存中已有缓存而查询第二个节点。Trickster 位于 Grafana 和 Prometheus 之间,它直接与 Prometheus API 进行通信。

Prometheus 节点是独立的,而 Alertmanager 节点组成了一个集群。如果两个 Alertmanager 同时收到相同的告警,它们会进行去重,只发出一次告警,而不是多次触发。
我们计划运行大量的 blackbox_exporters 并监控每一个 Hostinger 客户的网站,因为无法被监控的内容就无法被评估。
我们期待在未来实施更多的 Prometheus 节点,并在多个 Prometheus 实例之间进行分片。这将使我们在某个区域的实例宕机时,也不会遇到性能瓶颈。