日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【转】TDengine踩坑随记(最后一次更新:2021-4-7 20:30)

發布時間:2023/12/13 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 【转】TDengine踩坑随记(最后一次更新:2021-4-7 20:30) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:https://www.cnblogs.com/quchunhui/p/13731825.html

------------------------------------------------------------------------

==背景==

在搭建工業物聯網的數據平臺,用來完成設備連接以及數據存儲等,

以支持上層的應用及數據分析等。目前使用的是mq→flink→influxdb的基本套路。

雖然說InfluxDB的性能和功能都非常的棒,特別是連續查詢對性能的支撐,

不過由于influxdb使用的是社區版,存在單點故障的問題,總之不是長久直接。

于是打算嘗試驗證一下陶老師的TDEngine。祝自己一切順利。

==環境==

服務器節點數:3個(VMware虛擬機)

操作系統:Linux Centos8 64位

TDengine版本:2.0.4(2020年10月16日,使用版本換成了2.0.5.1)

JDK:1.8.0_77

JDBC客戶端版本建議:

tdengine:2.0.10.0,jdbc版本:2.0.15

tdengine:2.0.15.0,jdbc版本:2.0.18

==下載==

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

TDengine-server-2.0.4.0-Linux-x64.rpm
TDengine-client-2.0.4.0-Linux-x64.tar.gz
TDengine-alert-2.0.4.0-Linux-x64.tar.gz

==測試代碼==

所有程序的測試代碼放到了git上,需要的自取。

https://github.com/quchunhui/java-demo/tree/master/tdengine

==集群部署==

參考官網:https://www.taosdata.com/cn/documentation/cluster/

PS:中文文檔是真的很爽,比看英文省心多了。

1、安裝server

上傳到服務器,并復制到各個節點,在各個節點執行rpm安裝命令

命令:rpm -ivh TDengine-server-2.0.4.0-Linux-x64.rpm

【小插曲】

在另一個集群上安裝新的版本(2.0.7.0)的時候,發現如論如何也無法使新增加的節點上線,

后來看了新版本的文檔,上面提示:在增加新的節點時,先不要啟動taosd,安裝時,提示輸入是否要加入一個已經存在的TDengine集群時,第一個物理節點直接回車創建新集群,后續物理節點則輸入該集群任何一個在線的物理節點的FQDN:端口號(默認6030);

2、修改配置

配置文件路徑:/etc/taos/taos.cfg

配置文件說明:TDengine的運營與維護

按照官網的提示,修改了幾個配置:firstEp、secondEp、fqdn、serverPort、logDir、dataDir、replica。

根據官網的說明,我羅列了配置的中文,供參考。沒有寫的是在這個版本的官網上沒有找到的了。

########################################################
#                                                      #
#                  TDengine Configuration              #
#   Any questions, please email support@taosdata.com   #
#                                                      #
########################################################

# first fully qualified domain name (FQDN) for TDengine system
# taosd啟動時,主動連接的集群中第一個dnode的end point, 默認值為localhost:6030。
firstEp               vm1:6030

# second fully qualified domain name (FQDN) for TDengine system, for cluster only
# taosd啟動時,如果first連接不上,嘗試連接集群中第二個dnode的end point, 默認值為空。
secondEp              vm2:6030

# local fully qualified domain name (FQDN)
# 數據節點的FQDN,缺省為操作系統配置的第一個hostname。如果習慣IP地址訪問,可設置為該節點的IP地址。
fqdn                  vm1

# first port number for the connection (12 continuous UDP/TCP port number are used) 
# taosd啟動后,對外服務的端口號,默認值為6030。
serverPort            6030

# log file's directory
# 日志文件目錄,客戶端和服務器的運行日志文件將寫入該目錄。默認值:/var/log/taos。
logDir                /home/radmin/data/tdengine/log

# data file's directory
# 數據文件目錄,所有的數據文件都將寫入該目錄。默認值:/var/lib/taos。
dataDir               /home/radmin/data/tdengine/data

# the arbitrator's fully qualified domain name (FQDN) for TDengine system, for cluster only   
# 系統中裁決器的end point, 缺省值為空。
# arbitrator            arbitrator_hostname:6042     

# number of threads per CPU core
# numOfThreadsPerCore   1.0

# number of management nodes in the system
# 系統中管理節點個數。默認值:3。
# numOfMnodes           3

# enable/disable backuping vnode directory when removing dnode
# vnodeBak              1

# enable/disable load balancing
# 是否啟動負載均衡。0:否,1:是。默認值:1。
# balance               1

# role for dnode. 0 - any, 1 - mnode, 2 - dnode
# dnode的可選角色。0-any; 既可作為mnode,也可分配vnode;1-mgmt;只能作為mnode,不能分配vnode;2-dnode;不能作為mnode,只能分配vnode
# role                  0

# max timer control blocks
# maxTmrCtrl            512

# time interval of system monitor, seconds 
# monitorInterval       30

# number of seconds allowed for a dnode to be offline, for cluster only 
# dnode離線閾值,超過該時間將導致該dnode從集群中刪除。單位為秒,默認值:86400*10(即10天)。
# offlineThreshold      8640000

# RPC re-try timer, millisecond
# rpcTimer              300

# RPC maximum time for ack, seconds. 
# rpcMaxTime            600

# time interval of dnode status reporting to mnode, seconds, for cluster only 
# statusInterval        1

# time interval of heart beat from shell to dnode, seconds
# shellActivityTimer    3

# time of keeping table meta data in cache, seconds
# tableMetaKeepTimer    7200

# minimum sliding window time, milli-second
# minSlidingTime        10

# minimum time window, milli-second
# minIntervalTime       10

# maximum delay before launching a stream compution, milli-second
# maxStreamCompDelay    20000

# maximum delay before launching a stream computation for the first time, milli-second
# maxFirstStreamCompDelay   10000

# retry delay when a stream computation fails, milli-second
# retryStreamCompDelay      10

# the delayed time for launching a stream computation, from 0.1(default, 10% of whole computing time window) to 0.9
# streamCompDelayRatio      0.1

# max number of vgroups per db, 0 means configured automatically
# 每個數據庫中能夠使用的最大vnode個數。
# maxVgroupsPerDb           0

# max number of tables per vnode
# 每個vnode中能夠創建的最大表個數。默認值:1000000。
# maxTablesPerVnode         1000000

# step size of increasing table number in a vnode
# tableIncStepPerVnode      1000

# cache block size (Mbyte)
# cache                     16

# number of cache blocks per vnode
# blocks                    6

# number of days per DB file
# 一個數據文件存儲數據的時間跨度,單位為天,默認值:10。
# days                  10

# number of days to keep DB file
# 數據庫中數據保留的天數,單位為天,默認值:3650。
# keep                  3650

# minimum rows of records in file block
# 文件塊中記錄的最小條數,單位為條,默認值:100。
# minRows               100

# maximum rows of records in file block
# 文件塊中記錄的最大條數,單位為條,默認值:4096。
# maxRows               4096

# enable/disable compression
# 文件壓縮標志位,0:關閉,1:一階段壓縮,2:兩階段壓縮。默認值:2。
# comp                  2

# write ahead log (WAL) level, 0: no wal; 1: write wal, but no fysnc; 2: write wal, and call fsync
# WAL級別。1:寫wal, 但不執行fsync; 2:寫wal, 而且執行fsync。默認值:1。
# walLevel              1

# if walLevel is set to 2, the cycle of fsync being executed, if set to 0, fsync is called right away
# 當wal設置為2時,執行fsync的周期。設置為0,表示每次寫入,立即執行fsync。單位為毫秒,默認值:3000。
# fsync                 3000

# number of replications, for cluster only 
# 副本個數,取值范圍:1-3。單位為個,默認值:1
replica               3

# mqtt hostname  
# mqttHostName          test.mosquitto.org

# mqtt port  
# mqttPort              1883

# mqtt topic
# mqttTopic             /test

# the compressed rpc message, option:
#  -1 (no compression)
#   0 (all message compressed),
# > 0 (rpc message body which larger than this value will be compressed)
# compressMsgSize       -1

# max length of an SQL
# 單條SQL語句允許最長限制。默認值:65380字節。
maxSQLLength          1048576

# the maximum number of records allowed for super table time sorting
# maxNumOfOrderedRes    100000

# system time zone
# 默認值:從系統中動態獲取當前的時區設置
# timezone              Asia/Shanghai (CST, +0800)

# system locale
# 默認值:系統中動態獲取,如果自動獲取失敗,需要用戶在配置文件設置或通過API設置
# locale                en_US.UTF-8

# default system charset
# 默認值:系統中動態獲取,如果自動獲取失敗,需要用戶在配置文件設置或通過API設置
# charset               UTF-8

# max number of connections allowed in dnode
# maxShellConns         5000

# max numerber of connections allowed in client 
# maxConnections        5000

# stop writing logs when the disk size of the log folder is less than this value
# minimalLogDirGB       0.1

# stop writing temporary files when the disk size of the log folder is less than this value
# minimalTmpDirGB       0.1

# stop writing data when the disk size of the log folder is less than this value
# minimalDataDirGB      0.1

# enbale/disable http service
# http                  1

# enable/disable muqq service
# mqtt                  0

# enable/disable system monitor 
# monitor               1

# enable/disable recording the SQL statements via restful interface
# httpEnableRecordSql   0

# number of threads used to process http requests
# httpMaxThreads        2

# maximum number of rows returned by the restful interface
# restfulRowLimit       10240

# The following parameter is used to limit the maximum number of lines in log files.
# max number of rows per log filters
# 單個日志文件允許的最大行數。默認值:10,000,000行。
# numOfLogLines         10000000

# time of keeping log files, days
# 日志文件的最長保存時間。大于0時,日志文件會被重命名為taosdlog.xxx,其中xxx為日志文件最后修改的時間戳,單位為秒。默認值:0天。
# logKeepDays           0

# enable/disable async log
# asyncLog              1

# The following parameters are used for debug purpose only.
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
# 131: output warning and error, 135: output debug, warning and error, 143 : output trace, debug, warning and error to log.
# 199: output debug, warning and error to both screen and file
# 207: output trace, debug, warning and error to both screen and file

