设备上传的数据具有很明显的物联网特点,通常是时序性的,按时间先后顺序上报,而且写入后,几乎不会修改,主要是查询和统计。针对这些特点,时序数据库TDengine 将数据库、消息队列、缓存、流式计算等功能融合一起,在大幅提高性能的同时,降低平台开发维护的复杂度和成本。
- 实现方案
- 服务端安装
官网提供了三种格式的安装包其中deb支持ubuntu系统,rpm支持centos系统,tar.gz包两种系统都支持。我们常用centOS,下载tar.gz包。
1、解压
tar -xzvf /home/tdengine/TDengine-server-1.6.5.5-Linux-x64.tar.gz
2、安装
解压文件后,进入子目录,执行其中的install.sh安装脚本:
sudo ./install.sh
3、启动服务
设置为自启动 :
systemctl start taosd
设置成功后,输入taos,测试服务是否正常启动
-
- 客户端安装
研发使用环境通常是windows,在官网上下载对应版本,双击安装即可。
安装完成后,默认会生成C:\Tdengine目录,在此目录下运行taos命令,连接服务端。
建立数据库,并使用
create database td_test
创建表格,
-
- python库安装
在C:\TDengine\connector\python\windows目录下安装第三方连接库
pip install python3/
-
- python 连接TDengine
引入taos包,与pg的连接方式类似,在connect中传入服务端的ip,用户名,密码,数据库名。
ip="10.19.133.18" pwd="taosdata" db="tc" user="root" # 连接taos数据库 conn = taos.connect(host=ip, user=user, password=pwd, database='td_test') cursor = conn.cursor()
-
- TDengine插入性能
采用随机生成经纬度,uuid和时间戳累加的方式构造10000条假数据,插入TDengine,测试其插入性能代码如下:
def forInsert(): startTime = time.time() start_time = datetime.datetime(2019, 7, 1) for i in range(1,10001): time_interval = datetime.timedelta(seconds=60) latitude = random.randrange(11879804, 11879904) longitude = random.randrange(43278291, 43278491) id = str(uuid.uuid4()) sql = '''INSERT INTO t_gps_info_h (sampling_time,device_index_code, longitude, latitude)VALUES('%s', '%s', '%d', '%d')''' try: cursor.execute(sql % (start_time, id, longitude, latitude)) start_time += time_interval except Exception as err: cursor.close raise(err) print(i,start_time, id, longitude, latitude) endTime = time.time() print('总用时:' + str(endTime - startTime)) cursor.close
运行后得到结果如下:
插入10000条数据,用时8秒左右,大概是postgre的4倍左右,未达到其官方的10倍以上,可能还需要后期具体优化。
-
- TDengine查询性能
通过sql语句查询其中的四个字段,测试其查询性能,代码如下:
def select(): startTime = time.time() # sql语句 sql = "SELECT sampling_time,device_index_code, longitude, latitude FROM t_gps_info_h" # read_sql 方法返回的数据类型是DataFrame dataframe = pd.read_sql(sql, con=conn) endTime = time.time() print(dataframe) print('查询条数:' + str(dataframe.size)) print('总用时:' + str(endTime - startTime))
运行后,得到测试结果,如下图所示:
查询条数近4万条,用时0.15s,性能是其插入的200倍。
- 结束语
1、 centos上第一次安装服务端后,如果出现dberror的错误,客户端也无法连接,则服务器需要重启。
2、语言与sql类似,只是数据类型比较有限,第一列必须是时间戳,并且会自动设为主键。
3、TDengine最大的优势就是性能,但是限制条件比较多,后期还需要在相同条件下与postgre进行对比。
4、本文仅对TDengine性能进行测试,其内置消息队列和预统计的功能还未涉及。