无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺

融合通信 馬龍

2019-12-09 / ,

作(zuo)者(zhe)|馬龍,融合通信高級工程師

小 T 導讀:融合通(tong)信(xin)技術(天津)有限公司(si)是具備國(guo)內一流(liu)水準(zhun)的(de)企業移動(dong)新通(tong)信(xin)商務(wu)平臺技術和應(ying)用方(fang)案提供商。融合短信(xin)、彩信(xin)、語音、流(liu)量及(ji)虛擬座席的(de)云通(tong)信(xin)服務(wu)平臺, 融合三大運營商和互聯網(wang)IP網(wang)絡,致力于為國(guo)內外企業提供一流(liu)水準(zhun)的(de)移動(dong)新通(tong)信(xin)商務(wu)平臺及(ji)運營服務(wu)。

公司的主營業務是給企業客戶提供短信服務,內部有一個強大的運營監控平臺。每日短信業務量巨大,監控平臺需要使用時序數據庫(Time-Series Database)來(lai)對(dui)發送的(de)(de)海量短信分地理區域(yu)、運營商、接收狀態等(deng)類別進行統計和監控。以前一直在用(yong)InfluxDB,對(dui)于時間跨度稍大些(xie)的(de)(de)查(cha)詢(比(bi)如一個(ge)月的(de)(de)數據)就(jiu)顯得非常(chang)慢了。從TDengine Database開(kai)源(yuan)后(hou),便知(zhi)道了這個(ge)很牛的(de)(de)家伙(huo),于是嘗試著使用(yong)TDengine。

在搞懂了(le)(le)基本的功能后,便上(shang)線了(le)(le)TDengine版的監控(kong)系(xi)統,但是發現,在grafana中居(ju)然(ran)不能“group by”,只能通(tong)過寫where多條語句(ju)將(jiang)多個(ge)(ge)短信(xin)狀態(tai)數(shu)據放到一個(ge)(ge)儀(yi)表盤(pan)里(li),如圖:

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

如果where條件有更多,這樣的方法就太(tai)笨,并(bing)且靈活性太(tai)差。

于是,開始仔細研究,搞懂了“超級表”、“”等(deng),在這個過程中遇到過不少(shao)問(wen)題,在這里做一下記錄(測試環(huan)境,數據是模擬(ni)產生的(de))。

一、安裝和運行

測試環境:

cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

安裝很簡單:

rpm -ivh tdengine-1.6.3.1-3.x86_64.rpm

配置都用默(mo)認的(未改配置文(wen)件)

啟動TDengine:

systemctl start taosd

二、建庫、建表

在命(ming)令(ling)行輸入(ru)“taos”

taos>

以(yi)下建(jian)庫(ku)、建(jian)表操作都在此提示(shi)符下進行

1. 創建數據庫

create database jk keep 365 precision 'us';

說明:

  • keep 365表示該庫保存365天內的數據,365天之前的數據會被自動清除(因為是時序數據庫,所以不能對庫中的表進行delete操作);
  • precision ‘us’表示數據庫中的時間戳精度為“微秒”,(默認是毫秒,也可以顯示寫為precision ‘ms’), 經測試,此處用單引號和雙引號都是可以的,但是不能沒有引號。
  • 配置文件中已經不支持時間精度的配置,必須在建庫的時候指定(測試了很多配置都不生效,Issues后得到的官方回復)
  • TDengine的設計初衷是用于物聯網,設備的信息采集精度到“毫秒”已經足夠用,但我司的短信平臺會有突發大量數據產生,為了避免可能會導致的數據丟失,將精度設置為“微秒”,經測試,效果很好,測試的模擬數據插入時間戳都用“now”獲取,下圖左側為“毫秒”精度,能看到有“0 row(s)”的情況出現,表示有數據未插入, 右側為“微秒”精度,未見未插入數據。
使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

2. 創建超級表

進入數據庫“jk”

taos> use jk; 
Database changed.
create table jiankong (ts timestamp, gatewayid binary(6), companyid binary(20), provinceid binary(10), cityid binary(10), value int, timestr binary(30))
tags(type binary(10), subtype binary(10));

