【本文正在参与 “拥抱开源 | 涛思数据 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 maven
git clone https://github.com/taosdata/TDengine.git
cd TDengine
mkdir 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 shell
TDengine 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
|