# debug flag for all log type, take effect when non-zero value
# debugFlag             0

# debug flag for meta management messages
# mDebugFlag            135

# debug flag for dnode messages
# dDebugFlag            135

# debug flag for sync module
# sDebugFlag            135

# debug flag for WAL
# wDebugFlag            135

# debug flag for SDB
# sdbDebugFlag          135

# debug flag for RPC 
# rpcDebugFlag          131

# debug flag for TAOS TIMER
# tmrDebugFlag          131

# debug flag for TDengine client 
# cDebugFlag            131

# debug flag for JNI
# jniDebugflag          131

# debug flag for ODBC
# odbcDebugflag         131

# debug flag for storage
# uDebugflag            131

# debug flag for http server
# httpDebugFlag         131

# debug flag for mqtt
# mqttDebugFlag         131

# debug flag for monitor
# monitorDebugFlag      131

# debug flag for query
# qDebugflag            131

# debug flag for vnode
# vDebugflag            131

# debug flag for http server
# tsdbDebugFlag         131

# enable/disable recording the SQL in taos client
# tscEnableRecordSql    0

# generate core file when service crash
# enableCoreFile        1

# maximum display width of binary and nchar fields in the shell. The parts exceeding this limit will be hidden
# maxBinaryDisplayWidth 30

PS:到此的感受:

總體感覺TDengine的安裝非常容易,配置文件也簡單易懂,到此體驗良好。

==啟動==

1、啟動第1個節點

命令:systemctl start taosd

2、驗證第1個節點是否啟動成功

命令:taos

命令:show dnodes;

3、啟動后續數據節點

先將后兩個節點的服務啟動起來。

在每個節點執行:systemctl start taosd

確認服務狀態:systemctl status taosd

如下圖,第2個節點的服務正常:

第3個節點的服務正常:

【小插曲】

在啟動第2個節點的時候報錯,

[root@vm2 ~]# systemctl status taosd
● taosd.service - TDengine server service
   Loaded: loaded (/etc/systemd/system/taosd.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Tue 2020-09-29 20:38:20 UTC; 2s ago
  Process: 5095 ExecStart=/usr/bin/taosd (code=exited, status=1/FAILURE)
 Main PID: 5095 (code=exited, status=1/FAILURE)

Sep 29 20:38:20 vm2 systemd[1]: taosd.service: main process exited, code=exited, status=1/FAILURE
Sep 29 20:38:20 vm2 systemd[1]: Unit taosd.service entered failed state.
Sep 29 20:38:20 vm2 systemd[1]: taosd.service failed.
Sep 29 20:38:20 vm2 systemd[1]: taosd.service holdoff time over, scheduling restart.
Sep 29 20:38:20 vm2 systemd[1]: Stopped TDengine server service.
Sep 29 20:38:20 vm2 systemd[1]: start request repeated too quickly for taosd.service
Sep 29 20:38:20 vm2 systemd[1]: Failed to start TDengine server service.
Sep 29 20:38:20 vm2 systemd[1]: Unit taosd.service entered failed state.
Sep 29 20:38:20 vm2 systemd[1]: taosd.service failed.

【原因】

沒有創建log和data的文件路徑,在第2個和第3個節點上分別創建兩個路徑

mkdir -p /home/radmin/data/tdengine/log

mkdir -p /home/radmin/data/tdengine/data

4、添加節點

在第一個數據節點,使用CLI程序taos, 登錄進TDengine系統, 執行命令:

CREATE DNODE "vm2:6030";
CREATE DNODE "vm3:6030";

查看新的節點是否加入進來。

【小插曲】

執行show dnodes;之后,發現vm2這個節點處于offline狀態。按照官網提示的方法:

查看日志中提示如下錯誤:

09/29 20:59:55.055274 0x7fcb0aae7700 DND ERROR status rsp is received, error:Cluster cfg inconsistent
09/29 20:59:56.060418 0x7fcb0aae7700 DND ERROR status rsp is received, error:Cluster cfg inconsistent
09/29 20:59:57.065157 0x7fcb0aae7700 DND ERROR status rsp is received, error:Cluster cfg inconsistent

【原因】

經過群里的咨詢,有朋友建議排查一下時區是否一致,經排查第2個節點的時區確實與另外兩個不一致。

修改了一下時區之后,從新啟動第2個節點,發現狀態恢復正常。修改時區命令:

mv /etc/localtime /etc/localtime.bak
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locaktime

【小插曲2】

解決了上面的小插曲,非常的開心,合上筆記本電腦回家。

回家之后,重新連接上服務器,查看狀態,結果發現第2個節點的狀態又變成offline了,真是開心不過3分鐘啊。

【原因】

發現時間貌似不同步??磥硎菚r候加上NTP時間同步了。按照以下步驟嘗試了一下

1)停掉taos服務

2)配置ntp同步(參考我的另一篇博客:Linux配置ntp時間服務器)

3)重啟taos服務

重啟之后,第2個節點的狀態恢復為ready,開森。

為了以防萬一,將系統放置了一整夜,第2天早上起來查看集群狀態,依然是正常的,這下才算放心。

【感謝道友】

5、數據節點管理命令

添加數據節點:CREATE DNODE "fqdn:port"; 
刪除數據節點:DROP DNODE "fqdn:port";
查看數據節點:SHOW DNODES;

PS:到此的感受

TDengine的集群部署也非常的簡單,比傳統的HBase,MongoDB之類的簡單的多,感受不錯。

唯一比較大的遺憾是,目前的社區版不支持多級存儲,我們實際項目中磁盤是插滿的,

如果要利用磁盤空間,就必須要加上lvm,但是lvm會影響讀寫速度,對已經存在的hdfs也有一些影響。

6、集群卸載

因為是用rpm的格式安裝的,目前用的是yum remove來卸載,不清楚是否為最佳卸載方式。

systemctl stop taosd

rpm -qa | grep TD

yum removeTDengine-2.0.5.0-3.x86_64

2020年11月10日

卸載了2.0.5.0版本,重新安裝了2.0.7.0版本,和上面的步驟一樣

1、停止集群

2、卸載td

3、沖洗安裝

【小插曲】

在這次重新安裝的時候,遇到了下面的問題。在Git上提了issue:https://github.com/taosdata/TDengine/issues/4168

說是需要安裝python環境,可是我又沒有用到python,而且2.0.5.0的時候還沒有這個問題。

所以,tdengine的版本更新是不是太快了,導致一些問題沒能充分測試呢?

error: Failed dependencies:
    /usr/bin/python is needed by tdengine-2.0.7.0-3.x86_64

解決過程:

按照提示,安裝了3.8.6版本的python,并確認了python安裝沒有問題,嘗試重新安裝tdengine,仍然報了同樣的錯誤,

后來和官方的人員確認過了,應該是官網放的release包有點問題,他們重新更新了一個包之后就可以了,

而且不需要安裝python,不需要安裝python,不需要安裝python。

==TAOS SQL==

官網提供了完整的文檔,官網地址:https://www.taosdata.com/cn/documentation20/taos-sql/

我個人習慣了逐個嘗試驗證一遍,以加深印象,好記性不如爛筆頭。

另外,可以通過官方提供的樣例數據創建一些表供驗證。

命令:taosdemo(注意,需要預留大約2.1GB的存儲空間)

1、數據庫管理

#創建庫:
#COMP參數是指修改數據庫文件壓縮標志位,取值范圍為[0, 2]. 0表示不壓縮,1表示一階段壓縮,2表示兩階段壓縮。
#REPLICA參數是指修改數據庫副本數,取值范圍[1, 3]。在集群中使用,副本數必須小于dnode的數目。
#KEEP參數是指修改數據文件保存的天數,缺省值為3650,取值范圍[days, 365000],必須大于或等于days參數值。
#QUORUM參數是指數據寫入成功所需要的確認數。取值范圍[1, 3]。對于異步復制,quorum設為1,具有master角色的虛擬節點自己確認即可。對于同步復制,需要至少大于等于2。原則上,Quorum >=1 并且 Quorum <= replica(副本數),這個參數在啟動一個同步模塊實例時需要提供。
#BLOCKS參數是每個VNODE (TSDB) 中有多少cache大小的內存塊,因此一個VNODE的用的內存大小粗略為(cache * blocks)。取值范圍[3, 1000]。
#DAYS一個數據文件存儲數據的時間跨度,單位為天,默認值:10。
create database mydb keep 365 days 10 blocks 4; #創建庫(如果不存在): create database if not exists mydb keep 365 days 10 blocks 4; #使用庫: use mydb; #刪除庫: drop database mydb; #刪除庫(如果存在): drop database if exists mydb; #顯示所有數據庫: show databases; #修改數據庫文件壓縮標志位: alter database mydb comp 2; #修改數據庫副本數: alter database mydb replica 2; #修改數據文件保存的天數: alter database mydb keep 365; #修改數據寫入成功所需要的確認數: alter database mydb quorum 2; #修改每個VNODE (TSDB) 中有多少cache大小的內存塊: alter database mydb blocks 100;

2、表管理

#創建表(搞了個包含所有數據類型的表):
create table if not exists mytable(time timestamp, intfield int, bigintfield bigint, floatfield float, doublefield double, binaryfield binary(20), smallintfield smallint, tinyintfield tinyint, boolfield bool, ncharfiel
d nchar(50));

#刪除數據表
drop table if exists mytable;

#顯示當前數據庫下的所有數據表信息
show tables;

#顯示當前數據庫下的所有數據表信息
#可在like中使用通配符進行名稱的匹配。通配符匹配:1)’%’ (百分號)匹配0到任意個字符;2)’_’下劃線匹配一個字符。
show tables like "%my%";

#獲取表的結構信息
describe mytable;

#表增加列
alter table mytable add column addfield int;

#表刪除列
alter table mytable drop column addfield;

注意:表名一定不要用數字開頭,官方文檔明確提醒了。

3、超級表管理

