解决方案:精选文章 | TDengine在得物的落地应用
优采云 发布时间: 2022-11-25 21:31解决方案:精选文章 | TDengine在得物的落地应用
TD引擎
有东西了
落地应用
背景
作为一家互联网电商公司,德物有很多系统和场景需要做流量监控和保护,所以我们增加了很*敏*感*词*来深度定制开源流控保护组件Sentinel(),帮助提升各种业务系统的流控保护。
在开发过程中,我们发现 Sentinel 的开源版本不支持流控数据持久化,我们非常需要这个功能:我们需要一个能够承载大量流量监控数据、高效存储和查询数据的数据库。
目前,在生产环境中,我们有数百个业务系统和数千台服务器连接到Sentinel,产生的流量控制数据无疑非常大。那么对于这个需求,选择合适的数据库无疑是极其重要的,一个好的选择可以达到事半功倍的效果。
数据库选择
首先,我们粗略估算一下当前数据量的理论上限:
目前生产环境有上千个哨兵资源,而哨兵的监控数据时间粒度是按秒计算的,那么一天理论上可以生成上亿条数据,理论上写入数据的速度也会达到10000TPS,而且业务还在快速发展,可以预见数据量会进一步爆发, 很明显,这种数据量级是传统关系数据库无法使用的。
因为一些内部应用使用 TiDB,我先看了使用 TiDB 的可行性,但很快就放弃了,毕竟作为一个分布式数据库,它根本不是针对监控数据的,这是一个时序特性非常强的场景。
排除后,我们将研究重点放在时间序列数据库上。
主流时间序列数据库各有优缺点:
当我在
准备继续了解Clickhouse,我得到了一个国内的物联网大数据平台——TDengine。
在网上简单了解后,发现风评不错,社区活跃度也很高,然后我去官网查看了TDengine与其他数据库的对比报告,发现性能也很好。所以我们
写了一个demo,简单用了TDengine,整个过程,在清晰的文档的帮助下,学习成本是可以接受的,所以我们最终决定使用TDengine。
数据结构和
如何建模
数据结构
首先,让我们来看看哨兵的流量数据是如何呈现的。
从上图可以看出,左侧是应用列表,每个应用的菜单中都有一个独立的监控面板,所有资源的流量数据都按照资源的粒度统计在监控面板中,比如通过QPS、拒绝QPS、响应时间等。
所以从前端渲染的角度来看,数据的唯一关键应该是应用程序资源。
然后,我们将从内部实现的角度研究数据的结构。
Sentinel 客户端对每台服务器上所有资源的流量数据进行计数,以秒为单位进行聚合,并记录在本地日志中。控制台调用客户端公开的接口获取采集到的流量数据,然后按服务维度聚合所有单机的流量数据,存储在内存中。
因此,我们需要存储的数据是落入数据库的唯一属性,而应用程序资源是唯一的属性。
数据建模在
官方TDengine文档中对数据进行建模的推荐方法如下:
" />
“
为了充分利用其数据的计时和其他数据特征,TDengine 需要为每个数据采集
点提供一个单独的表。
一个数据采集
点的方法和
一张表可以最大程度保证单个数据采集点的插入和查询性能最优。
在TDengine的设计中,表格用于表示特定的数据采集
点
和超级表用于表示一组相同类型的数据采集
点。为特定数据采集点创建表时,用户使用超级表的定义作为模板,并指定特定采集点(表)的标签值。与传统的关系数据库相比,表(数据采集
点)是静态标记的,之后可以添加、删除和修改这些标签。超级表收录
多个表,这些表具有相同的时序数据架构,但具有不同的标签值。
“
可以看出,官方文档中提出的数据建模方法完全符合这个场景的数据特征:一个应用资源就是一个表,所有应用资源都放在一个超级表中进行聚合查询。因此,在表结构的设计中,使用了官方文件推荐的方法。此外,在标签
的选择上,虽然目前没有聚合操作的需求,但考虑到未来的聚合操作很可能在应用的维度上完成,我们决定在表中记录一些应用信息作为标签。
整体架构
目前整体架构图如上,每个接入 Sentinel 的业务系统都会向控制台发送心跳请求,以维护机器的健康状态。
控制台定期轮询所有机器,将 Sentinel 客户端记录在业务系统中的监控数据拉取,经过聚合处理后批量写入 TDengine 集群。
由于场景简单且不是主要监控系统,并且目前可以接受少量数据丢失,因此不存在过多的故障处理机制。
技术选择
连接器
在连接器选择方面,公司的主要开发语言是Java,相关生态更加完善,所以选择JDBC形式的连接器是很自然的。
此外,JDBC的性能是
优于HTTP,JDBC驱动还支持节点不可用时自动切换节点。
唯一的不便是JDBC的方法会严重依赖本地库函数,需要在客户端的机器上安装TDengine,在项目部署阶段会稍微麻烦一些,但总体来说利大于弊。
最近,JDBC-RESTful正式更新以支持跨平台功能。由于该公司服务器的操作系统是Linux,因此没有跨平台要求,因此继续使用JDBC-JNI连接器。
注:图片来源于TDengine官网
使用 ORM 建立数据库连接池
数据库连接池和ORM框架也选择了Druid+Mybatis,这是公司内部的主流,可以根据官网的demo代码高效访问。但是在使用 Mybatis 时,查询中只使用 Mybatis,将 ResultSet 变成一个更方便处理的实体,并且在写入数据时不使用 Mybatis,因此直接在内存中拼接并在拼接后执行。
整体来说,TDengine 在适应主流框架方面非常友好,支持 HikariCP、Druid、Spring JdbcTemplate、Mybatis 等,根据官网提供的演示,可以快速实现访问,节省了大量时间,文档中明确列出了一些注意事项。
群集设置
目前,TDengine集群有三个物理节点,都是16核/64G内存/1T存储。官方的集群构建文档
还是很详细的,可以直接按照文档构建TDengine集群进行傻瓜式操作。
构建库
" />
在初步调查中发现,假设集群中只有三台机器,如果数据量太大,副本数为 3,相当于每台机器上存储一个完整的数据,根据可能的数据量,存储和内存的压力会更大, 因此,在构建数据库时,副本数设置为 1。如果集群扩容,TDengine 还支持动态修改副本数量,可以轻松完成切换到高可用集群。
此外,要考虑查询性能,请将块设置为 16,将缓存设置为 64MB。
CREATE DATABASE sentinel KEEP 365 DAYS 1 blocks 16 cache 64;
性能
目前,TDengine承载着数百亿级的数据,在生产环境中运行流畅,CPU每天使用率不到1%,内存使用率稳定在25%以下。
集群中某台机器的监控图如下图所示
使用早期的TDengine版本(2.0.7.0)进行研究时,内存存在一些不足,但随着版本的迭代,内存问题得到了很好的解决。
写入性能
控制台机配置4核16G,批量写入线程池设置的最大核心线程数为16,数据库连接池中最大线程数为20,实际使用量约为14个。
编写过程如下:
批量写入设置的最大写入次数为 400,写入时间如下:
可以看出,*敏*感*词*写入所需的时间基本可以保持在10ms,在一个比较理想的范围内。目前 SQL 语句的最大长度尚未调整,未来可能会通过增加 SQL 语句长度来进一步优化写入性能。
查询性能
以下时间消耗不包括网络开销,数据来自在客户端上指定 SQL 语句的查询。超级表数据查询量达数百亿,下面给出几种典型场景的耗时情况:
无论是大数据范围内的聚合查询,还是小范围内所有数据的指定查询,查询效率还是非常好的。
而且对比之前调查的数据,新版本的查询性能优化了很多,相信在未来的版本迭代中会走得更远。
存储容量目前,Sentinel
的数据不使用副本,全部数据分散在三台机器上,根据计算,TDengine对Sentinel监控数据的压缩率为10%,这是相当可观的。
总结目前,TDengine暂时仅作为时间序列数据库的
小规模试点,没有使用流计算和内置查询功能等一些高级功能,其读写性能和作为时间序列数据库的存储性能令人满意。
此外,运维难度和学习成本也出乎意料的低,很容易设置一组可用的集群,这也是非常巨大的优势。此外,TDengine的版本迭代速度非常快,旧版本中遇到的一些问题得到了快速修复,性能优化效果也非常显著。
在TDengine的研究和使用期间,
另一个很重要的感觉是,官方文档真的非常详细,技术部分的文章用简单的术语讲解了TDengine的技术架构和技术设计,可以学到很多东西;导读文章步骤清晰简单,大大降低了学习成本,让开发者可以快速完成框架适配、集群建设、SQL编写等。
未来我们会继续跟进TDengine的发布说明,了解有哪些新功能、优化点、bug修复等,必要时会升级版本。
预计TDengine的性能和稳定性将持续提升,未来在其他合适的业务场景中将作为技术选择的替代方案之一,例如,未来可能不仅需要存储聚合数据,还需要在单机维度存储流量控制数据。
注意:本文档中的数据基于 TDengine 版本 2.0.7.0 和 2.0.12.1。
文本|猞猁
解决方案:在线生成伪原创软件的具体效果怎样?
我们在注册一个新网站的时候,需要发布大量的图片和文字来丰富内容。事实上,无论是我们自己组织重写,还是替换文章中的文字,这些方法对于伪原创文章都不是最好的,不仅效率低,而且效果不佳。如果你用优采云
在线生成伪原创软件,我们就不用逐句写伪原创文章了。而是将准备好的文章直接放入文章*敏*感*词*,一键转换,几秒就能帮我们写出好的伪原创文章。
" />
这是人工伪原创文章所不具备的速度。同时,伪原创文章的质量也非常好。就因为我说好,大家都觉得没有说服力。所以我建议大家可以自己拍一篇文章,使用这篇文章*敏*感*词*来测试一下效果。
" />
本文章*敏*感*词*支持两种使用,一种是网页版在线使用,另一种是客户端版下载使用。不管用什么方法,伪原创的文章质量都是一样的!与上面提到的利用工具替换文章文字的伪原创文章质量相比,根本不是一个档次的。相比之下,可以说一个在天上,一个在地上。因为这个文章*敏*感*词*使用了人工智能技术,它可以深入理解和分析我们提供的文章,然后在不改变原有语义的情况下生成全新的文章。所以这个文章*敏*感*词*生成的伪原创文章质量非常高,跟自己写文章没什么区别,并且达到了伪原创文章的质量。本文由优采云
编辑撰写!