热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探索TDengine在《图码联侦》项目中的应用可行性及实践研究

【本文正在参与“拥抱开源|涛思数据TDengine有奖征稿】https:marketing.csdn.netp0ada836ca30caa924b9baae0fd33857c目

【本文正在参与 “拥抱开源 | 涛思数据 TDengine有奖征稿】

https://marketing.csdn.net/p/0ada836ca30caa924b9baae0fd33857c

目录

图码项目介绍及问题

TDengine探索可行性研究

TDengine安装与使用

源码安装

docker使用

主要操作

JAVA 客户端连接

性能考虑

taosdump使用

taosimport

taosdemo

缺点发掘与结论




图码项目介绍及问题

    图码联合侦测系统,是在视频监控技术的深度应用基础上,结合安防中重要的移动设备特征码IMSI等,在即使不接入身份证、电话号码等特征的限制下,也依然可以通过IMSI与人像的碰撞算法,得到彼此的匹配关系,建立“一人一档”的档案库。在技术上,结合了“图像”与“码”的关系,根据碰撞算法,建立了彼此的关联;在应用场景中,针对现实中系统对接难度大、数据互通困难的现状,相对于大平台而言,它拥有极简的布署优势,通过建立的档案库,可以快速帮助公安定位观测对象的身份,极大辅助公安技侦与破案。

   在大数据处理这 块,采用了mycat + mysql (主备)的架构。

   优点就是充分利用成熟的数据库的技术优势 ,可以无缝的替换传统的非大数据的持久层,给程序员无感知的替换;这种架构,门槛也比较低,起步只需要8G8核就可以正常启动运行,不像hadoop,spark等大数据架构,起步就要五台较高性能的主机,才能保证基础的运行。

   缺点 :架构师需要具备比较强的专业知识 ,做好这块的架构与布署工作,及相关的监控。比如主备的设置,负载均衡,容量的扩展或者替换,数据的迁移等; 在体量上,受限于mycat1.X的10亿数据的限制,及时的动态查询会有性能的问题。

 

   如果有一种技术,可以代替mycat+mysql,又不用用户去考虑其中的负载均衡,容量管理等细节,也不用考虑容量受限等问题,那就减轻了产品在架构上的负担,可以更加专注自己的业务。

  这个时候 ,我在CSDN上看到了关于涛思科技TDengine的介绍。


TDengine探索可行性研究

   让我们先上涛思科技对于TDengine的产品特征介绍:

    TDengine是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度,且核心代码,包括集群功能全部开源(开源协议,AGPL v3.0)。

10 倍以上性能提升。定义了创新的数据存储结构,单核每秒就能处理至少2万次请求,插入数百万个数据点,读出一千万以上数据点,比现有通用数据库快了十倍以上。
硬件或云服务成本降至1/5。由于超强性能,计算资源不到通用大数据方案的1/5;通过列式存储和先进的压缩算法,存储空间不到通用数据库的1/10。
全栈时序数据处理引擎。将数据库、消息队列、缓存、流式计算等功能融合一起,应用无需再集成Kafka/Redis/HBase/Spark等软件,大幅降低应用开发和维护成本。
强大的分析功能。无论是十年前还是一秒钟前的数据,指定时间范围即可查询。数据可在时间轴上或多个设备上进行聚合。即席查询可通过Shell/Python/R/Matlab随时进行。
与第三方工具无缝连接。不用一行代码,即可与Telegraf, Grafana, EMQ X, Prometheus, Matlab, R集成。后续还将支持MQTT, OPC, Hadoop,Spark等, BI工具也将无缝连接。
零运维成本、零学习成本。安装、集群一秒搞定,无需分库分表,实时备份。标准SQL,支持JDBC,RESTful,支持Python/Java/C/C++/Go/Node.JS, 与MySQL相似,零学习成本

再看看它的适用场景 ,具体参考链接:https://www.taosdata.com/cn/documentation/evaluation#scenes

 其中有一句话吸引了我 ,”TDengine是面对高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品“ 这样它的定位就很好地匹配了我们《图码联侦》项目的数据特点,类似于IOT的时序大数据。

    但看到后面一句:

”采用TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。但需要指出的是,因充分利用了物联网时序数据的特点,它无法用来处理网络爬虫、微博、微信、电商、ERP、CRM等通用型数据。“

   我觉得会有大的问题,因为一个系统不仅要有大数据,而且普通 的CRM等普通业务也要处理啊,难道要因为另外定义一个数据源来处理这些?

   however,这样疑虑并不妨碍我对TDengine的继续探讨一番。


TDengine安装与使用


源码安装

可以参考我前面实验的记录 链接:https://blog.csdn.net/dualvencsdn/article/details/115202910