短信系(xi)統中有3種type,幾百種subtype,所以將(jiang)(jiang)這(zhe)些靜態信息(或者(zhe)簡單地理解(jie)為(wei)需要將(jiang)(jiang)進(jin)行group by的字段設(she)置為(wei)tag)

解釋一下:

STable是同一類型數據采集點的抽象,是同類型采集實例的集合,包含多張數據結構一樣的子表。
每個STable為其子表定義了表結構和一組標簽:表結構即表中記錄的數據列及其數據類型;標簽名和數據類型由STable定義,標簽值記錄著每個子表的靜態信息,用以對子表進行分組過濾。
子表本質上就是普通的表,由一個時間戳主鍵和若干個數據列組成,每行記錄著具體的數據,數據查詢操作與普通表完全相同;但子表與普通表的區別在于每個子表從屬于一張超級表,并帶有一組由STable定義的標簽值。
針對所有的(de)通(tong)過(guo)STable創(chuang)建的(de)子表(biao)進行(xing)多表(biao)聚合查詢,支持按照全(quan)部(bu)的(de)TAG值進行(xing)條件過(guo)濾(lv)(lv)(where),并(bing)可將結果按照TAGS中的(de)值進行(xing)聚合(group by),暫(zan)不支持針對binary類型的(de)模糊(hu)匹配過(guo)濾(lv)(lv)。

標(biao)(biao)(biao)簽(qian)(qian)數據(或(huo)者叫標(biao)(biao)(biao)簽(qian)(qian)值(zhi)(zhi))直接關聯(lian)到每個(ge)子(zi)表,相同的標(biao)(biao)(biao)簽(qian)(qian)值(zhi)(zhi)(一(yi)個(ge)或(huo)者多個(ge),最多6個(ge))定位到一(yi)個(ge)子(zi)表(用“寫數據時自動建表”的方式(shi),可以將“相同的標(biao)(biao)(biao)簽(qian)(qian)值(zhi)(zhi)”對(dui)應(ying)到多個(ge)子(zi)表)。

tag值(zhi)支(zhi)持(chi)中文,需要(yao)將tag類型設(she)置(zhi)為NCHAR(在其他測(ce)試中已經驗證過)。

3. 創建子表(子表就是普通表,表結構完全由超級表定義):

create table jiankong_sub_send using jiankong tags ('send', 'send'); 
create table jiankong_sub_delivrd using jiankong tags ('delivrd', 'delivrd'); 
create table jiankong_sub_undeliv_db_0108 using jiankong tags ('undeliv', 'DB:0108'); 
create table jiankong_sub_undeliv_db_0107 using jiankong tags ('undeliv', 'DB:0107'); 
create table jiankong_sub_undeliv_balance using jiankong tags ('undeliv', 'BALANCE'); 
create table jiankong_sub_undeliv_id_0076 using jiankong tags ('undeliv', 'ID:0076'); 
create table jiankong_sub_undeliv_ib_0008 using jiankong tags ('undeliv', 'IB:0008');

相同類型的type和subtype的組合創建為一個子表(biao)(biao)(只(zhi)是進行(xing)測(ce)試,所以(yi)并沒有(you)(you)將所有(you)(you)的幾百個subtype都進行(xing)建表(biao)(biao))

4. 插入數據

INSERT INTO jiankong_sub_send VALUES (now, 3034, '1564', '109', '1272', '2', '201909231530') 
INSERT INTO jiankong_sub_delivrd VALUES (now, 3034, '1564', '109', '1272', '2', '201909231530')
INSERT INTO jiankong_sub_undeliv_balance VALUES (now, 1179, '152', '106', '1000', '1', '201910071113') 
INSERT INTO jiankong_sub_undeliv_id_0076 VALUES (now, 1165, '1785', '111', '1226', '1', '201910071415') 
INSERT INTO jiankong_sub_undeliv_ib_0008 VALUES (now, 1165, '1785', '127', '1000', '2', '201910061727') 
INSERT INTO jiankong_sub_undeliv_db_0108 VALUES (now, 90, '548', '123', '1237', '1', '201910061127') 
INSERT INTO jiankong_sub_undeliv_db_0107 VALUES (now, 2261, '808', '116', '1314', '2', '201910032106')

