鼎鼎知识库
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

TDengine入门.md 30KB

基本概念

TDengine有三个模块。一个是客户端模块taosc。另外两个是服务端模块,一个是管理节点模块MGMT,一个是数据节点模块DNODE。客户端模块把请求交给管理节点模块,通过TCP/UDP的方式,在配置文件中通过mgmtShellPort来配置端口,默认端口是6030。客户端模块也会和数据节点模块打交道,也通过TCP/UDP的方式,默认端口是6035

所有的元数据、存储和查询都会首先和管理节点模块打交道,会有缓存。元数据包括用户、数据库、表。

在数据节点模块中的一个最重要的概念是虚拟节点vnode.一个库可以有很多vnode。一个表只会在一个vnode里,不会跨vnode存在。在写数据的时候里面有一个预写日志机制,就是把数据先放在缓存里,如果遇到突然断电的情况也没关系,因为当电力恢复之后缓存的数据还会进入硬盘,专业术语叫做落盘。落盘有两种方式。一种是时间驱动落盘,就是每隔一段时间缓存数据就会进入硬盘,默认为1小时,在taos.cfg中的commitTime字段配置;另外一种是数据驱动落盘,当缓存数据达到一定规模数据会进入硬盘,并且刷新日志文件。关键几个配置如下:

数据保存位置:
    默认放在了/var/lib/taos/目录中,通过dataDir设置。

数据分片:
    默认vnode中表数据按10天切片,通过daysPerFile设置。

保存时间:
    默认是3650天,系统自动删除,通过daysToKeep设置。

数据块:
    按列存储。

数据文件种类:
    -data文件
    -head文件
    -last文件

最佳实践

  • 一个设备一张表:提升读取写入速度,在存储介质上是连续的,一张表只有一个写入者,没有锁,以追加的方式写数据
  • 采集的物理量:也就是列,类型包括整型、浮点型、字符串型,没有索引。
  • 时间戳:有索引
  • 标签:保存在超级表的元数据节点中
  • 超级表:方便聚合统计
  • :涉及保留时长、备份数、Cache大小、文件块大小、是否压缩分库
  • 库和表的数量:没有限制

SQL语句

  • <> 表示用户需要输入的内容
  • [] 表示用户输入的内容可选
  • | 表示多选一
  • … 表示前面的项可重复多个

时间戳

  • 时间格式:YYYY-MM-DD HH:mm:ss.MS, 2017-08-12 18:25:58.128
  • 时间分辨率:默认毫秒
  • 服务器内部函数:now表示服务器的当前时间
  • 时间戳为0:默认使用服务器当前时间
  • Epoche Time,长整数:表示从1970-01-01 08:00:00.000开始的毫秒数
  • 时间可以加减:比如now-2h,a表示毫秒,s表示秒,m表示分钟,h表示小时,d表示天,w表示周,n表示月,y表示年。比如select * from t1 where ts > now-2w and ts <=now-1w
  • 启用微秒:通过enableMicrosecond

数据类型

  • TIMESTAMP:8 bytes, 时间戳,最小精度为毫秒,从格林威治时间1970-01-01 08:00:00.000开始
  • INT:4 bytes, 整型,范围是[-2^31+1,2^31-1],-2^31被用作null值
  • BIGINT: 8 bytes,长整型,范围是[-2^59,2^59]
  • FLOAT:4 bytes, 浮点型,有效位数6-7
  • DOUBLE:8 bytes, 双精度浮点型,有效位数15-16
  • BINARY: 长度自定义,记录字符串,最长不能超过504bytes,字符串两端使用单引号,否则英文全部自动转换为小写。使用时需指定大小,比如binary(20)是最长是20个字符的字符串,每个字符站1byte的存储空间,如果字符串超过20个字节,将自动截断。对于字符串内的单引号,用转义符\'
  • SMALLINT,2 bytes, 短整型,范围[-32767.32767]
  • TINYINT, 1 bytes, 单字节整型,范围[-127,127]
  • BOOL, 1 bytes, 布尔类型,true或false
  • NCHAR,自定义大小,拥有记录非ASCII字符串,如中文字符,每个nchar占用4个字节大小。字符串两端使用单引号,字符串内的单引号需要转义\',nchar(10)表示最多存储10个nchar字符,占用40bytes空间。如果字符串超出声明长度将被自动截断。

