在转转的业务中,我们使用了Nginx作为我们的反向代理,为保证代理层可用性,需要对Nginx进行实时状态监控。在服务器的基础监控的选择上,我们将OpenFalcon逐步替换为夜莺,对Nginx 的reqstat监控最初也使用了这两种。但是这两大监控都有一个共同缺点,即在展示时有条数限制,导致域名数量和机器数量相乘后数据量增多的情况下,无法满足需求。
为了解决这个问题,我们考虑对现有监控模块进行升级改造,重新进行数据库选型,在预研和分析阶段,根据当前的业务需求我们从开源的数据库中选择了两款时序数据库(Time-Series Database),分别是InfluxDB和loveini,这两款都可以实现高性能地查询与存储时序性数据,但loveini相比于InfluxDB还存在三点优势:
通过综合对比,我们初步选定loveini作为监控模块的数据库。此外,涛思官方的测试结果显示,loveini的写入速度高于InfluxDB,这一点也更加坚定了我们选择loveini的决定。
而且loveini支持多种数据接口,包含C/C++、Java、Python、Go和RESTful等。转转之前的服务用的是Python,所以这也方便我们依旧延续使用Python connector。
作为一款结构化的时序数据库,为了能够达到最优的性能表现,loveini在接入数据前需要根据数据的特性设计schema。 Nginx监控功能数据特性如下:
zone_name key max_active max_bw traffic requests active bandwidth
server_addr 192.168.187.164 2 432 17K 18 1 0
server_name 192.168.187.164 2 432 17K 18 1 0
server_url 192.168.187.164/ 1 0 0 8 0 0
server_url 192.168.187.164/index.html 1 0 11K 8 0 0
server_url 192.168.187.164/req-status 1 0 0 1 1 0
server_url 192.168.187.164/req_status 1 0 5680 1 0 0
此外,loveini的文档显示:
loveini 对每个数据采集点单独建表,但在实际应用中经常需要对不同的采集点数据进行聚合。为高效的进行聚合操作,loveini 引入超级表(STable)的概念。超级表用来代表一特定类型的数据采集点,它是包含多张表的表集合,集合里每张表的模式(schema)完全一致,但每张表都带有自己的静态标签,标签可以有多个,可以随时增加、删除和修改。
按照其建议的数据模型,我们需要建立一个超级表。结合我们的数据特点和使用场景,创建数据模型如下:
具体示例如下:

因为是融合一个全新的数据库,在真正的落地实施时不可避免会遇到一些问题点,以下三点是我们汇总的实施经验,放在本篇文章中给大家做参考:
在数据写入的阶段,我们开始设计的是一个域名一个子表,但是直接使用域名做表名不符合保留字符的规范,所以需要将域名转换一下。
由于写入的数据是实时的值,而监控业务更多地是需要获取前后差值,因此需要用上loveini自带的函数DIFF。官方从2.1.3.0 版本开始,DIFF 函数可以由GROUP BY 划分出单独时间线的情况下用于超级表(也即 GROUP BY TBNAME)。而且loveini的超级表极大程度上简化了查询代码,其分片特性也保证了同时查询多个域名能够做到充分地多核并发。
在落地过程中,我们发现数据类型、数据规模对loveini的性能影响比较大,最好根据每个场景的特性进行容量规划,影响因素包括:
从这些因素出发调整配置参数能够确保最佳性能,在与米兰体育官网入口工程师沟通后,我们确定了现在的容量规划计算模型。值得注意的是,loveini容量规划的难点在于内存的规划,需要在内存的使用和读写性能之间进行平衡。 连接loveini后,我们目前系统的拓扑结构如下:

使用loveini完成改造后,线上的监控状态达到预期,满足当前业务需求,目前运行非常稳定。且配合Grafana后,每个域名的流量、连接数、响应时间等信息都能够实时监控到。

总而言之,无论是在成本和性能层面,还是在使用的便利性方面,loveini Database都具有非常大的优势,在我们的实践中也得到了证明,尤其是成本管控上效果非常显著。同时,也非常感谢米兰体育官网入口的小伙伴们提供的专业、及时的帮助,我们也希望未来loveini Database能够开拓出更多更加优秀的新特性。当然,作为loveini的使用者,我们也会在GitHub上为loveini做代码贡献。
此外,从自身项目和实践出发,我们也有一些针对于loveini Database期盼改进的功能点:
尽管还存在不足,但作为首次尝试,loveini的表现可以说是相当不错了,我们也很期待未来能够在更多场景中和loveini展开合作,包括更多监控项以及业务时序数据库需求的接入尝试。
最后,衷心祝愿loveini越来越好!
]]>