CentOS 7:
sudo yum install -y gcc gcc-c++ make cmake git
安装 OpenJDK 8:sudo yum install -y java-1.8.0-openjdk
安装 Apache Maven:sudo yum install -y mavengit clone https://github.com/taosdata/TDengine.git
cd TDenginemkdir debug && cd debug
cmake .. && cmake --build .在debug目录 make install /usr/bin/cmake -P cmake_install.cmake
-- Install configuration: "Debug"
make install script: /home/dualven/TDengine/packaging/tools/make_install.sh
this is centos system
source directory: /home/dualven/TDengine
binary directory: /home/dualven/TDengine/debug
Start to install TDEngine...TDengine is installed successfully!To configure TDengine : edit /etc/taos/taos.cfg
To start TDengine : ./taosd
To access TDengine : use taos in shellTDengine is installed successfully!

docker使用

建立容器
docker run --name taos192 -p6030-6042:6030-6042/tcp -p6030-6042:6030-6042/udp -d tdengine/tdengine

防火墙放行
 firewall-cmd --zone=public --add-port=6030-6042/tcp --permanent

firewall-cmd --zone=public --add-port=6030-6042/udp --permanent

FQDN配置
这项很重要。为什么要配置,参考我前面的实验记录:

https://blog.csdn.net/dualvencsdn/article/details/118019565。

就是要让客户端找到它。但它自己在本身进行DB操作的时候,有时候要用到taos.cfg里的fqdn,所以远程客户端访问时,最好也用它的fqdn,如果先用ip自己访问到了它,但内部程序使用fqdn会报错。

DB error: Unable to resolve FQDN (0.011791s)

故,我们在192的主机上作出映射hosts文件: 10.60.100.192 289461ef56c4

在客户端 的文件上,也作出hosts文件的映射  10.60.100.192 289461ef56c4,

坑:要记得防火墙对于那些端口的TCP,UDP都放行才可以。


主要操作

查看配置:docker exec -it taos192 taosd -C

[root@taos192 TDengine-server-2.1.2.0]# docker exec -it taos192 taosd -C
taos global config:
==================================serverPort: 6030 arbitrator: numOfMnodes: 3 vnodeBak: 1 telemetryReporting: 1 balance: 1 balanceInterval: 300 maxTmrCtrl: 512 offlineThreshold: 864000(s)statusInterval: 1(s)minSlidingTime: 10(ms)minIntervalTime: 10(ms)maxStreamCompDelay: 20000(ms)maxFirstStreamCompDelay:10000(ms)retryStreamCompDelay: 10000(ms)streamCompDelayRatio: 0.100000 maxVgroupsPerDb: 0 maxTablesPerVnode: 1000000 minTablesPerVnode: 1000 tableIncStepPerVnode: 1000 cache: 16(Mb)blocks: 6 days: 10 keep: 3650 minRows: 100 maxRows: 4096 comp: 2 walLevel: 1 fsync: 3000 replica: 1 partitions: 4 quorum: 1 update: 0 compressMsgSize: -1 maxSQLLength: 1048576(byte)maxNumOfOrderedRes: 100000 queryBufferSize: -1(byte)retrieveBlockingModel: 0 keepColumnName: 0 timezone: locale: charset: maxShellConns: 50000 maxConnections: 5000 minimalLogDirGB: 1.000000(GB)minimalTmpDirGB: 1.000000(GB)minimalDataDirGB: 2.000000(GB)mnodeEqualVnodeNum: 4 flowctrl: 1 slaveQuery: 1 adjustMaster: 1 http: 1 mqtt: 0 monitor: 1 stream: 1 telegrafUseFieldNum: 0 gitinfo: 2019939bcc5567212d6e07af557c2c4ea540c091 gitinfoOfInternal: NULL buildinfo: Built at 2021-06-07 14:27 version: 2.1.2.0 taos local config:
==================================firstEp: secondEp: fqdn: configDir: /etc/taos logDir: /var/log/taos scriptDir: /etc/taos numOfThreadsPerCore: 1.000000 numOfCommitThreads: 4 ratioOfQueryCores: 1.000000 role: 0 monitorInterval: 30(s)rpcTimer: 300(ms)rpcForceTcp: 0 rpcMaxTime: 600(s)shellActivityTimer: 3(s)httpEnableRecordSql: 0 httpMaxThreads: 2 restfulRowLimit: 10240 numOfLogLines: 10000000 logKeepDays: 0 asyncLog: 1 debugFlag: 0 mDebugFlag: 131 dDebugFlag: 135 sDebugFlag: 135 wDebugFlag: 135 sdbDebugFlag: 131 rpcDebugFlag: 131 tmrDebugFlag: 131 cDebugFlag: 131 jniDebugFlag: 131 odbcDebugFlag: 131 uDebugFlag: 131 httpDebugFlag: 131 mqttDebugFlag: 131 monDebugFlag: 131 qDebugFlag: 131 vDebugFlag: 135 tsdbDebugFlag: 131 cqDebugFlag: 131 enableRecordSql: 0 enableCoreFile: 0 maxBinaryDisplayWidth: 30 tempDir: /tmp/