数据库管理

SQL语句中的英文字符默认不区分大小写,统一自动转换为小写执行。如果有大小写敏感,需要使用单引号把大写字母引用起来。

  • 创建数据库:CREATE DATABASE MYDB,默认数据库数据保存10年
  • 使用数据库:USE MYDB
  • 删除数据库:DROP DATABASE MYDB
  • 显示所有数据库:SHOW DATABASES

表管理

  • 创建表:CREATE TABLE tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1)表的第一个字段必须是TIMESTAMP类型,系统会自动将其设置为主键。表的每行的长度不能超过托4096个字节。使用数据类型binary或nchar需要制定最长的字节数,比如binary(20)
  • 删除表:DROP TABLE tb_name
  • 显示数据库下的所有表信息:SHOW TABLES,可以使用like过滤,比如SHOW TABLES LIKE ...,%匹配0到任意个字符,_表示匹配一个字符
  • 获取表结构:DESCRIBE
  • 表增加列:·ALTER TABLE tb_name ADD COLUMN field_name data_type
  • 表删除列:ALTER TABLE tb_name DROP COLUMN filed_name

注意:

  • 如果通过超级表创建,只能针对超级表进行操作,同时针对超级表的结构更改对所有表都会生效。
  • 使用use db_name操作后操作当前数据库下的表
  • 切换到其它数据库的表,可以使用demo.tb1来表示

数据写入

  • 插入一条记录:INSERT INTO tb_name VALUES (field_value, ...)
  • 插入一条记录到指定的列:INSERT INTO tb_name(field1_name,...) VALUES(field1_value),语句中没有出现的列,数据库将自动填充为NULL
  • 插入多条记录:INSERT INTO tb_names VALUES (field1_value1, ...) (field1_value2,...)
  • 按指定的列插入多条记录:INSERT INTO tb_name(field1_name,...) VALUES(field1_value1,...)(field1_value2,...)
  • 向多个表插入多条记录:INSERT INTO tb1_name VALUES (field1_value1,...)(field1_value2,...)... tb2_name VALUES (field1_value1,...)(field1_value2,...)...
  • 同时向多个表按列插入多条记录
INSERT INTO tb1_name (tb1_field1_name,...) VALUES(field1_value1,...)(field1_value1,...)
            tb2_name (tb2_field1_name,...) VALUES(field1_value1,...)(field1_value2,...)

注意:

  • 对于同一张表,记录的时间戳必须是递增,否则会跳过插入该条记录;如果时间戳为0,会默认使用服务器当前时间作为时间戳
  • 如果需要将时间戳小于最后一条记录时间的记录写入到数据库,可以使用IMPORT命令替代INSERT命令,语法是一样的;如果同时IMPORT多条记录,需要保证一批记录是按时间戳排序好的

数据查询

SELECT {* | expr_list} FROM tb_name
    [WHERRE where_condition]
    [ORDER BY _c0 {DESC | ASC}]
    [LIMIT limit, [, OFFSET offset]]
    [>> export_file]

SELECT function_list FROM tb_name
    [WHERE where_condition]
    [LIMIT limit [, OFFSET offset]]
    [>> export_file]
  • 返回所有列:*
  • 指定列
  • 对数字列进行四则运算
  • 给列取别名
  • where语句结合逻辑判断
  • where语句结合通配符
  • _c0表示首列的时间戳
  • 输出结果默认按时间戳升序排列
  • ORDER BY只能对时间戳操作,对其它字段操作属于非法