以上(shang)是對上(shang)述創(chuang)建的(de)7個子表(biao)分別插(cha)入模擬(ni)數(shu)(shu)據(ju),由于(yu)模擬(ni)大量數(shu)(shu)據(ju),所以需要寫(xie)shell腳(jiao)本(也可以用其他方式)進行數(shu)(shu)據(ju)灌入。

寫入數(shu)據時(shi)不能直接對STable操作,而是要對每張子表(biao)進行操作。

5. 數據庫、表結構等查詢

查詢數據庫信息:

taos> show databases; 
name | created time | ntables | vgroups |replica| days | keep1,keep2,keep(D) | tables | rows | cache(b) | ablocks |tblocks| ctime(s) | clog | comp |time precision| status | 
==============================================================================================================================================================================================================================================
log | 19-11-18 16:37:14.025| 4| 1| 1| 10|30,30,30 | 32| 1024| 2048| 2.00000| 32| 3600| 1| 2|us |ready | 
jk | 19-11-18 16:48:19.867| 10| 1| 1| 10|365,365,365 | 1024| 4096| 16384| 4.00000| 100| 3600| 1| 2|us |ready | 
Query OK, 1 row(s) in set (0.002487s)

查詢超級表:

taos> show stables; 
name | created_time |columns| tags | tables | 
==================================================================================================================== 
jiankong | 19-11-18 16:48:41.540| 7| 2| 7| Query OK, 1 row(s) in set (0.002140s)

查詢超級(ji)表的(de)表結構:

taos> describe jiankong; 
Field | Type | Length | Note | 
 ======================================================================================================= 
ts |TIMESTAMP | 8| | 
gatewayid |BINARY | 6| | 
companyid |BINARY | 20| | 
provinceid |BINARY | 10| | 
cityid |BINARY | 10| | value |INT | 4| | 
timestr |BINARY | 30| | 
type |BINARY | 10|tag | 
subtype |BINARY | 10|tag | 
Query OK, 9 row(s) in set (0.001301s)

可以在Note列看到“tag”,表示是此列是標(biao)簽(qian)

查詢子表:

taos> show tables;
                           table_name                           |     created_time     |columns|                             stable                             |
 =================================================================================================================================================================
jiankong_sub_delivrd                                            | 19-11-18 16:49:17.009|      7|jiankong                                                        |
jiankong_sub_undeliv_ib_0008                                    | 19-11-18 16:49:17.025|      7|jiankong                                                        |
jiankong_sub_undeliv_db_0108                                    | 19-11-18 16:49:17.016|      7|jiankong                                                        |
jiankong_sub_undeliv_db_0107                                    | 19-11-18 16:49:17.018|      7|jiankong                                                        |
jiankong_sub_undeliv_id_0076                                    | 19-11-18 16:49:17.023|      7|jiankong                                                        |
jiankong_sub_send                                               | 19-11-18 16:49:17.003|      7|jiankong                                                        |
jiankong_sub_undeliv_balance                                    | 19-11-18 16:49:17.021|      7|jiankong                                                        |

查詢具體(ti)的(de)子表的(de)表結構:

taos> describe jiankong_sub_undeliv_db_0108;
                             Field                              |      Type      |  Length   |   Note   |
    =========================================================================================================
    ts                                                              |TIMESTAMP       |          8|          |
    gatewayid                                                       |BINARY          |          6|          |
    companyid                                                       |BINARY          |         20|          |
    provinceid                                                      |BINARY          |         10|          |
    cityid                                                          |BINARY          |         10|          |
    value                                                           |INT             |          4|          |
    timestr                                                         |BINARY          |         30|          |
    type                                                            |BINARY          |         10|undeliv   |
    subtype                                                         |BINARY          |         10|DB:0108   |

可以在Note列看到(dao)“undeliv”(超級表中的type字段(duan))和“DB:0108″(超級表中的subtype字段(duan)),這(zhe)2個靜態標簽值確定(ding)了這(zhe)個子(zi)表

6. 數據查詢

對type進行(xing)分組聚合(he)查詢:

taos> select sum(value) from jk.jiankong group by type;
     sum(value)      |   type   |
=================================
             11827688|delivrd   |
             55566578|send      |
             46687487|undeliv   |
Query OK, 3 row(s) in set (0.018251s)

對subtype進行(xing)分組聚合查(cha)詢:

taos>
taos> select sum(value) from jk.jiankong group by subtype;
     sum(value)      | subtype  |
=================================
                 9317|BALANCE   |
                65219|DB:0107   |
              2077691|DB:0108   |
              2804417|IB:0008   |
             41730843|ID:0076   |
             11827688|delivrd   |
             55566578|send      |
Query OK, 7 row(s) in set (0.013978s)

對type和subtype進行分(fen)組聚合(he)查詢:

taos> select sum(value) from jk.jiankong group by type, subtype;
     sum(value)      |   type   | subtype  |
============================================
             11827688|delivrd   |delivrd   |
             55566578|send      |send      |
                  9317|undeliv   |BALANCE   |
                65219|undeliv   |DB:0107   |
              2077691|undeliv   |DB:0108   |
              2804417|undeliv   |IB:0008   |
             41730843|undeliv   |ID:0076   |
Query OK, 7 row(s) in set (0.732830s)

按天對type和subtype進行分組(zu)聚合查詢(xun):

taos> select sum(value) from jk.jiankong interval(1d) group by type, subtype;
           ts            |     sum(value)      |   type   | subtype  |
======================================================================
 19-11-18 00:00:00.000000|              1760800|delivrd   |delivrd   |
 19-11-19 00:00:00.000000|                14768|delivrd   |delivrd   |
 19-11-20 00:00:00.000000|              3290720|delivrd   |delivrd   |
 19-11-21 00:00:00.000000|              4973640|delivrd   |delivrd   |
 19-11-22 00:00:00.000000|              1787760|delivrd   |delivrd   |
 19-11-18 00:00:00.000000|             36976790|send      |send      |
 19-11-19 00:00:00.000000|               310128|send      |send      |
 19-11-20 00:00:00.000000|              9482760|send      |send      |
 19-11-21 00:00:00.000000|              6470940|send      |send      |
 19-11-22 00:00:00.000000|              2325960|send      |send      |
 19-11-18 00:00:00.000000|                 6200|undeliv   |BALANCE   |
 19-11-19 00:00:00.000000|                   52|undeliv   |BALANCE   |
 19-11-20 00:00:00.000000|                 1590|undeliv   |BALANCE   |
 19-11-21 00:00:00.000000|                 1085|undeliv   |BALANCE   |
 19-11-22 00:00:00.000000|                  390|undeliv   |BALANCE   |
 19-11-18 00:00:00.000000|                43400|undeliv   |DB:0107   |
 19-11-19 00:00:00.000000|                  364|undeliv   |DB:0107   |
 19-11-20 00:00:00.000000|                11130|undeliv   |DB:0107   |
 19-11-21 00:00:00.000000|                 7595|undeliv   |DB:0107   |
 19-11-22 00:00:00.000000|                 2730|undeliv   |DB:0107   |
 19-11-18 00:00:00.000000|              1382600|undeliv   |DB:0108   |
 19-11-19 00:00:00.000000|                11596|undeliv   |DB:0108   |
 19-11-20 00:00:00.000000|               354570|undeliv   |DB:0108   |
 19-11-21 00:00:00.000000|               241955|undeliv   |DB:0108   |
 19-11-22 00:00:00.000000|                86970|undeliv   |DB:0108   |
 19-11-18 00:00:00.000000|              1866200|undeliv   |IB:0008   |
 19-11-19 00:00:00.000000|                15652|undeliv   |IB:0008   |
 19-11-20 00:00:00.000000|               478590|undeliv   |IB:0008   |
 19-11-21 00:00:00.000000|               326585|undeliv   |IB:0008   |
 19-11-22 00:00:00.000000|               117390|undeliv   |IB:0008   |
 19-11-18 00:00:00.000000|             27769800|undeliv   |ID:0076   |
 19-11-19 00:00:00.000000|               232908|undeliv   |ID:0076   |
 19-11-20 00:00:00.000000|              7121610|undeliv   |ID:0076   |
 19-11-21 00:00:00.000000|              4859715|undeliv   |ID:0076   |
 19-11-22 00:00:00.000000|              1746810|undeliv   |ID:0076   |