#創建超級表
#創建STable, 與創建表的SQL語法相似,但需指定TAGS字段的名稱和類型。說明:
#1) TAGS 列的數據類型不能是timestamp類型;
#2) TAGS 列名不能與其他列名相同;
#3) TAGS 列名不能為預留關鍵字;
#4) TAGS 最多允許128個,可以0個,總長度不超過16k個字符
create table if not exists mysupertable (time timestamp, intfield int, bigintfield bigint, floatfield float, doublefield double, binaryfield binary(20), smallintfield smallint, tinyintfield tinyint, boolfield bool, nch
arfield nchar(50)) TAGS (product nchar(50), device nchar(100));

#刪除超級表
drop table if exists mysupertable;

#顯示當前數據庫下的所有超級表信息
show stables like "%super%";

#獲取超級表的結構信息
describe mysupertable;

#超級表增加列
alter table mysupertable add column addfield int;

#超級表刪除列
alter table mysupertable drop column addfield;

#添加標簽
alter table mysupertable add tag devicetype nchar(60);

#刪除標簽
alter table mysupertable drop tag devicetype;

#修改標簽名
alter table mysupertable change tag product productKey;

#修改子表標簽值
#說明:除了更新標簽的值的操作是針對子表進行,其他所有的標簽操作(添加標簽、刪除標簽等)均只能作用于STable,不能對單個子表操作。對STable添加標簽以后,依托于該STable建立的所有表將自動增加了一個標簽,所有新增標簽的默認值都是NULL。
alter table mysupertable set tag productkey="abc";

【小插曲】

執行了一個下面的創建超級表的語句(通過自己寫的程序生成的),結果報錯

SQL語句:create table if not exists AI_PICK_UDATA ( time timestamp, data double ) tags ( productKey binary(256),deviceName binary(256),pointId binary(256),name binary(256),dataType binary(256),min binary(256),max binary(256),step binary(256),unit binary(256),description binary(256) );

提示錯誤:DB error: invalid SQL: invalid tag name

【問題原因】

創建表的語句中有tdengine的保留字段,如min,max。

但是官方文檔上并沒有對此進行相關介紹,吐槽一下文檔。

4、數據插入

#插入一條數據
insert into mytable values(now, 1, 2, 3, 4, 0, 6, 7, 1, "s");

#插入一條記錄,數據對應到指定的列
insert into mytable(time, intfield, bigintfield, floatfield, doublefield, binaryfield, smallintfield, tinyintfield, boolfield, ncharfield) values(now, 1, 2, 3, 4, 0, 6, 7, 1, "s");

#插入多條記錄
insert into mytable values(now, 1, 2, 3, 4, 0, 6, 7, 1, "s") (now, 2, 3, 4, 5, 6, 7, 8, 0, "t");

#按指定的列插入多條記錄
insert into mytable(time, intfield, bigintfield, floatfield, doublefield, binaryfield, smallintfield, tinyintfield, boolfield, ncharfield) values(now, 1, 2, 3, 4, 0, 6, 7, 1, "s") (now, 2, 3, 4, 5, 6, 7, 8, 0, "t");

#向多個表插入多條記錄(本人沒有驗證此語句)
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_value2, ...) tb2_name (tb2_field1_name, ...) VALUES (field1_value1, ...) (field1_value2, ...);

【小插入】

插入多條記錄的時候,語句中寫的是兩條數據,實際上只插入了一條

插入語句:

insert into mytable(time, intfield, bigintfield, floatfield, doublefield, binaryfield, smallintfield, tinyintfield, boolfield, ncharfield) values(now, 1, 2, 3, 4, 0, 6, 7, 1, "s") (now, 2, 3, 4, 5, 6, 7, 8, 0, "t");

【原因】

需要使用不同的時間戳,如果兩條語句都使用now,時間戳一樣,最終只能插入一條。

【感謝道友】

5、數據查詢

查詢語法:

SELECT select_expr [, select_expr ...]
    FROM {tb_name_list}
    [WHERE where_condition]
    [INTERVAL (interval_val [, interval_offset])]
    [FILL fill_val]
    [SLIDING fill_val]
    [GROUP BY col_list]
    [ORDER BY col_list { DESC | ASC }]    
    [SLIMIT limit_val [, SOFFSET offset_val]]
    [LIMIT limit_val [, OFFSET offset_val]]
    [>> export_file]

==查詢語句==

查詢語法:

SELECT select_expr [, select_expr ...]
    FROM {tb_name_list}
    [WHERE where_condition]
    [INTERVAL (interval_val [, interval_offset])]
    [FILL fill_val]
    [SLIDING fill_val]
    [GROUP BY col_list]
    [ORDER BY col_list { DESC | ASC }]    
    [SLIMIT limit_val [, SOFFSET offset_val]]
    [LIMIT limit_val [, OFFSET offset_val]]
    [>> export_file]

常用查詢語句樣例:

#查詢表中的所有字段
select * from t_znsllj001;
#按照時間戳查詢表中的所有字段
select * from t_znsllj001 where time > "2020-10-10 22:23:08.728";
#按照時間戳查詢超級表中的所有字段
select * from st_znsllj where time > "2020-10-10 22:23:08.728";
#查詢超級表中的指定字段
select time, forwardintegratedflow, product from st_znsllj;
#按照標簽值查詢超級表中的指定字段
select time, forwardintegratedflow, product from st_znsllj where product = "product1";
#查詢結果按照時間倒序排序
select time, forwardintegratedflow, product from st_znsllj where product = "product1" order by time desc;
#結果集列名重命名
select time, forwardintegratedflow as ff, product from st_znsllj;
#查詢超級表數據并附帶表名(TBNAME: 在超級表查詢中可視為一個特殊的標簽,代表查詢涉及的子表名,不區分大小寫)
select tbname, * from st_znsllj;
#查詢超級表的表名及第一列
 select tbname, _c0 from st_znsllj;

#獲取當前所在的數據庫
select database();
#獲取客戶端版本號
select client_version()
#獲取服務器版本號
select server_version();
#服務器狀態檢測語句
select server_status()

#統計超級表下轄子表數量
select count(tbname) from st_znsllj;

==用戶管理==

#創建用戶,并指定用戶名和密碼,密碼需要用單引號引起來,單引號為英文半角
create user admin pass 'admin123';

#刪除用戶,限root用戶使用
drop user admin;

#修改用戶密碼, 為避免被轉換為小寫,密碼需要用單引號引用,單引號為英文半角
alter user admin pass 'admin1234';

#修改用戶權限為:super/write/read。 為避免被轉換為小寫,密碼需要用單引號引用,單引號為英文半角
#語法:ALTER USER <user_name> PRIVILEGE <super|write|read>;
alter user admin privilege read;

如果修改了root密碼之后,進入命令行的命令就需要加上密碼的參數了。

可以通過taos --usage查看命令行的參數格式:

如:修改了密碼之后,可以通過以下命令來登錄命令行

taos --user=root -p'RexelRoot!@#'

==Java連接==

官網地址:https://www.taosdata.com/cn/documentation/connector-java/

1、maven配置

<dependency>
  <groupId>com.taosdata.jdbc</groupId>
  <artifactId>taos-jdbcdriver</artifactId>
  <version>2.0.4</version>
</dependency>

2、JDBC連接樣例

【TdUtils.java】

單例工具類,實現創建連接等通用方法。

package com.rexel.tdengine.utils;

import com.taosdata.jdbc.TSDBDriver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @ClassName TdUtils
 * @Description TDengine共通類
 * @Author: chunhui.qu
 * @Date: 2020/9/30
 */
public class TdUtils {
    private Connection connection = null;

    /**
     * 構造函數
     */
    private TdUtils() {
        // do nothing
    }

    /**
     * 單例模式
     */
    private static class SingletonInstance {
        private static final TdUtils INSTANCE = new TdUtils();
    }

    /**
     * 獲取對象句柄
     */
    public static TdUtils getInstance() {
        return SingletonInstance.INSTANCE;
    }

    public Connection getConnection() {
        if (connection != null) {
            return connection;
        }

        try {
            Class.forName("com.taosdata.jdbc.TSDBDriver");
            String jdbcUrl = "jdbc:TAOS://rexel-ids001:6030/qch_test?user=root&password=taosdata";
            Properties connProps = new Properties();
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_CONFIG_DIR, "C:\TDengine\cfg");
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
            connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "Asia/Shanghai");
            connection = DriverManager.getConnection(jdbcUrl, connProps);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

        return connection;
    }
}

【CreateDatabase.java】

創建數據的樣例程序。

package com.rexel.tdengine.api;

import com.rexel.tdengine.utils.TdUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @ClassName CreateDatabase
 * @Description CreateDatabase
 * @Author: chunhui.qu
 * @Date: 2020/9/30
 */
public class CreateDatabase {
    public static void main(String[] args) throws SQLException {
        TdUtils tdUtils = TdUtils.getInstance();
        Connection conn = tdUtils.getConnection();
        if (conn == null) {
            return;
        }
        System.out.println("get connection");

        Statement stmt = conn.createStatement();
        if (stmt == null) {
            return;
        }
        stmt.executeUpdate("create database if not exists javatestdb");
        System.out.println("create database");
        stmt.executeUpdate("use javatestdb");
        System.out.println("use database");
        stmt.executeUpdate("create table if not exists javatesttable (ts timestamp, temperature int, humidity float)");
        System.out.println("create table");
    }
}

【小插曲1】

寫完了測試代碼,在執行的時候報錯:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no taos in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.taosdata.jdbc.TSDBJNIConnector.<clinit>(TSDBJNIConnector.java:25)
    at com.taosdata.jdbc.TSDBDriver.connect(TSDBDriver.java:133)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at com.rexel.tdengine.utils.TdUtils.getConnection(TdUtils.java:54)
    at com.rexel.tdengine.api.CreateDatabase.main(CreateDatabase.java:17)
Disconnected from the target VM, address: '127.0.0.1:54954', transport: 'socket'

【解決過程】

重新看了一下官方文檔,懷疑是沒有安裝Window客戶端,嘗試安裝客戶端程序。

安裝文件:TDengine-client-2.0.4.0-Windows-x64.exe

重新執行程序之后,報了另一個錯誤:

java.sql.SQLException: TDengine Error: Invalid timestamp
    at com.taosdata.jdbc.TSDBJNIConnector.connect(TSDBJNIConnector.java:100)
    at com.taosdata.jdbc.TSDBConnection.connect(TSDBConnection.java:64)
    at com.taosdata.jdbc.TSDBConnection.<init>(TSDBConnection.java:56)
    at com.taosdata.jdbc.TSDBDriver.connect(TSDBDriver.java:135)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at com.rexel.tdengine.utils.TdUtils.getConnection(TdUtils.java:54)
    at com.rexel.tdengine.api.CreateDatabase.main(CreateDatabase.java:17)

網友說可能是因為客戶端的時間與服務器時間相差比較多的原因,

于是調整了服務器的時間。命令如下,調整之后,重啟了一下服務器

修改系統時間:date --set "09/30/20 14:15"
系統時間向硬件同步:clock --show

重新運行程序,正確執行。感謝網友的幫助。

【感謝道友】

【小插曲2】

本來運行的好好的,debug也都沒有問題,但是下午去酒店再debug測試,就提示“Unable to establish connection”

按照官網的FAQ提示,一頓檢查,沒有發現什么問題,非常迷惑。

后來想到由于服務器用的是阿里云ECS,需要配置網絡安全組的IP地址白名單,

我配置的時候只配置了TCP,沒有配置UDP,配置上了UCP的權限之后,debug就恢復正常了。

3、插入數據樣例

我這里寫了一個JSON字符串轉換為SQL,并持續插入的樣例。

package com.rexel.tdengine.api;

import com.alibaba.fastjson.JSONObject;
import com.rexel.tdengine.utils.TdUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * @ClassName CreateDatabase
 * @Description CreateDatabase
 * @Author: chunhui.qu
 * @Date: 2020/10/12
 */