过滤操作:同时使用多个字段过滤需要使用AND,暂时不支持OR。针对同一字段的过滤条件必须单一,例如Value>20 and value <30是合法的,Value<20 AND Value <> 5是非法的。

  • > 适用于timestamp 和 numeric types
  • < 适用于timestamp 和 numeric types
  • >= 适用于 timestamp 和 numeric types
  • <= 适用于 timestamp 和 numeric types
  • = 适用于所有类型
  • <> 适用于所有类型
  • % 适用于 binary 和 nchar
  • _ 适用于 binary 和 nchar

SQL函数

COUNT

SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause]
返回行数或某列的非空值数量
返回类型为INT64
应用于全部字段,表和超级表

AVG

SELECT AVG(field_name) FROM tb_name [WHERE clause]

返回统计表或超级表中某列的平均值,返回结果类型为double,不能应用在timestamp, binary, nchar, bool字段

WAVG

SELECT WAVG(field_name) FROM tb_name WHERE clause

加权平均,返回sdouble,不能用在timestamp, binary, nchar, bool类型,适用于表和超级表

SUM

SELECT SUM(field_name) FROM tb_name [WHERE clause]

统计表或超级表某列的和,返回double或int64,不能用在timestamp, binary, nchar, bool

STDDEV

SELECT STDDEV(field_name) FROM tb_name [WHERE clause]

统计某列的均方差,返回double,不能用在timestamp, binary, nchar, bool

LEASTSQUARES

SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]

返回表中某列值是主键(时间戳)的拟合直线方程,返回结果是字符串(斜率,截距),不能应用在timestamp, binary, nchar, bool,自变量是时间戳,因变量是该列的值,适用于表

MIN

SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]

不能用在timestamp, binary, ncahr, bool

MAX

SELECT MAX(field_name) FROM {tb_name | stb_name} [WHERE clause]

FIRST

SELECT FIRST(field_name) FROM {tb_name | stb_name} [WHERE clause]

表或超级表中某列值最先写入的非NULL值,适用于所有字段,各个列FIRST(*),如果结果集中的某列全部为NULL,该列的返回结果也是NULL,如果结果集中所有列全部为NULL值则不返回结果

LAST

SELECT LAST(field_name) FROM {tb_name | stb_name} [WHERE clause]

表或超级表中某列的值最后写入的非NULL值,所有字段,如果返回各个列LAST(*),如果结果集中某列全部为NULL值则该列返回的结果也是NULL,如果结果集中所有列全部为NULL则不返回结果。

TOP

SELECT TOP(field_name, K) FROM {tb_name | stb_name} [WHERE clause]

统计表或超级表中某列的值最大k个非null值,不能用在timestamp, binary, ncahr, bool,k的取值范围在[1,100]

BOTTOM

SELECT BOTTOM(field_name, K) FROM {tb_name | stb_name} [WHERE clause]

PERCENTILE

SELECT PERCENTILE(field_name, P) FROM {tb_name | stb_name} [WHERE clause]

表中某列值的百分比分位数,返回double, 不能用在timestamp, binary, ncahr, bool,k的范围0和100之间,0时候等同于MIN,100的时候等同于MAX

LAST_ROW

SELECT LAST_ROW(field_name) FROM {tb_name | stb_name}

返回表或超级表的最后一条记录,与last函数不同,last_row不支持时间范围限制,强制返回最后一条记录

DIFF

SELECT DIFF(field_name) FROM tb_name [WHERE clause]

统计表中某列的值与前一行对应值的差,不能应用在timestamp, binary, nchar, bool类型

SPREAD

SELECT SPREAD(field_namne) FROM {tb_name | stb_name}[WHERE clause]

统计超级表或表中某列的最大值和最小值之差,返回double,不能用在binary, nchar, bool类型,可用于TIEMSTAMP字段表示记录的时间覆盖范围

四则运算

SELECT field_name [+|-|*|/|%][value | field_name] from {tb_name | stb_name} [WHERE clause]

统计表或超级表中某列或多列的计算,不能用在timestamp, binary, nchar, bool类型,支持两列或多列之间计算,使用括号表示优先级,Null字段不参与计算,如果参与计算的某行中保包含null,改行的结果是Null

