解决方案:精选文章 | 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。

  文本|猞猁

  解决方案:在线生成伪原创软件的具体效果怎样?

  我们在注册一个新网站的时候,需要发布大量的图片和文字来丰富内容。事实上,无论是我们自己组织重写,还是替换文章中的文字,这些方法对于伪原创文章都不是最好的,不仅效率低,而且效果不佳。如果你用优采云

在线生成伪原创软件,我们就不用逐句写伪原创文章了。而是将准备好的文章直接放入文章*敏*感*词*,一键转换,几秒就能帮我们写出好的伪原创文章。

  

" />

  这是人工伪原创文章所不具备的速度。同时,伪原创文章的质量也非常好。就因为我说好,大家都觉得没有说服力。所以我建议大家可以自己拍一篇文章,使用这篇文章*敏*感*词*来测试一下效果。

  

" />

  本文章*敏*感*词*支持两种使用,一种是网页版在线使用,另一种是客户端版下载使用。不管用什么方法,伪原创的文章质量都是一样的!与上面提到的利用工具替换文章文字的伪原创文章质量相比,根本不是一个档次的。相比之下,可以说一个在天上,一个在地上。因为这个文章*敏*感*词*使用了人工智能技术,它可以深入理解和分析我们提供的文章,然后在不改变原有语义的情况下生成全新的文章。所以这个文章*敏*感*词*生成的伪原创文章质量非常高,跟自己写文章没什么区别,并且达到了伪原创文章的质量。本文由优采云

编辑撰写!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线