Query OK, 35 row(s) in set (0.023865s)

此(ci)處interval是聚合(he)時(shi)間段(duan)的(de)長度, 最(zui)短(duan)時(shi)間間隔10毫秒(miao)(10a)

未建(jian)超級(ji)表時,對普(pu)通表進行分(fen)組聚合查詢,會報錯:

taos> select sum(value) from jk.jiankong group by type;
    TSDB error: invalid SQL: group by only available for STable query

 7.

我們(men)有另外一個(ge)需(xu)求,由于要監控的(de)靜態數據多達(da)幾百個(ge),而(er)且具有不確(que)定(ding)性(xing),所(suo)以無法全(quan)部在(zai)建庫、建表的(de)時候創建所(suo)有子表,這(zhe)個(ge)功能完全(quan)解決了我們(men)的(de)這(zhe)個(ge)問題(ti)。

以下是官網(wang)的文(wen)檔摘錄:

在某些特殊場景中,用戶在寫數據時并不確定某個設備的表是否存在,此時可使用自動建表語法來實現寫入數據時用超級表定義的表結構自動創建不存在的子表,若該表已存在則不會建立新表。
注(zhu)意(yi):自(zi)動(dong)建表(biao)(biao)語(yu)句只能自(zi)動(dong)建立子表(biao)(biao)而(er)不能建立超級(ji)表(biao)(biao),這就要求超級(ji)表(biao)(biao)已經被事先定義好。自(zi)動(dong)建表(biao)(biao)語(yu)法(fa)跟insert/import語(yu)法(fa)非(fei)常相似,唯一區別是語(yu)句中增加了超級(ji)表(biao)(biao)和標簽(qian)信息。具體語(yu)法(fa)如下(xia):

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

對(dui)比,用create創建(jian)子表:

create table jiankong_sub_send using jiankong tags ('send', 'send');

三、安裝和配置garafana

1. 安裝

在官網//grafana.com/grafana/download下(xia)載grafana的(de)rpm安裝(zhuang)包(bao)后(hou),進行(xing)安裝(zhuang):

rpm -ivh grafana-6.4.4-1.x86_64.rpm

2. copy TDengine的Grafana插件到Grafana的插件目錄

TDengine的Grafana插(cha)件在安裝包(bao)的/usr/local/taos/connector/grafana目錄(lu)下

cp -r /usr/local/taos/connector/grafana/tdengine/ /var/lib/grafana/plugins

3. 啟動Grafana

systemctl start grafana-server

4. 在瀏覽器中通過host:3000登錄Grafana服務器

默認(ren)用戶名(ming)和(he)密(mi)碼(ma)都是admin

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

5. 添加TDengine數據源

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫
使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

在最下方找到“TDengine”

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫
Name:“TDengine”(可以是其他名字)
Host:測試服務器地址“//192.168.8.66:6020”
User: 默認為“root”
Password:默認為“taosdata”
使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

測試一下:

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

6. 添加Folder

將相(xiang)同類(lei)型需(xu)要監控的(de)儀表盤(dashboard)放到一(yi)個Folder中

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

7. 添加Dashboard

進入(ru)剛才創(chuang)建(jian)的(de)Folder后,創(chuang)建(jian)Dashboard

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

INPUT處的sql語(yu)句,要注(zhu)意(yi)fill的位置,需要在group by前面,否則報錯

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

配置圖形顯示

可以根據需求進行曲線圖(tu),表(biao)格,儀表(biao)盤等(deng)的(de)選(xuan)擇(ze)

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫
使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

在這里(li)配置“曲線(xian)圖”,圖示(shi)下(xia)方是具體的(de)圖形顯示(shi)細(xi)則(ze),如:標線(xian)、是否填充,對顯示(shi)的(de)字段進行曲線(xian)顏色的(de)自(zi)定義等(deng)

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

給此儀表盤起(qi)個(ge)一看就懂的名(ming)字(zi):

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

 8. 配置了6個儀表盤

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