举例

CREATE TABLE tb1(ts timestamp, col1 int, col2 float, col3 binary(50))

SELECT * FROM tb1 WHERE ts >= NOW - 1h

SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE `%nny` ORDER BY ts DESC

SELECT (col1 + col2) AS `complex` FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5

SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv

时间维度聚合

按照时间切割再聚合,比如温度传感器每秒采集一次数据,徐查询每隔10分钟温度的平均值。

SELECT function_list FROM tb_name
    [WHERE where_condition]
    INTERVAL(interval)
    [FILL ({None | VALUE | PREV | NULL | LINEAR})]

SELECT function_list FROM stb_name
    [WHERE where_condition]
    [GTOUP BY tags]
    [FILL ({VALUE | PREV | NULL | LINEAR})]
  • 聚合时间段由INTERVAL指定,最短时间10毫秒,10a
  • 仅限于单个输出的函数:count, avg, sum, stddev, leastsquares, percentile, min, max, first, last不能用于多行输出函数比如top, bottom, diff和四则运算
  • WHERE语句指定查询的起止时间和过滤条件
  • FILL语句指定某一时间数据确实情况下的填充模式。NONE,也是默认的方式,不填充;VALUE,固定值填充;NULL,使用NULL值填充;PREV,使用上一个非NULL值填充数据
  • 使用FILL时候,务必指定查询的时间区间,针对每次查询系统可返回不超过1千万条结果
  • 在实践维度聚合中,返回的结果中时间序列严格单调递增
  • 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表。如果查询中没有group by语句,则返回的结果按照该时间序列严格单调递增。如果查询中使用了group by语句分组,则返回结果中每个group内部按照时间序列严格单调递增。
create table sensor(ts timestamp, degree double, pm25 smallint)

SLECT AVG(degree), MAX(degree), LEASTSQUARES(degree), PERCENTILE(degree, 50) FROM sensor
    WHERE TS>=now -1d //过去20小时
    INTERVAL(10M) //以10分钟为一个阶段
    FILL(PREV);

超级表STable

对单个采集点单独建表导致表数量增加,如何对这些表进行聚合、统计呢?引入STable。

什么是超级表STable

  • 同类型数据采集点的抽象
  • 包含多长数据结构一样的字表
  • STable为其子表定义了表结构和一组标签。表结构就是表中记录的数据列及其数据类型。标签名也由STable定义,标签值记录每个子表的静态信息,用于对子表进行分组过滤。
  • 子表本质上就是普通的表,由一个时间戳和若干数据列组成
  • 子表与普通表的区别在于每个子表从属于一张超级表,并带有一组STable定义的标签值
  • 每种类型的采集设备可以定义一个STable。比如定义表的每列的数据类型,比如温度、电压、电流。标签信息属于Meta Data,如采集设别额序列号、型号、位置等是静态的。用户在创建表时指定Stable,还可以指定标签的值,也可以事后增加或修改。
create table thermometer (ts timestamp, degree float) tags (location binary(20), type int)

create table t1 using thermometer tags ('beijing', 10)
  • 可以使用STable创建数量无上限的、具有不同标签的表
  • STable就是具有相同数据模型,不同标签的表的集合
  • 将标签数据和采集的动态数据完全分离,对标签建立了高性能内存索引结构
  • 一个库可以有多个STable, 一个STable有多个子表

超级表管理

  • 创建超级表:CREATE TABLE <stable_name> (<field_name> TIMESTAMP, field_name1 field_type,...) TAGS (tag_name tag_type),TAGS的总长度不能超过512字节,数据类型不能是timestamp和nchar,不能与其它列名相同,不能为预留关键字
  • 显示已创建的超级表:show stables;
  • 删除超级表:DROP TABLE <stable_name>,删除超级表的前提要求先删除所有的子表
  • 查看属于某个超级表并满足条件的子表:SELECT TBNAME,[TAG_NAME,…] FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)
  • 查看属于某个超级表并满足查询条件的表,TBNAME为关键字:SELECT COUNT(TBNAME) FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)