public class InsertJson {
    public static void main(String[] args) throws SQLException {
        TdUtils tdUtils = TdUtils.getInstance();
        Connection conn = tdUtils.getConnection();
        if (conn == null) {
            return;
        }
        System.out.println("get connection");

        Statement stmt = conn.createStatement();
        if (stmt == null) {
            return;
        }

        List<String> aiList = new ArrayList<String>(){{
            add("AI_PICK_UDATA");
            add("AI_PROD_NPER");
            add("AI_PROD_NPICK");
            add("AI_PRODUCT_EFF");
            add("AI_PRODUCT_QUANTITY");
            add("AI_PRODUCT_TIME_MIN");
            add("AI_PROD_NPRODING");
        }};
        List<String> diList = new ArrayList<String>(){{
            add("DI_BELOWCLOSTS");
            add("DI_BELOWOPNSTS");
            add("DI_CANDY_OUTBEELINEA");
            add("DI_CANDY_OUTBEELINEB");
            add("DI_CANDY_OUTBEELINEC");
            add("DI_CHUCKCLOSTS");
            add("DI_CHUCKOPNSTS");
            add("DI_COVERCLOSTS");
            add("DI_COVEROPNSTS");
            add("DI_CTNCLO_BSTART");
            add("DI_CTNOPN_BSTART");
            add("DI_DENSO_BAUTOST");
            add("DI_DENSO_BERROR");
            add("DI_DENSO_BMOTORONST");
            add("DI_DENSO_BREADY");
            add("DI_DENSO_BRUNNING");
            add("DI_EPSON_BERROR");
            add("DI_EPSON_BESTOPON");
            add("DI_EPSON_BMOTORONST");
            add("DI_EPSON_BREADY");
            add("DI_EPSON_BRUNNING");
            add("DI_LEFTPUSHCLOSTS");
            add("DI_LEFTPUSHOPNSTS");
            add("DI_PRINT_BRUNNING");
            add("DI_RIGHTCLOSTS");
            add("DI_RIGHTOPNSTS");
            add("DI_RIGHTPUSHCLOSTS");
            add("DI_RIGHTPUSHLOPN");
            add("DI_RLCLOSTS");
            add("DI_RLOPNSTS");
            add("DI_ROBOT1_BLINKSTS");
            add("DI_ROBOT1_BSTART");
            add("DI_ROBOT2_BLINKSTS");
            add("DI_ROBOT2TOSTOR");
            add("DI_ROBOT2TOWAI");
            add("DI_SYS_BRUNNING");
            add("DI_TOPCLOSTS");
            add("DI_TOPOPNSTS");
            add("DI_UPDOWNCLOSTS");
            add("DI_UPDOWNOPNSTS");
            add("DI_BBELTSENSOROVT");
            add("DI_BCTNCLOCOOPNOVT");
            add("DI_BCTNCLORCLOOVT");
            add("DI_BCTNCLOROPNOVT");
            add("DI_BCTNCLOTCLOOVT");
            add("DI_BCTNCLOTOPNOVT");
            add("DI_BCTNOVT");
            add("DI_BELOWVALCLOOVT");
            add("DI_BELOWVALOPNOVT");
            add("DI_BROBOT2VALCLOVT");
            add("DI_BROBOT2VALOPOVT");
            add("DI_BRTSUCKEROVT");
            add("DI_BVALCOVERCLOOVT");
            add("DI_CHUCJVALCLOOVT");
            add("DI_CHUCJVALOPOVT");
            add("DI_CHUCKVALOPNOVT");
            add("DI_DENSOBERROR");
            add("DI_EPSONBERROR");
            add("DI_INSENCTNALARM");
            add("DI_LEFTNEWVALCLOVT");
            add("DI_RLNEWOPVALOPOVT");
            add("DI_RLNEWVALCLOOVT");
            add("DI_UPDOWNNVALCLOVT");
            add("DI_UPDOWNNVALOPOVT");
        }};

        int count = 0;
        while(true) {
            Random intRandom = new Random();
            JSONObject demoJson = new JSONObject();
            demoJson.put("table", "device_data_up");
            demoJson.put("time", System.currentTimeMillis());
            JSONObject tagJson = new JSONObject();
            tagJson.put("productKey", "a1B6t6ZG6oR");
            tagJson.put("deviceName", "QCHTestDevice1");
            demoJson.put("tags", tagJson);
            JSONObject dataJson = new JSONObject();
            aiList.forEach(field -> dataJson.put(field, intRandom.nextInt(10000)));
            diList.forEach(field -> dataJson.put(field, intRandom.nextInt(2)));
            demoJson.put("datas", dataJson);

            String sql = jsonToSql(demoJson);

            stmt.executeUpdate(sql);
            count ++;
            System.out.println("executeUpdate. count=" + count + ", sql=" + sql);

            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static String jsonToSql(JSONObject jsonObject) {
        String sql = "insert into {table} ({fields}) values ({values});";
        sql = sql.replace("{table}", getTable(jsonObject));
        sql = sql.replace("{fields}", getFields(jsonObject));
        return sql.replace("{values}", getValues(jsonObject));
    }

    private static String getTable(JSONObject jsonObject) {
        return "t_" + jsonObject.getString("table");
    }

    private static String getTime(JSONObject jsonObject) {
        if (jsonObject.containsKey("time")) {
            return timeLongToStr(jsonObject.getLong("time"));
        } else {
            return timeLongToStr(System.currentTimeMillis());
        }
    }

    private static String getFields(JSONObject jsonObject) {
        JSONObject dataJson = jsonObject.getJSONObject("datas");
        StringBuilder sb = new StringBuilder();
        sb.append("time").append(",");
        dataJson.forEach((key, value) -> sb.append(key).append(","));
        return sb.substring(0, sb.length() - 1);
    }

    private static String getValues(JSONObject jsonObject) {
        JSONObject dataJson = jsonObject.getJSONObject("datas");
        StringBuilder sb = new StringBuilder();
        sb.append(""").append(getTime(jsonObject)).append(""").append(",");
        dataJson.forEach((key, value) -> sb.append(value).append(","));
        return sb.substring(0, sb.length() - 1);
    }

    private static String timeLongToStr(long time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        return sdf.format(new Date(time));
    }
}

【小插曲】

測試過程中,發現了一個問題,詳細請參考issue:https://github.com/taosdata/TDengine/issues/3818

==數據模型==

官網地址:https://www.taosdata.com/cn/documentation/architecture/

官網上面寫了TD的數據模型,不過沒有圖例進行直觀的說明,所以介紹的多少有些抽象。希望文檔上可以提升一下逼格。

【物理量】

也叫“測點”、“點位””。就像做心電圖時,粘在身上的幾個吸盤。一吸盤就是一個測點,也就是一個物理量。

我這里以智能水流量計為例,包括以下測點。

【數據采集點】

每個數據采集點可以采集多個物理量。

我覺得實際場景中的PLC應該算是一個數據采集點了。

【表】

一個數據采集點一張表。

【超級表】

同一類型數據采集點的集合。

我這里做了一寫想到哪里就試到哪里的嘗試。

1、先創建一個超級表

create table if not exists znsllj (time timestamp, ForwardIntegratedFlow double, BackwardIntegratedFlow double, InstantaneousFlow double, Velocity double, Density double, Temperature double, Pressure double, Error bool) tags(product nchar(256), device nchar(256));

2、基于超級表創建表

create table znsllj001 using znsllj tags("product1", "device1");

3、向表中插入一條數據

insert into znsllj001(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 10, 11, 12, 13, 14, 15, 16, 0);

4、如果修改表結構可以嗎?

alter table znsllj001 add column AddField double;

發現直接修改表的結構是失敗的,提示只能修改超級表

5、嘗試修改超級表結構

alter table znsllj add column AddField double;

發現修改成功,并且表的結構也跟著變化了。

6、分別查看一下表和超級表的結構

describe znsllj001;

describe znsllj;

7、刪除超級表中一個列(有數據的列)

alter table znsllj drop column ForwardIntegratedFlow;

看到的是可以成功刪除,同時表結構也發生了改變。

8、此時如果刪除超級表會如何?

drop table if exists znsllj;

看到可以正常刪除超級表,而且表也被連帶著一起刪掉了。

9、重新創建超級表、表及插入一條數據(修改了一下超級表和表的的前綴,便于區分)

create table if not exists st_znsllj (time timestamp, ForwardIntegratedFlow double, BackwardIntegratedFlow double, InstantaneousFlow double, Velocity double, Density double, Temperature double, Pressure double, Error bool) tags (product nchar(256), device nchar(256));

create table t_znsllj001 using st_znsllj tags("product1", "device1");

insert into t_znsllj001(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 10, 11, 12, 13, 14, 15, 16, 0);

10、繼續創建幾個表(同一個超級表)

兩個標簽值重復:create table t_znsllj002 using st_znsllj tags("product1", "device1");

標簽值都不重復:create table t_znsllj003 using st_znsllj tags("product3", "device3");

少一個標簽:create table t_znsllj004 using st_znsllj tags("product4");

無標簽:create table t_znsllj005 using st_znsllj;

多一個標簽:create table t_znsllj006 using st_znsllj tags("product6", "device6", "type6");

一個標簽值重復:create table t_znsllj007 using st_znsllj tags("product1", "device7");

結論如下:

表的標簽數量必須與超級表一致。

表的標簽值可以重復。

11、分別向幾個成功的表中插入一條數據

insert into t_znsllj001(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 10, 11, 12, 13, 14, 15, 16, 0);

insert into t_znsllj002(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 20, 21, 22, 23, 24, 25, 26, 0);

insert into t_znsllj003(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 30, 31, 32, 33, 34, 35, 36, 0);

insert into t_znsllj007(time, ForwardIntegratedFlow, BackwardIntegratedFlow, InstantaneousFlow, Velocity, Density, Temperature, Pressure, Error) values(now, 70, 71, 72, 73, 74, 75, 76, 0);

12、查看一下幾個表的數據(僅時間戳,正向累計流量)

select time, forwardintegratedflow from t_znsllj001 order by time;

select time, forwardintegratedflow from t_znsllj002 order by time;

select time, forwardintegratedflow from t_znsllj003 order by time;

select time, forwardintegratedflow from t_znsllj007 order by time;

13、檢索超級表的所有數據(時間戳,一個物理量(正向累計流量)、兩個TAG(產品、設備))

select time, forwardintegratedflow, product, device from st_znsllj order by time;

可以看到,通過超級表的結果會帶有標簽,普通表是么有標簽的。另外超級表只看標簽值,結果集中看不到具體是從哪個表中數據。

==聚合語句==

根據官方文檔進行了一堆驗證,感覺這些函數還不錯。但是在大量數據的情況下,結果是否正確沒有驗證過。僅進行了功能上的驗證,基本可以代替InfluxDB。

另外,對于“適用于”這一列,實際上與官方文檔有出入。至少在這個版本,我的驗證結果如下。

Excel版本的驗證結果,我共享到百度網盤了,有需要的自提。

鏈接:https://pan.baidu.com/s/1AOgDeGCqoOsvhGWu27Vrtg
提取碼:vxpb

==滾動升級測試==

目前版本的td尚屬于更新迭代很快的階段,所以難免會有一些bug發生,所以在實際使用中,會頻繁的進行版本升級。

這一點也會影響td是否能夠順利落地,以及長久使用的一個考量指標。我按照以下的方式進行了一次嘗試。

【驗證思路】

因為目前集群版release的就這一個版本,所以沒有辦法測試版本升級,只能測試卸載之后,在重新安裝。

【驗證結論】

卸載并重新安裝之后,集群可以正常使用。

【驗證過程】

1、先備份配置文件

分別將3個節點的配置文件下載并備份。

2、停止td集群

在3個節點分別執行命令:systemctl stop taosd

3、卸載tdengine

在3個節點分別執行命令:

#查看tdengine
rpm -qa | grep TDengine
#卸載tdengine
yum remove TDengine-2.0.4.0-3.x86_64

4、查看卸載后的狀態

配置文件保留,沒有被刪除。

數據文件保留,沒有被刪除。

5、重新安裝集群

在3個節點分別執行:rpm -ivh /home/radmin/soft/TDengine-server-2.0.4.0-Linux-x64.rpm

6、觀察配置文件

配置文件沒有被覆蓋,保留了卸載之前的配置,這樣挺好的,省著重新配置了。

7、啟動集群

在3個節點分別執行命令:systemctl start taosd

8、進入命令行

在任意節點運行taos,確認可以進入命令行。

9、查看集群狀態

show dnodes;

查看數據庫show databases;

切換數據庫,并查看超級表

查詢任意表

2020年10月12日 13:38 追記

看到官方剛剛發布了2.0.5.0版本,按照下面的順序重新嘗試了一遍,結果一樣,順利升級成功。

2020年10月12日 14:00 追記

集群使用了一會之后,發現第2個節點宕掉了,

沒有辦法,由于著急測試,將tdengine卸載,然后刪除數據目錄,重新安裝之后才得以解決。

2020年10月12日 19:37 追記

服務器版本升級到2.0.5.0之后,taos-jdbcdriver的版本需要使用2.0.8,使用2.0.5的時候會報錯。感謝網友

2020年12月21日 9:24 追記

服務器從2.0.8.0升級到2.0.10.0,出現了一個問題。升級之后,通過shell查詢數據提示錯誤:DB error: Invalid message

在群里咨詢之后,最終問題得到了解決,不過不敢保證是以下哪個方式解決的,猜測是第1個原因

1、在升級taosd的時候,taos進程一直沒有關閉,升級之后也是用的2.0.8.0版本的taos shell檢索的。所以報錯

2、java客戶端版本不正確,java客戶端版本從2.0.12升級到2.0.15之后,重新執行程序確實解決了。

另外,從群里咨詢得到了一下幾個結論,后續升級需要注意:

濤思的版本升級規則是,前三位一致是版本兼容的,如不一致需要同步升級客戶端和服務端

==連續查詢==

在InfluxDB中有連續查詢的功能,可以按照一定的時間頻率對原始數據進行聚合,并將聚合結果放入到新的數據庫中,

具體可以參考我InfluxDB連續查詢的另一篇博客:使用InfluxDB的連續查詢解決聚合性能問題

同樣,在TDengine中也提供了連續查詢的功能,我這里需要驗證一下TDengine的連續查詢與InfluxDB的區別,

用來評估替換InfluxDB之后,對應用端的代碼改動的影響大小。

【語法嘗試】

1、創建連續查詢

create table avg_velocity as select avg(velocity) from st_znsllj interval(1m) sliding(30s);

在定義連續查詢的時候需要指定時間窗口大小(time window, 參數interval)和每次前向增量時間(forward sliding times, 參數sliding)。

2、查看連續查詢

show streams;

3、殺掉指定連續查詢

kill stream 3:1;

【小插曲】

在超級表的查詢語句中加上sliding之后,提示Redirect錯誤。Issue為:https://github.com/taosdata/TDengine/issues/3801

官方上是說在連續查詢上不建議使用sliding

4、嘗試將連續查詢的結果放入另一個庫

需要在查詢的表以及目標表上加上數據的名字即可。

create tableqch_cq.device_data_up_sum as select sum(AI_PICK_UDATA) fromqch_test.st_device_data_up interval(1m) sliding(30s) order by time desc;

【小插曲】

配置上連續查詢,并且程序段在一直的寫入數據,發現了幾個奇怪的現象

現象1:streamId會一直變化

==寫入性能測試==

我寫了一個單列模式的測試樣例,

1、測試服務器:3個節點(阿里云ECS服務器,8核16G內存)

2、單client

3、單列模式

4、自動建表

5、分別測試5千,10萬,100萬測點,按照不同粒度批量寫入(每批100、1000、5000等共10個粒度)

6、1個超級表

在本地運行環境中跑,由于服務器在阿里云上,受網絡的影響,速度時非常的慢的,

10萬點的數據,一共跑了3次,每次都差不多要1個小時才能跑完(一共3個小時)

如果把程序打成jar包,扔到阿里云ECS服務器上跑,就快了太多太多了,

一樣的程序,每次10萬,一共3次,每次差多也就2分鐘就可以插入完成。

但是,感覺還是有一些慢,等找到一些優化的方法,在繼續更新。。。。

2020年11月10日追記:

嘗試了批量寫入的方式,比如每次寫入500條(由于是單列模式,相當于每次向500個表同時寫入數據)

從結果上看,速度確實要快了很多很多,是一個好的結果。

【小插曲】

由于是單列模式的批量插入,所以sql語句會非常的長,大概是下面的這種感覺,

當sql超過一定長度的時候,程序就報錯TDengine Error: Invalid SQL statement。

嘗試調整maxSQLLength參數,將限制放大到10倍,也就是654800,問題解決。

注意:

maxSQLLength是客戶端參數,是調用JDBC Connector的應用程序所在機器上的配置文件,

Linux OS 上默認值 /etc/taos/taos.cfg ,Windows OS 上默認值 C://TDengine/cfg/taos.cfg。

【測試結論】

測試結論:

1、單client,單列模式,自動建表模式,每秒寫入性能約每秒2萬條。

2、按照我目前的機器配置,批量寫入的時候,建議每批500條。

下圖是測試的統計圖。

==可靠性測試==

==數據備份==

==聚合性能驗證==

==實際落地姿勢==

筆記:2021年1月19日

目前在一個項目中,準備上TDengine,但是考慮到TDengine的一些實際情況

1、TD在快速的版本迭代過程中,難免會有一些問題不能第一時間解決(需要提Issue)

2、社區版的解決速度也會比預期的要慢一些 (實際上還是比較不錯的了)

3、TD本身是用C語言開發的,能獨立解決TD問題的人不多(年輕人,會C的人不是很多)

綜合考慮之后,沒有獨立的使用TDengine來支撐項目,而是采用了以下方案

1、使用InfluxDB(社區版)來支撐實時業務,數據存儲時間不超過3個月。并使用連續查詢來支撐實時聚合。

2、使用TDengine(社區版)來支撐分析業務,數據存儲時間為默認的10年。使用單列模式,來支撐測點的增減場景。

這樣的好處是,可以充分使用InfluxDB的穩定,來確保實時類業務的可靠性。

同時有可以引入TDengine的新物種,帶來聚合性能的提升,給業務帶來一些成長因素。

筆記:2021年4月7日 20:30

我們在InfluxDB和TDengine之外包裝了一層SDK,對應用層暴露SDK,這樣應用層就不需要關心到底用的哪個存儲技術了。

在SDK中需要解決以下問題:

1、檢查InfluxDB及TDengine的連接狀態,如果其中一個宕了,使用另一個。

2、判斷查詢數據的起始時間,如果在時間范圍內則查詢InfluxDB,如果超過一定時間則使用TDengine。

3、翻譯應用端的查詢語句以及查詢的數據結果。統一到InfluxDB的數據格式。

實際場景中的數據備份方案還沒有最終確定,后續更新。

--END--

總結

以上是生活随笔為你收集整理的【转】TDengine踩坑随记(最后一次更新:2021-4-7 20:30)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

午夜色站| 婷婷国产视频 | 亚洲精品资源在线观看 | 精品欧美一区二区三区久久久 | 日韩在线观看视频中文字幕 | 亚洲视频专区在线 | 日韩成人黄色av | 91桃色免费视频 | 午夜在线免费观看视频 | 欧美日韩精品在线一区二区 | 在线影视 一区 二区 三区 | 美女视频久久黄 | 日本韩国中文字幕 | 五月婷婷丁香在线观看 | 精品视频123区在线观看 | 日本中文在线 | 日韩在线色| 国产91影视 | 成人久久精品 | 在线国产中文字幕 | 日韩精品资源 | 欧美成人精品欧美一级乱黄 | 精品视频中文字幕 | 麻豆免费视频网站 | 91香蕉视频污在线 | 天天色天天射天天操 | 中文永久字幕 | 福利视频一区二区 | 日韩高清av | 97精品视频在线播放 | 久久午夜精品视频 | 日韩在线观看电影 | 久久久久国产精品免费网站 | 国产亚洲精品久久19p | 久久婷婷一区二区三区 | 亚洲少妇激情 | 超碰在线公开免费 | 尤物97国产精品久久精品国产 | 欧美日韩国产一区二区三区在线观看 | 国产97色在线 | 91热视频在线观看 | 日韩在线免费高清视频 | 2022久久国产露脸精品国产 | 国产日韩精品在线观看 | 日韩在线视频国产 | 日韩婷婷 | av在线播放中文字幕 | 成人免费在线视频 | 一区二区三区韩国免费中文网站 | 精品亚洲在线 | 在线小视频你懂的 | 久久国产精品免费观看 | 色综合天天综合在线视频 | 一区中文字幕电影 | 在线日韩一区 | 久久久免费观看 | 久草爱 | 日韩一区二区三区视频在线 | av一区在线 | 麻豆视频在线免费观看 | 国产成人亚洲在线电影 | 国产成人高清av | 最近免费中文字幕 | 国产日韩在线观看一区 | 国产精品婷婷 | 在线视频app | 在线观看中文字幕网站 | 国产不卡视频在线播放 | 黄色电影网站在线观看 | 国产精品18久久久久久不卡孕妇 | 欧美日韩中文国产 | 日韩欧美精品在线 | 欧美日韩一区二区三区在线免费观看 | 日韩v欧美v日本v亚洲v国产v | 欧美aaa一级 | 免费观看国产精品 | 久久a热6 | 精品国产成人 | 97成人资源站 | 久久视频6 | 日韩欧美黄色网址 | 亚洲成人资源在线观看 | av中文字幕免费在线观看 | 国产黄大片 | 碰超在线观看 | 最近最新中文字幕 | 九九九九九九精品 | 国产精品国产三级国产aⅴ入口 | 激情欧美一区二区免费视频 | 在线网站黄 | 福利视频导航网址 | 久久久久久综合网天天 | 午夜影视av | 六月激情| 天天干夜夜爽 | 欧美与欧洲交xxxx免费观看 | 六月色丁 | 99视频在线精品免费观看2 | 国产午夜av | 在线精品亚洲一区二区 | 国产成人在线免费观看 | 天堂av最新网址 | 亚洲欧洲国产日韩精品 | 超碰99人人 | 国产69精品久久99不卡的观看体验 | 91精品国| 久久伦理影院 | 天堂av在线网址 | 91福利免费 | 91丨九色丨勾搭 | 肉色欧美久久久久久久免费看 | av中文字幕亚洲 | 女人魂免费观看 | 国产精品久久久久久久久久东京 | 亚洲伊人av| 日韩精品一区二区三区免费观看视频 | 992tv在线观看 | 色欧美视频 | 国产自产在线视频 | 婷婷深爱| 九色琪琪久久综合网天天 | 精品国产成人av在线免 | 日韩影视大全 | 91av综合| 亚洲日本va午夜在线电影 | 91丨九色丨91啦蝌蚪老版 | 啪啪精品 | 主播av在线 | 国产在线观看二区 | 亚洲 成人 一区 | 亚洲精品女人久久久 | 2023年中文无字幕文字 | 亚洲精品三级 | 免费观看黄 | 欧美精品黑人性xxxx | 91精品爽啪蜜夜国产在线播放 | 国产中文在线观看 | 天天爱天天射天天干天天 | 久久99精品国产99久久 | 亚洲国产mv | 亚洲自拍av在线 | 中文字幕在线影院 | 久草视频在线免费看 | wwwwww色| 精品国产1区2区3区 国产欧美精品在线观看 | 中文字幕免费高清av | a√国产免费a | 中文字幕高清在线 | 成人91av | 五月婷婷免费 | 九九在线播放 | 亚洲欧洲精品一区二区 | 国产精品成人一区二区 | 国产视频手机在线 | 18性欧美xxxⅹ性满足 | 69精品久久久 | 免费进去里的视频 | 日本精品久久久久中文字幕 | 亚洲精品h| 久久久久久网址 | 黄污网站在线观看 | 国产精品私人影院 | 国产精品一区免费观看 | 婷婷视频 | 精品久久久久久久久久久久 | 久久九九影视网 | 日韩在线视频线视频免费网站 | 国产精品色婷婷 | 高清中文字幕av | av解说在线 | 欧美少妇xx | 日韩乱码中文字幕 | 三级小视频在线观看 | 91.麻豆视频 | 久久久人人人 | 在线国产一区二区 | 久久成人午夜视频 | 亚洲精品免费在线视频 | 69人人| 黄色片网站大全 | 久久视频国产 | 在线免费观看欧美日韩 | 亚洲精品在线免费播放 | 香蕉久久久久久久 | 丁香婷婷网 | 一级全黄毛片 | 亚洲精品在线看 | 天天操天天干天天操天天干 | 就要干b | 免费观看福利视频 | 免费进去里的视频 | av九九九 | 99视频久| 伊人国产在线播放 | 69精品久久 | 日韩v欧美v日本v亚洲v国产v | 国产极品尤物在线 | 精品一二三区 | 国产麻豆剧传媒免费观看 | 亚洲精品玖玖玖av在线看 | 色搞搞 | 在线免费精品视频 | 激情久久综合网 | 国产高清精品在线 | 久久99视频免费 | 黄色亚洲在线 | 伊人久久国产精品 | 国产男女无遮挡猛进猛出在线观看 | 日韩精品久久一区二区 | a级国产乱理论片在线观看 伊人宗合网 | 国产精品99久久久久久久久 | 香蕉在线观看视频 | 91桃色在线观看视频 | 一区二区三区四区不卡 | 视频在线一区二区三区 | 制服丝袜在线 | 亚洲欧美日韩国产一区二区三区 | 黄色软件在线观看 | 国产区免费在线 | 亚洲精品在线免费观看视频 | 91精品视频免费看 | 天天爽综合网 | 人人看人人 | 成人av资源 | 日本久久综合网 | 91av国产视频 | 国产精品久久久一区二区三区网站 | 国产最新在线 | 久久国产精品视频观看 | 涩涩成人在线 | 免费国产在线精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 久草视频免费在线观看 | 草在线视频 | 国产一区国产二区在线观看 | 日韩免费一区 | 国产精品第十页 | av大片免费在线观看 | 在线国产能看的 | 久久久精品99 | 美女黄视频免费看 | 久草在线这里只有精品 | 毛片1000部免费看 | 91精品在线免费 | 五月天激情开心 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久不卡视频 | 亚洲人xxx| 色九九在线| 最新av网站在线观看 | 插综合网 | 黄色影院在线免费观看 | 91成人蝌蚪| 亚洲精品一区二区精华 | 欧美日韩性视频在线 | 二区三区精品 | 国产一区二区高清不卡 | 免费又黄又爽视频 | 国产精品丝袜久久久久久久不卡 | 久av电影| 91亚洲精品久久久久图片蜜桃 | 日韩高清免费观看 | 丁香激情婷婷 | 伊人国产在线播放 | 国产 中文 日韩 欧美 | 久久综合九色综合久久久精品综合 | 欧美日韩网站 | 日韩中文字幕国产 | 国产成人精品亚洲精品 | 91精品国产乱码在线观看 | 国内精品福利视频 | 欧美大码xxxx | 久久精品国产免费看久久精品 | 欧美精品三级在线观看 | 中文字幕五区 | 久草观看视频 | 麻豆视频在线观看免费 | av九九| 国内精品久久久久影院一蜜桃 | 国产精品久久久久婷婷 | 五月天综合色激情 | 在线视频 成人 | 久久精品一区二区三区视频 | 在线а√天堂中文官网 | 免费国产一区二区 | 日韩欧美一区二区在线播放 | 91精品国产综合久久久久久久 | 在线成人短视频 | 91高清不卡 | 久久伊人八月婷婷综合激情 | 五月激情五月激情 | 久久国产色 | 久久91久久久久麻豆精品 | 黄色三级av| www.亚洲| 天天操天天添天天吹 | 国产亚洲一区二区三区 | 久久久久久久久久久久久国产精品 | 九九久久在线看 | 天堂网在线视频 | 涩涩在线| 国产精品成人一区二区 | 国产精品手机视频 | 欧美一级免费高清 | 天天躁天天操 | 91桃色免费视频 | 日本最新高清不卡中文字幕 | 日韩特黄一级欧美毛片特黄 | 免费视频99 | 久久婷亚洲五月一区天天躁 | 免费男女网站 | 亚洲无在线 | av黄色免费在线观看 | 成人精品久久久 | 欧女人精69xxxxxx| 特级西西444www高清大视频 | 欧美热久久 | 中文字幕精品一区二区三区电影 | 午夜在线观看影院 | 午夜精品久久久久久久久久久久久久 | 精品视频一区在线观看 | 国产亚洲精品美女 | 日韩超碰 | 深爱激情综合网 | 日韩美在线观看 | 黄色片网站av | 色婷婷av国产精品 | 色中文字幕在线观看 | 日韩精品视频在线观看网址 | 国产精品久久久久久久久久久免费 | 日本中文在线 | 日韩av一区二区三区四区 | 国产日韩精品在线观看 | 色婷婷免费 | 黄色毛片视频 | 精品国产aⅴ麻豆 | 久久人人爽人人爽人人 | 国产一级黄色免费看 | 久久精品播放 | 深夜免费福利视频 | 色婷婷婷 | 国产免费国产 | 香蕉成人在线视频 | 日韩中文字幕免费视频 | 成人一区二区三区中文字幕 | 精品在线你懂的 | 99热在线国产 | 天天天天天天天天操 | 精品欧美一区二区精品久久 | 欧美怡红院视频 | 免费视频色| 中文字幕电影一区 | 在线观看成人福利 | 久久综合婷婷 | 亚洲在线网址 | 首页国产精品 | 激情欧美在线观看 | 怡春院av | 91福利国产在线观看 | 高清免费在线视频 | 九九在线播放 | 五月婷婷丁香 | 久久久久久久久综合 | 在线观看 亚洲 | 亚洲电影av在线 | 中文字幕在线观看一区 | 欧美日韩中文在线视频 | 久久精品99北条麻妃 | 在线观看av中文字幕 | 不卡电影免费在线播放一区 | 中文字幕不卡在线88 | 黄色在线观看www | 久久情爱 | 在线观看一级视频 | 日日夜夜网 | 亚洲 欧美 精品 | 99久久精品国产一区二区三区 | 久久精品免视看 | 人成午夜视频 | 91av色| 国产亚洲免费观看 | 国产一级片视频 | 91人网站 | 欧美精品国产精品 | 麻花传媒mv免费观看 | 久久久久久片 | 国产精品理论在线观看 | 色综合久久88色综合天天人守婷 | 亚洲成人黄色在线观看 | 亚洲视频久久久久 | 日本在线精品视频 | 九九热视频在线免费观看 | 91av视频观看 | 3d黄动漫免费看 | 黄色av一区二区三区 | 色丁香色婷婷 | 欧美日韩三级 | 婷婷精品在线视频 | 日韩免费一级a毛片在线播放一级 | 在线电影 你懂得 | 欧美天堂影院 | 国产在线污 | 国产在线观看中文字幕 | 97国产超碰 | 97视频在线看 | 日日夜色 | 久久6精品| 在线免费观看av网站 | 久久国产网| 日韩女同一区二区三区在线观看 | 亚洲日本在线视频观看 | 国产黄色片久久 | 久久国产91 | 婷婷色综 | 精品9999 | 国产成人av一区二区三区在线观看 | 亚洲成年人在线播放 | 99视频精品 | 亚洲精品伦理在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 久久看片网站 | 日本免费久久高清视频 | 久久涩涩网站 | 一级特黄aaa大片在线观看 | 丁香五婷 | 91精品久久久久久久久久入口 | 成人国产精品电影 | 日韩免费在线视频 | 香蕉97视频观看在线观看 | 国产免费观看久久 | www.黄色片.com| 丝袜美腿亚洲 | 不卡av免费在线观看 | 亚洲成人精品影院 | 欧美日韩国产综合网 | 超碰人人99| 免费国产在线观看 | 字幕网在线观看 | 日韩久久久久久久 | 亚洲精品一区二区三区新线路 | 亚洲欧美日韩国产一区二区 | av先锋影音少妇 | 国产 日韩 欧美 中文 在线播放 | 99视频国产在线 | 玖玖视频在线 | 精品伦理一区二区三区 | 日韩精品第1页 | 国产精品欧美久久 | av品善网 | 最新中文字幕在线播放 | 日韩电影在线看 | 国产成人福利片 | 欧美日韩久久不卡 | 亚洲欧美日韩国产一区二区三区 | 四虎影视成人永久免费观看视频 | 国产一级视屏 | 日韩毛片在线一区二区毛片 | 俺要去色综合狠狠 | 美女网站色| 天天鲁天天干天天射 | 人人澡超碰碰97碰碰碰软件 | 亚洲涩涩色 | 日韩视频免费观看高清 | 在线免费视频一区 | 在线va网站 | 国产精品 视频 | 久久精品老司机 | 久久桃花网 | 成年人在线观看 | 最近中文字幕mv | 一区二区视频电影在线观看 | 亚洲另类视频 | 99久久精品久久亚洲精品 | 在线播放视频一区 | 一二三精品视频 | 麻豆成人网 | 999久久久欧美日韩黑人 | 国产免费xvideos视频入口 | 久久精品—区二区三区 | 最新久久久 | 国产a国产a国产a | 日韩69av| 国产精品白丝jk白祙 | 国产精品mm | 国产精品一区二区麻豆 | 九九九九免费视频 | 国产在线日韩 | 97成人精品| 国产在线 一区二区三区 | 狠狠的操你| 欧美日韩视频在线观看免费 | 日韩网站免费观看 | 美女av电影| 亚洲黄网站 | 亚洲视频在线观看免费 | 成人在线视频免费 | av网站手机在线观看 | 9999国产| 曰本三级在线 | 久久99久久99精品中文字幕 | 成 人 免费 黄 色 视频 | 亚洲在线看 | 日韩电影在线一区 | www国产亚洲精品久久麻豆 | 99久久精品国产一区二区三区 | 成人aⅴ视频 | 日韩av片无码一区二区不卡电影 | 国产精品毛片完整版 | 日本精品一二区 | 国产精品高清av | 国产精品毛片一区视频播不卡 | 欧美 日韩 性| 91麻豆视频网站 | 精品免费观看 | 欧美性天天 | 精品 激情 | 免费av电影网站 | 国产高清在线免费观看 | 在线视频专区 | 国产精品成人国产乱一区 | 一区久久久 | 91精品国自产在线观看 | 欧美不卡视频在线 | 视频一区在线免费观看 | 国产一区欧美日韩 | 亚洲在线精品视频 | 开心激情网五月天 | www激情com| 韩日在线一区 | 麻豆小视频在线观看 | 91片网 | 欧美一区二区日韩一区二区 | 久久久www成人免费毛片 | 免费av片在线 | 欧美一级在线看 | 国产免费美女 | 欧美成人播放 | 天天综合天天做天天综合 | 99久久精品免费 | 久久国产精品二国产精品中国洋人 | 欧美一级乱黄 | 欧美日韩二区在线 | 日日日爽爽爽 | 色多多视频在线 | 成年人视频在线 | 女人18片毛片90分钟 | 丝袜+亚洲+另类+欧美+变态 | 激情视频在线高清看 | 国产97色在线 | 丁香色婷 | 亚洲精品乱码久久久久久写真 | www黄免费| 999久久久免费精品国产 | 欧美精品在线一区 | 九九九热精品 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久黄色美女 | 婷婷丁香av | 国产精品久久电影网 | 国产视频一区在线 | 夜添久久精品亚洲国产精品 | 日本韩国精品一区二区在线观看 | 成人av一区二区三区 | 日韩视频一区二区三区 | 五月婷婷狠狠 | 日日草视频 | 狠狠搞,com| 福利久久久| 五月婷婷婷婷婷 | 国产九九九九九 | 久久亚洲免费视频 | 手机在线欧美 | 成人黄色毛片 | 中文字幕制服丝袜av久久 | 在线观看www.| 日本三级不卡视频 | 最近中文字幕高清字幕在线视频 | 又黄又刺激视频 | 日本中文字幕一二区观 | 99久久精品国产网站 | 特级免费毛片 | 国产香蕉97碰碰久久人人 | 久久大视频 | 超碰在线人人 | av最新资源 | 久久亚洲免费 | 久久久精品久久日韩一区综合 | 色网av| 精品久久一| 欧美成人h版在线观看 | 韩国在线视频一区 | 国产免费久久精品 | 久久久久久久久久国产精品 | 99久久99久久 | 久久久久国 | 久久成人免费电影 | 97色婷婷人人爽人人 | 午夜黄色影院 | 成年人在线免费看 | 亚洲狠狠丁香婷婷综合久久久 | 成人毛片一区 | 成人看片 | 91丨九色丨国产在线 | 久久精品79国产精品 | 日本天天色 | 中文字幕文字幕一区二区 | 天天综合网在线观看 | 天天干,天天射,天天操,天天摸 | 国产午夜精品久久久久久久久久 | 久久久久亚洲精品国产 | 成人国产精品入口 | 国产精品欧美一区二区 | 最新色视频 | 六月丁香婷 | 国产精品久久99综合免费观看尤物 | 亚洲乱码国产乱码精品天美传媒 | 免费黄色a网站 | 最新色站 | 国产专区一 | 亚洲区另类春色综合小说校园片 | 日本黄色免费在线观看 | 国产成本人视频在线观看 | 91中文字幕在线 | 日韩欧美国产精品 | 欧美久久久久 | 精品久久久久国产 | 久久永久视频 | 69亚洲精品| 久久天天操 | 国产中文字幕一区 | 欧美另类69 | 国产日韩欧美在线观看 | 超碰精品在线观看 | 亚洲一区精品二人人爽久久 | 国内精品久久久久久久久久 | 亚洲精品国产片 | 久久av免费电影 | 久草精品视频在线观看 | 亚洲免费在线播放视频 | 韩国av免费 | 日韩免费看| 婷婷激情5月天 | 国产高清视频免费最新在线 | 天天干夜夜爽 | 日韩免费福利 | 444av| 日韩欧美精品一区二区三区经典 | 久久精品国产久精国产 | 久久久午夜电影 | 欧美日韩高清免费 | 亚洲视频久久久 | 国产精品专区h在线观看 | 91三级在线观看 | 欧美日韩国产综合网 | 久久久久久久久久久久久久av | 国产区高清在线 | 国产一区二区三区黄 | 黄色毛片视频免费观看中文 | 操操操av | 欧美极品xxxxx | 在线免费观看国产精品 | 国产亚洲精品福利 | 五月天婷婷在线观看视频 | 99久精品视频 | 一区在线播放 | 国产1区在线观看 | 日韩理论片在线观看 | 精品国产一区二区三区久久久 | 婷婷色在线资源 | 久久精品国产亚洲aⅴ | 97色在线观看免费视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 亚洲高清视频在线播放 | 2019中文在线观看 | 久草线 | 国产黄色在线 | 国产不卡精品 | 日韩欧美综合视频 | 91九色国产蝌蚪 | 丁香av在线 | 日韩免费看片 | 免费观看成人网 | 福利片免费看 | 久久精品在线免费观看 | 绯色av一区| 日本午夜在线亚洲.国产 | 国产精品久久久久久久av大片 | 久久色亚洲 | av黄色成人 | 天天爽夜夜操 | 99色在线播放 | 天堂在线视频中文网 | 人人爱人人做人人爽 | 黄色在线观看污 | 国产成人一二片 | 黄色在线免费观看网址 | 久久99精品一区二区三区三区 | 国产91精品看黄网站 | 伊人天天干 | 97精品国产97久久久久久 | 91中文字幕在线 | 一区二区三区在线免费 | 国产欧美精品一区二区三区 | 日韩va欧美va亚洲va久久 | 一级α片 | 综合久久网站 | 中文字幕国产亚洲 | 99视频+国产日韩欧美 | 国产精品 999 | 亚洲精品免费播放 | 亚洲精品系列 | 国产精品美女网站 | 久久亚洲美女 | 亚洲乱码精品久久久久 | 91视频链接 | 天天射狠狠干 | 国产婷婷在线观看 | 97视频人人澡人人爽 | 国产精品免费一区二区三区 | 日韩69av | 天堂av在线7| 国产女人40精品一区毛片视频 | 久草视频99 | 江苏妇搡bbbb搡bbbb | 在线观看视频97 | 福利区在线观看 | 91av短视频| 黄色动态图xx | 九九热视频在线 | 麻豆传媒在线免费看 | 九九国产视频 | 国产一区二区在线播放 | 中文字幕中文字幕中文字幕 | 国内精品久久久久久中文字幕 | 国产成人黄色片 | 中文字幕免费高清 | 久久国产欧美日韩 | 免费亚洲黄色 | 色噜噜日韩精品欧美一区二区 | 免费色视频| 超碰97久久| 亚洲精品视频免费在线 | av大片网址 | 免费福利在线视频 | 一区二区三区 中文字幕 | 日韩欧在线 | 欧美亚洲精品在线观看 | av线上看| 久久99视频精品 | 手机在线观看国产精品 | 天天夜操| 在线观看的a站 | 日本xxxxav | 日韩在线一级 | 国产视频不卡一区 | 亚洲视频在线播放 | 国产色视频网站2 | 四虎影院在线观看av | 亚洲精品在线播放视频 | 最新动作电影 | 日韩欧美精品在线视频 | 韩日精品中文字幕 | 久久亚洲私人国产精品va | 久草在线免费资源站 | 国内精品久久久久久久久久清纯 | 日本不卡123 | 九九久久精品 | 日韩免费网站 | 综合网成人 | www.超碰97.com | 精品av在线播放 | 久久久久女人精品毛片九一 | 在线观看成人 | 欧美 亚洲 另类 激情 另类 | 国内精品久久久久影院日本资源 | 深夜免费福利网站 | 日韩中文字幕免费视频 | 激情综合交 | 国产精品日韩在线 | 在线观看完整版免费 | 国产精品毛片一区 | 天天操夜操 | 狠狠插天天干 | 婷婷伊人五月 | 欧洲精品视频一区 | 日韩在线不卡av | 欧美一级片免费播放 | 欧美精品乱码99久久影院 | 成年人电影毛片 | 高清免费av在线 | 免费av在线播放 | 成人一级电影在线观看 | 成人在线播放免费观看 | 国产玖玖在线 | 久久国产片 | 天天射天天爱天天干 | 日韩精品一区二区三区高清免费 | 99久久99久久免费精品蜜臀 | 国产精品自产拍在线观看 | 亚洲a资源 | a视频免费看 | 免费在线观看视频a | 97人人爽人人 | 日韩成人免费观看 | 久久亚洲私人国产精品 | 日韩久久网站 | av7777777| 亚洲最新合集 | 国产亚洲精品久久久久久久久久久久 | 欧美在线视频不卡 | 欧美日韩精品在线一区二区 | 97在线影视 | 久在线观看视频 | 成人免费亚洲 | 九九热免费在线观看 | 在线影院 国内精品 | 久久激情精品 | 国产一卡久久电影永久 | 国产精品久久久久久模特 | 又色又爽又黄高潮的免费视频 | 99色在线观看 | 日韩免费不卡av | 91人人干| 亚洲精品午夜久久久久久久 | 精品国产精品久久 | 精品影院 | 久久精品国产久精国产 | 在线观看精品黄av片免费 | 日韩高清免费在线观看 | 亚洲第一区在线观看 | 国产成人精品综合 | 天天艹天天爽 | 97福利在线| 西西444www高清大胆 | 日韩精品中文字幕在线观看 | 久久久久久久影视 | 黄色资源在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 日韩精品在线免费观看 | 精品国产欧美一区二区 | 99久国产 | 久久久久亚洲精品 | 国产精品视频永久免费播放 | 国产精品免费一区二区三区在线观看 | 久久 一区 | 97国产大学生情侣白嫩酒店 | 日韩一级电影在线 | 亚洲美女视频网 | 国产精品久久久久久久久久三级 | 亚洲高清不卡av | www.五月天激情 | 日韩av高清在线观看 | 国产大陆亚洲精品国产 | 亚洲欧洲精品久久 | 97超碰成人在线 | 国产伦理一区二区三区 | 亚洲丝袜中文 | 免费在线一区二区 | 日本三级国产 | 五月婷婷深开心 | 婷婷久久五月 | 狠狠干电影 | 最近高清中文在线字幕在线观看 | 在线观看免费观看在线91 | 久久手机免费观看 | 成人一级片免费看 | 天天操天天爱天天干 | 美女精品久久 | av在线最新 | 欧美日韩大片在线观看 | 99精品视频在线观看视频 | 97超碰资源网 | 久久久久久蜜av免费网站 | 日韩aa视频 | 在线精品视频在线观看高清 | 人九九精品| 欧美精品免费在线 | 国产精品网在线观看 | 久久激情视频网 | 久久精品99国产 | 男女拍拍免费视频 | 久久超碰99| 91女人18片女毛片60分钟 | 欧美精品成人在线 | 超碰在线人人97 | 欧美激情综合色综合啪啪五月 | 色资源在线| 娇妻呻吟一区二区三区 | 丁香综合网 | 97超碰在线久草超碰在线观看 | 久久精品久久久久电影 | 亚洲欧美视频在线播放 | 视频一区二区国产 | 天天干天天干天天干天天干天天干天天干 | 免费亚洲精品视频 | 国产手机免费视频 | 日韩精品欧美一区 | 国产 日韩 欧美 在线 | 色在线视频网 | 亚洲资源在线网 | 欧美日韩精品免费观看 | 日韩精品一区二区三区外面 | 亚洲国产日韩精品 | 国内视频在线 | 欧美日韩视频在线观看免费 | 美女网站在线 | 在线看的毛片 | 国产丝袜制服在线 | 国产又粗又猛又黄视频 | 日韩中文字幕免费视频 | 久久精品视频网 | 国产在线视频一区二区三区 | 伊人五月| 久久免费国产精品1 | 国产手机在线观看视频 | 久久免费国产精品1 | 黄色91在线观看 | 亚洲成人在线免费 | 天天爽天天做 | 中文永久免费观看 | 97影视 | 午夜视频一区二区三区 | 最新超碰在线 | 九九热精品国产 | 久久久久久久久久久免费av | 在线亚洲欧美日韩 | 国产成人三级在线播放 | 久久黄色小说视频 | 国产精品理论片在线播放 | av 一区二区三区四区 | 在线观看网站你懂的 | 日韩免费av在线 | 天天射天天爱天天干 | 91在线一区| 丁香六月国产 | 久久福利剧场 | 99视频国产精品 | 国产精品每日更新 | 日本精品视频在线观看 | 国产麻豆精品一区二区 | 国产一级二级在线播放 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 天堂视频一区 | 激情欧美一区二区免费视频 | 成人9ⅰ免费影视网站 | 激情影音先锋 | 天堂av免费看 | 天天操狠狠操 | 久久国产热 | 中文字幕二区三区 | 欧美色一色| 日韩理论电影在线观看 | 日韩欧美高清免费 | 亚洲精品小视频在线观看 | 免费看片成人 | 激情婷婷亚洲 | 欧美一二区视频 | 免费黄色特级片 | 久久一二三四 | 在线观看国产一区 | 久在线| 日韩精品中文字幕在线观看 | 婷婷丁香狠狠爱 | 亚洲无吗av | 国产免费叼嘿网站免费 | 亚洲精品视频第一页 | 日韩精品免费一区二区三区 | 久久精品国产99国产 | 国产一区不卡在线 | 欧美日韩色婷婷 | 国产精品乱码一区二区视频 | 九九欧美视频 | 又黄又色又爽 | 欧美日韩精品在线一区二区 | www.五月天 | 亚洲另类视频在线观看 | 欧美伦理一区二区 | 四虎最新入口 | 91香蕉嫩草| 中文字幕文字幕一区二区 | 日批网站在线观看 | av电影在线不卡 | 99久久精品久久亚洲精品 | 国产精品扒开做爽爽的视频 | 成人超碰在线 | 色综合久久中文字幕综合网 | 五月花丁香婷婷 | 天天草天天干 | 久久天天躁狠狠躁亚洲综合公司 | 日韩小视频网站 | 国产精品观看在线亚洲人成网 | 国产视频综合在线 | 天天干天天干天天射 | 精品国产伦一区二区三区观看说明 | 色橹橹欧美在线观看视频高清 | 亚洲精品国产视频 | 国产99久久九九精品 |