9. 無group by和有group by的實例

無group by,需(xu)要寫多條(tiao)sql,通過(guo)where條(tiao)件去區分,如果分類多就(jiu)很麻煩且不靈活(huo)

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

有group by,一條sql就解決問題了:

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

下圖(tu)是有無group by的(de)(de)曲線趨勢對(dui)比,可(ke)以(yi)看(kan)到是一模一樣的(de)(de)

使用開源的TDengine與開源的Grafana部署短信運營監測可視化平臺 - TDengine Database 時序數據庫

四、高級功能初探和一些聯想

1. —-用戶級別的預計算

TDengine的(de)“預計算”的(de)概念我覺得非常的(de)棒,官網文檔摘錄如下:

為有(you)效地提(ti)升查(cha)詢(xun)(xun)處理(li)的(de)(de)性能,針對物聯網(wang)數據(ju)(ju)(ju)的(de)(de)不(bu)可(ke)更(geng)改的(de)(de)特點,TDengine采(cai)用在每個(ge)保存的(de)(de)數據(ju)(ju)(ju)塊(kuai)上(shang),都(dou)記錄下該數據(ju)(ju)(ju)塊(kuai)中數據(ju)(ju)(ju)的(de)(de)最(zui)大(da)(da)值、最(zui)小(xiao)(xiao)(xiao)值、和等(deng)統計數據(ju)(ju)(ju)。如果查(cha)詢(xun)(xun)處理(li)涉(she)及整個(ge)數據(ju)(ju)(ju)塊(kuai)的(de)(de)全(quan)部數據(ju)(ju)(ju),則直接使用預計算結果,不(bu)再讀(du)取數據(ju)(ju)(ju)塊(kuai)的(de)(de)內(nei)容(rong)。由于預計算模(mo)塊(kuai)的(de)(de)大(da)(da)小(xiao)(xiao)(xiao)遠小(xiao)(xiao)(xiao)于磁盤上(shang)存儲的(de)(de)具體數據(ju)(ju)(ju)的(de)(de)大(da)(da)小(xiao)(xiao)(xiao),對于磁盤IO為瓶頸的(de)(de)查(cha)詢(xun)(xun)處理(li),使用預計算結果可(ke)以極大(da)(da)地減小(xiao)(xiao)(xiao)讀(du)取IO,并(bing)加速查(cha)詢(xun)(xun)處理(li)的(de)(de)流程(cheng)。

連續查詢的官網(wang)文(wen)檔摘錄如下:

基于滑動窗口的流式計算(Stream)
連(lian)續查詢(xun)是(shi)TDengine定期自(zi)動(dong)執(zhi)行的(de)(de)(de)查詢(xun),采用滑(hua)動(dong)窗(chuang)口(kou)的(de)(de)(de)方式(shi)進(jin)行計算(suan),是(shi)一種簡化的(de)(de)(de)時(shi)間(jian)驅(qu)動(dong)的(de)(de)(de)流式(shi)計算(suan)。針對庫中的(de)(de)(de)表或超級表,TDengine可(ke)提供定期自(zi)動(dong)執(zhi)行的(de)(de)(de)連(lian)續查詢(xun),用戶可(ke)讓TDengine推送查詢(xun)的(de)(de)(de)結(jie)果,也可(ke)以將(jiang)結(jie)果再(zai)寫回(hui)到(dao)TDengine中。每次執(zhi)行的(de)(de)(de)查詢(xun)是(shi)一個時(shi)間(jian)窗(chuang)口(kou),時(shi)間(jian)窗(chuang)口(kou)隨著時(shi)間(jian)流動(dong)向(xiang)前(qian)(qian)滑(hua)動(dong)。在定義連(lian)續查詢(xun)的(de)(de)(de)時(shi)候需要指(zhi)定時(shi)間(jian)窗(chuang)口(kou)(time window, 參(can)數interval )大小(xiao)和(he)每次前(qian)(qian)向(xiang)增量時(shi)間(jian)(forward sliding times, 參(can)數sliding)。