写数据时自动创建子表

当定义好了超级表,在写数据的时候并不知道某个设备是否存在,可以采用自动创建子表,需要注意的是超级表是不能自动创建的。

INSERT INTO <tb_name> USING <stb_name> TAGS (<tag1_value>,...) VALUES (field_value,...)(field_value,...)...

对多个超级表下的子表创建。

INSERT INTO <tb1_name> USING <stb1_name> TAGS (<tag1_value1>, ...) VALUES (<field1_value1>,...)(<field1_value2>,...)...<tb_name2> USING <stb_name2> TAGS(<tag1_value2>,...) VALUES (<field1_value1>,...)

TAG管理

  • 添加新的标签:ALTER TABLE <stable_name> ADD TAG <new_tag_name> <TYPE>,标签总数不能超过6个
  • 删除标签:ALTER TABLE <stable_name> DROP TAG <tag_name>,第一列标签不能删除,至少保留一个标签,从超级表删除某个标签后,其下的所有子表也会自动删除标签
  • 修改标签名:ALTER TABLE <stable_name> CHANGE TAG <old_tag_name> <new_tag_name>,其下所有子表的标签名也会改变
  • 修改子表的标签值:ALTER TABLE <table_name> SET TAG <tag_name>=<new_tag_value>

多表聚合

通过TAG值进行条件过滤,暂不支持针对binary类型的模糊匹配过滤。

SELECT function<field_name>,… 
 FROM <stable_name> 
 WHERE <tag_name> <[=|<=|>=|<>] values..> ([AND|OR] …)
 INTERVAL (<time range>)
 GROUP BY <tag_name>, <tag_name>…
 ORDER BY <tag_name> <asc|desc>
 SLIMIT <group_limit>
 SOFFSET <group_offset>
 LIMIT <record_limit>
 OFFSET <record_offset>
  • 支持的函数:sum, count, avg, first, last, min, max, top, bottom
  • 针对全部或部分列的投影操作
  • 暂不支持其它类型的聚合计算和四则运算
  • 不支持嵌套
  • 不使用GROUP BY会对满足筛选条件的子表按时间聚合,按照时间戳单调递增输出
  • 使用ORDER BY _c0 ASC | DESC对时间戳升序或降序
  • 使用GROUP BY,按tags进行分组,组间的排序由ORDER BY指定,每个组内,按时间单调递增
  • 使用SLIMIT/SOFFSET指定组间分页。使用LIMIT/OFFSET指定组内分页。

举例

创建超级表:
CREATE TABLE thermometer (ts timestamp, degree double) TAGS(location binary(20), type int)

每个采集点一张表:
CREATE TABLE term1 USING thermometer TAGS('beijing',1);
CREATE TABLE therm2 USING thermometer TAGS('beijing',2);
CREATE TABLE therm3 USING thermometer TAGS('tianjin',1);
CREATE TABLE therm4 USING thermometer TAGS('shanghai',3);

写入数据
INSERT INTO therm1 VALUES ('2018-01-01 00:00:00.000',20);
INSERT INTO therm2 VALUES ('2018-01-01 00:00:00.000',21);
INSERT INTO therm3 VALUES ('2018-01-01 00:00:00.000',22);
INSERT INTO therm4 VALUES ('2018-01-01 00:00:00.000',23);

按标签聚合查询
SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
FROM thermoter
WHERE location='beijing' or location='tianjing'
GROUP BY location, type

按时间周期聚合查询
SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
FROM thermometer
WHERE name<>'beijing' and ts>now-1d
INTEERVAL(10M)
GROUPBY location,type

高级功能