创建数据库,创建表:

 taos -s "CREATE DATABASE pdas KEEP 365 DAYS 10 BLOCKS 4 UPDATE 1;"

 taos -d pdas -f onetable.txt


CREATE STABLE dw_reportimsi( \ts timestamp,\id bigint, \device_name nchar(60),\equip_id nchar(60), \imsi nchar(60),\imei nchar(60),\source_tac bigint, \cell_no bigint,\mcc bigint,\mnc bigint, \equip_longitude nchar(60),\equip_latitude nchar(60), \belong nchar(60),\address nchar(60),\rssi nchar(60),\phone_num nchar(60) \
)tags(location binary(64), groupdId int);

 其它 参考我前面的记录:https://blog.csdn.net/dualvencsdn/article/details/118025718


JAVA 客户端连接

     这个作为java主要开发的人员,有点小坑的是,英文文档里居然没有,我开始一直看的英文,没有发现,后来在中文文档里是有这章节的

https://www.taosdata.com/cn/documentation/connector/java

   但是最全的代码demo居然是在docker的工程里,这是一个惊喜:tdengine/tdengine

   我整理了下,可以归整到一个工程,满足java各种形态的调用 。有需要的可以私信我。

1)connection pool

(2) mybatis plus

(3) jdbc

(4) mybatis 


性能考虑

为了进行性能测试,我做了一些导入工具的使用尝试。


taosdump使用

https://github.com/taosdata/TDengine

https://www.taosdata.com/blog/2020/03/09/1334.html


taosimport

根据官方研发说明,已经不太用了。这是研究了一天后,与官方客服联系上才知道的,这有点小坑。也是受了官方文档的误导:https://www.taosdata.com/blog/2020/01/18/1166.html。

howerver,还是记录下
https://github.com/taosdata/TDengine/tree/develop/importSampleData

bin/taosimport -cfg config/cfg.toml -db pdas  -cases pdas  -hnum 1 -vnum 10 -port 6030 -user root -password taosdata -host 10.60.100.192

确实不好用,比如taos 客户端,默认的 账号密码与host不用输入 ,它一定要输入 。

报错也不明显 ,怎么也找不出问题。

2021/06/22 18:00:13 main.go:404: create table error: invalid operation: illegal value or data overflow



taosdemo

倒腾一番后,发现通过taosdemo就可以体验到taos的这个数据读写速度 可以参考:

https://www.taosdata.com/cn/documentation/getting-started


缺点发掘与结论

   由于最开始的时候,没有深刻体会

 ”采用TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。但需要指出的是,因充分利用了物联网时序数据的特点,它无法用来处理网络爬虫、微博、微信、电商、ERP、CRM等通用型数据。“这句话的含义,在实验中积极去做一些普通表的建立与测试,才深刻体验它的一些缺陷:

与官方谈话记录 

收获结论:(1) delete不支持,后续会支持(2)通过插入相同时间戳来完成 更新

(3) 对于中间数据库的使用模式,频繁对百万单表的删除与更新,这种场景 暂不支持。

小T:
修改目前可以用相同时间戳的数据来update小T:
delete只是暂时还没能支持小T:
这是我们3.0版本的计划小T:
未来一定会有的小T:
其实小T:
表的数据和数据库的时间范围是大概接近的小T:
这个是有限制的小T:
你的表不可以随意插入任意时间段的数据小T:
所以他们统一受到keep影响小T:
比如,keep 3650天小T:
你不可以插入3650天之前的数据小T:
另一个主要是目前mysql单表对于过百万建立索引后的数据的删除与修改的效率比较低——现在TDengine对于数据的更新只有相同时间戳覆盖这种办法,删除只能通过时间段自动删除(未来会支持delete)。至于您说的效率比较低,要等到我们功能做完之后再做比较了小T:
作为专门的大数据引擎,效率一定会比mysql高的

 架构建议:

(1)对于普通业务的表,可以类似mysql,mongo让 用户可以使用普通的表即可,不具备时序数据库的特征就好。难道我在一个工程里,还要为了一些最普通的表业务 ,再建立一套数据库的访问逻辑? 当然,目前阶段,如果你使用了TDengine,好像也只能使用这个方案。

(2) 对于文中的6030-6042 TCP/UDP端口,我觉得TDengine上采用的应该是阻塞式的应用访问方式  (没有读源码,只是推测),建议参考netty的架构 ,selector方式,就应该用不着这么多端口了吧。

【本文正在参与 “拥抱开源 | 涛思数据 TDengine有奖征稿】

https://marketing.csdn.net/p/0ada836ca30caa924b9baae0fd33857c


推荐阅读
author-avatar
林丰岚_324
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有