其中(zhong),將結果再寫回到TDengine中(zhong)的方式其實就(jiu)是一(yi)種用戶級別的預計算(suan),這樣由TDengine按照用戶定義的時(shi)間窗口和時(shi)間增量進行后臺的計算(suan),在用戶查詢數據的時(shi)候,直接從回寫的表中(zhong)讀取數據,速度就(jiu)會非(fei)常快。

創建連續查詢:

taos> create table test_stream_sum as select sum(value) from jiankong interval(20s) sliding(10s) group by type, subtype;
Query OK, 1 row(s) affected (0.000983s)

上述連續查詢,sql的select部分實際的輸出(chu)結果(guo)為:

taos> select sum(value) from jiankong interval(20s) group by type, subtype;
           ts            |     sum(value)      |   type   | subtype  |
======================================================================
 19-11-18 16:50:40.000000|                 9088|delivrd   |delivrd   |
 19-11-18 16:51:00.000000|                31808|delivrd   |delivrd   |
 19-11-18 16:51:20.000000|                15904|delivrd   |delivrd   |
 19-11-18 16:52:20.000000|                12212|delivrd   |delivrd   |
 19-11-18 16:52:40.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:53:00.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:53:20.000000|                31808|delivrd   |delivrd   |
 19-11-18 16:53:40.000000|                31240|delivrd   |delivrd   |
 19-11-18 16:54:00.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:54:20.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:54:40.000000|                31240|delivrd   |delivrd   |
 19-11-18 16:55:00.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:55:20.000000|                28400|delivrd   |delivrd   |
 19-11-18 16:55:40.000000|                31808|delivrd   |delivrd   |
 19-11-18 16:56:00.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:56:20.000000|                31240|delivrd   |delivrd   |
 19-11-18 16:56:40.000000|                31524|delivrd   |delivrd   |
 19-11-18 16:57:00.000000|                32092|delivrd   |delivrd   |
 19-11-18 16:57:20.000000|                31240|delivrd   |delivrd   |
 19-11-18 16:57:40.000000|                32092|delivrd   |delivrd   |
 19-11-18 16:58:00.000000|                31240|delivrd   |delivrd   |
 19-11-18 16:58:20.000000|                22720|delivrd   |delivrd   |
 19-11-18 16:50:40.000000|               190848|send      |send      |

自(zi)動創建(jian)的連續(xu)查詢的表中實(shi)際的數據為:

taos> select * from test_stream_sum;
           ts            |     sum_value_      |
================================================
 19-11-18 17:17:30.000000|                 2556|
 19-11-18 17:17:40.000000|                18460|
 19-11-18 17:17:50.000000|                15904|
 19-11-18 17:18:00.000000|                15620|
Query OK, 4 row(s) in set (0.000431s)

上述(shu)結果并(bing)不(bu)是期待(dai)的(de)結果,沒有(you)按(an)照我定義的(de)group by字段進行聚合查詢顯示。

于是github Issues, taos的攻城獅(shi)回復“連續查詢目(mu)前還不(bu)能很好的支持 group by,這個(ge)問題已經在我們的計劃列表(biao)里,后續會完(wan)善這方面的功能”,原(yuan)因是“因為這樣回寫(xie)后,新表(biao)的時間戳主(zhu)鍵可能出現相同(不(bu)同的group by字段(duan)會有相同的時間),就會沖突了,所以(yi)暫時不(bu)支持”。

雖然(ran)目前這個功(gong)能未達到(dao)我的預期,攻城(cheng)獅的回復還是聊以安慰,期待這個功(gong)能的完善。

2. 聯想

 TDengine的(de)設計初衷是(shi)服務于物聯(lian)網,有結構化和(he)時(shi)序的(de)特性,建(jian)議是(shi)和(he)時(shi)序密切的(de)數據(ju)可以(yi)用(yong)(yong),其他的(de)數據(ju)不(bu)建(jian)議使用(yong)(yong)。

從(cong)TDengine的架構設計、存(cun)儲等等,覺(jue)得不局限(xian)于百分之百的時序特性,有些明細查詢也是可以嘗(chang)試在TDengine中進行(xing)存(cun)儲的,后續會(hui)嘗(chang)試進行(xing)一(yi)下測試。