连续查询Continuoous Query

  • 定期自动执行
  • 滑动窗口的方式进行计算
  • 简化的、时间驱动的流式计算
  • 针对库中的表或超级表
  • 可以让TDengine推送查询结果,或者将结果写回到TDengine中
  • 每次执行的查询是一个时间窗口time window,时间窗口随着时间流动向前滑动
  • 定义时间窗口的大小interval,每次前向增量时间forward sliding times
  • 使用TAOS SQL定义
  • 采用时间驱动的模式
  • 原始采集数据进行采样down sampling
  • 不同于其它流式计算实时反馈结果,连续查询只在时间窗口关闭以后才计算反馈结果。比如时间窗口周期是1天,那么反馈结果是在23:59:59秒以后才生成反馈结果
  • 反馈的结果有一个时间区间,如果此时有历史记录再写入到这个时间区间,连续查询不会重新执行,不会重新将结果推送给用户,不会更新已存在的计算结果
  • 服务端并不缓存客户端的计算状态,如果应用端崩溃,再次拉起的连续查询将只会从最接近的时间窗口开始计算;如果使用写回模式,TDengine可以确保写回的有效性和连续性。
  • 是在应用端启动连续查询的
SELECT COUNT(*) 
FROM FOO_TABLE
INTERVAL(1M) SLIDING(30S)
每一分钟统计一次,前向滑动的时间是30秒。

SELECT COUNT(*)
FROM FOO_TABLE
INTERVAL(1M)
每一分钟统计一次,前向滑动的时间是一分钟

注意:
前向滑动时间不能大于时间窗口的范围,如果大于了,系统将强制设置为时间窗口的范围。

将连续查询的结果写回到数据库中:

CREATE TABLE QUERY_RES
    AS
    SELECT COUNT(*)
    FROM FOO_TABLE
    INTERVAL(1M) SLIDING(30S)

默认如果不输入结束时间,连续查询会一直进行下去。还可以指定结束时间:

CREATE TABLE QUERY_RES
    AS
    SELECT COUNT(*)
    FROM FOO_TABLE
    WHERE TS > NOW AND TS <= NOW + 1H
    INTERVAL(1M) SLIDING(30S)

查看系统中全部运行的连续查询

show streams

杀掉对应的连续查询

kill stream

在写回模式中,如果把写回的表删除,连续查询也会自动停止

数据订阅Publisher/Subscriber

  • 每一张表可视作一个标准的消息队列
  • 支持轻量级的消息订阅与推送服务
  • 使用系统提供的API,用户可以订阅数据库中的某一张表或超级表
  • 订阅的逻辑和操作状态的维护均由客户端完成
  • 客户端定时轮询服务器是否有新的记录到达,有新的记录到达就会将结果反馈到客户

启动订阅服务:

TAOS_SUB *taos_subscribe(char *host, char *user, char *pass, char *db, char *table, int64_t time, int mseconds)

--host: 主机ip地址
--user: 数据库登录用户名
--pass: 密码
--db: 数据库名称
--table: 超级表或表的名称
--time: 启动时间,Unix Epoch,单位为毫秒,从1970年1月1日起计算的毫秒数,如果设置为0表示从当前时间开始订阅
--mseconds: 查询数据库更新的时间间隔,单位为毫秒,一般设置为1000毫秒。返回值为指向TDengine_SUB结构的指针,如果返回为空,表示失败

获取订阅结果。用户应用程序置于一个无限循环语句,如果数据库表有新纪录到达,该API将放回最新的记录,如果没有新的记录该API将阻塞,如果返回值为空说明系统出错。

TASOS_ROW taos_consume(TAOS_SUB *tsub)

--tsub: taos_subscribe的结构体指针

取消订阅。应用程序退出时,务必调用此函数以避免资源泄露。

void taos_unsubscribe(TAOS_SUB *tsub)

获取返回的一行记录中数据包含多少列。

int taos_num_subfields(TAOS_SUB *tsub)

获取每列数据的属性(数据类型、名字、长度)。

TAOS_FIELD *taos_fetch_subfields(TASO_SUB *tsub)

缓存Cache

  • 时间驱动缓存策略First-In-First-Out, FIFO
  • 写驱动的缓存管理机制,和读驱动的缓存模式Least-Recent-Use, LRU不一样
  • 最近写入的数据保存在缓存中,当缓存达到临界值时,将最早的数据批量写入磁盘
  • 获取数据实际就是从缓存中获取,并且是毫秒级的
  • 可以将TDengine当作缓存来使用
  • TDengine重启以后系统的缓存将被清空,之前的缓存数据均会被写入磁盘,缓存数据将不会像专门的key-value缓存系统那样再将之前的缓存数据重新加载到缓存中
  • TDengjine会分配固定大小的内存空间作为缓存空间
  • 每个vnode都有其独立的缓存池,不同的vnode不共享缓存池
  • 每个vnode里面的表共享该vnode的缓存池
  • 缓存的大小由缓存块的大小和数量相关,cacheBlockSize定义每个缓存块的大小,cacheNumOfBlocks定义每个vnode中可以缓存块的数量,TDengine要求每张表至少有2个缓存块可供使用,因此cacheNmOfBlocks的数值不应该小于vnode结点中所包含表数量的两倍

获取一张表或超级表的最后一条记录

select last_row(degree) from thermometer where location='beijing'

RESTful Connection

通过HTTP方式进行。

http://<ip>:<PORT>/rest/sql
http://192.168.0.1:6020/rest/sql

-- IP: 集群中的任一台主机
-- PORT:配置文件中的httpPort,默认值是6020
-- Header里带身份认证信息,单机版仅支持Basic认证机制
-- BODY里是一个完整的SQL语句,SQL语句中的数据表应该提供数据库前缀,否则系统会返回错误

请求:

curl -H 'Authorization:Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql

或

curl -u username:password -d '<SQL>' <ip>:<PORT>/

TOKEN为{username}:{password}经过Base64编码之后的字符串

返回格式:

{
    "status": "succ",
    "head": ["column1","column2", …],
    "data": [
        ["2017-12-12 23:44:25.730", 1],
        ["2017-12-12 22:44:25.728", 4]
    ],
    "rows": 2
} 

系统管理

练手

根用户

-- 进入根用户: sudo su
-- 退出根用户: exit

根目录

--来到根目录: cd /
--退出控制台:exit

vi练习

--列出目录:ls
--进入test目录: cd test
--vi打开文件:vi hello.txt
--决定光标的位置:
    方向:h,j,k,l 
    行首:b
    行尾:w
    下面一行:o
    上面一行:O
    段首:{
    段尾:}
--决定插入的位置:
    选择光标前后插入:i,a
    选择光标所在行行首行尾插入:i,A
--退出编辑:esc
--保存并退出::wq!
--不保存并退出::q!

文件目录结构

/etc/taos/taos.cfg 配置文件

-- cd /
-- cd etc/taos

/usr/local/taos/driver 动态链接库目录

-- cd /
-- cd usr/local/taos/driver

/var/lib/taos 数据文件默认目录

--cd /
--cd var/lib/taos

/var/log/taos 日志文件目录

--cd /
--cd var/log/taos

/usr/local/taos/bin 可执行文件目录

--cd /
--cd usr/local/taos/bin

taos:shell可执行文件
taosd:服务端可执行文件
taosdump:数据导出工具
rmtaos:卸载

服务端配置

在/etc/taos/taos.cfg配置,配置完成后需要重启taosd服务才能生效。

指定配置文件的目录:

taosd -c /home/user

查看taos.cfg文件:

-- cd /
-- cd etc/taos
-- ls
-- cat taos.cfg

配置详解:

  • internalIp:对外提供服务的ip地址
  • mgmtShellPort:管理结点与客户端通信使用的TCP/UDP端口号,默认6030,6030-6034端口被UDP占用,6030端口被TCP占用
  • vnodeShellPort:数据节点与客户端通信使用的TCP/UDP端口号,默认6035,6035-6039端口被UDP占用,6035端口被UDP占用
  • httpPort:数据结点对外提供RESTful服务使用的TCP端口号,默认6020
  • dataDir:数据库文件目录,默认/var/lib/taos
  • maxUsers:用户最大数量
  • maxDbs:数据库最大数量
  • maxTables:数据表最大数量
  • enableMonitor:系统检测,0关闭,1打开
  • logDir:日志文件目录,默认/var/log/taos
  • numOfLogLines:日志文件的最大行数
  • debugFlag: 131仅错误和报警信息,135:所有
  • days:一个数据文件覆盖的时间长度,单位是天
  • keep:数据库中保留数据的天数
  • rows:文件块中的记录条数
  • comp:文件压缩标志,0关闭,1一阶段压缩,2阶段压缩
  • ctime:数据从写入内存到写入硬盘的最长时间间隔,单位秒
  • clog:数据提交日志标志,0关闭,1打开
  • tables:每个vnode允许创建表的最大数目
  • cache:内存块的字节数大小
  • tblocks:每张表最大的内存块数
  • ablocks:每张表平均的内存块数
  • precision:时间戳,ms表示毫秒,us表示微秒

创建数据库:

  • 将具有相同特征的表放在一个库里
  • 一个应用有多个库
  • 为每个库配置不同存储参数
  • 客户端通过sql创建的数据库配置参数会覆盖系统配置参数 create database demo days 10 cache 16000 ablocks 4

客户端配置

在/etc/taos/taos.cfg配置,与taosd应用程序共享配置文件。启动taos时,也可以从命令行指定IP地址、端口号、用户名和密码,否则从taos.cfg读取。

为客户端程序taos指定配置文件目录:

taos -c /home/cfg

参数详解:

  • masterIP:客户端默认发起请求的服务器IP地址
  • charset:指明客户端所使用的字符集,默认UTF-8,TDengine存储nchar类型数据时使用unicode存储,因此客户端需要告知服务自己所使用的字符集,即客户端所在系统的字符集
  • locale:设置系统语言环境,linux上客户端与服务端共享
  • defautlUser:默认登录用户,默认值root
  • defaultPass:默认登录密码,默认值taosdata

用户管理

  • 创建用户:CREATE USER user_name PASS 'password'
  • 删除用户:DROP USER user_name,root用户使用
  • 修改用户密码:ALTER USER user_name PASS 'password'
  • 显示所有用户:SHOW USERS

数据导入

  • 通过脚本文件导入:在文件中写好sql语句,每行一条,#表示注释
  • 从csv文件导入,每个csv文件属于一张表且格式和需要导入表的结构相同
insert into tb1 file a.csv b.csv tb2 c.csv ...
import into tb1 file a.csv b.csv tb2 c.csv ...

数据导出

  • 按表导出csv文件,如果用户需要到处一个表或者一个STable表中的数据,可在shell中运行

    select * from <tb_name> >> a.csv
    
  • 用taosdump导出数据,通过taosdump --help获取更详细的用法说明

    --导出数据库中一张或多张表:taosdump [OPTION...] dbname tbname ...
    --导出一个或多个数据库:taosdump [OPTION...] --database dbname...
    --导出所有数据库(不含监控数据库): taosdump [OPTION...] --all-databases
    

系统连接、任务查询关系

正在进行的查询、流式计算,查看连接:

SHOW CONNECTIONS

强制关闭数据库连接:

KILL CONNECTION <connection-id>

显示数据查询:

SHOW QUERIES

强制关闭数据查询:

KILL QUERY <query-id>

显示流式计算:

KILL STREAM <stream-id>

系统监控

  • TDengine启动后会自动创建一个监测数据库SYS,并自动将服务器的CPU,内存,硬盘空间,带宽,请求数,磁盘读写速度,慢查询等信息定时写入该数据库
  • TDengine还将重要的系统操作,比如登录、创建、删除数据库等日志及各种错误报警信息记录下来存放在SYS库里
  • 通过CLI或者WEB图形界面查看监测信息
  • 监测信息的采集默认是打开的,单可以通过修改配置文件中的enableMonitor来修改

连接数据库实战

  • 数据库ip: 192.168.8.129