Merge branch '3.0' into enh/TD-31375-3.0

This commit is contained in:
kailixu 2024-08-15 19:14:41 +08:00
commit cc8994e837
22 changed files with 56 additions and 35 deletions

View File

@ -4,8 +4,6 @@ title: 集群维护
sidebar_label: 集群维护
---
## 简介
本节介绍 TDengine Enterprise 中提供的高阶集群维护手段,能够使 TDengine 集群长期运行得更健壮和高效。
## 节点管理

View File

@ -4,7 +4,7 @@ sidebar_label: 双活系统
toc_max_heading_level: 4
---
## 简介
本节介绍 TDengine 双活系统的配置和使用。
1. 部分用户因为部署环境的特殊性只能部署两台服务器,同时希望实现一定的服务高可用和数据高可靠。本文主要描述基于数据复制和客户端 Failover 两项关键技术的 TDengine 双活系统的产品行为包括双活系统的架构、配置、运维等。TDengine 双活既可以用于前面所述资源受限的环境,也可用于在两套 TDengine 集群(不限资源)之间的灾备场景。双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。

View File

@ -143,7 +143,7 @@ charset 的有效值是 UTF-8。
| 参数名称 | 参数说明 |
| :--------------: | :--------------------------------------------------------------------: |
| dataDir | 数据文件目录,所有的数据文件都将写入该目录,缺省值:/var/lib |
| dataDir | 数据文件目录,所有的数据文件都将写入该目录,缺省值:/var/lib/taos |
| tempDir | 指定所有系统运行过程中的临时文件生成的目录,缺省值:/tmp |
| minimalTmpDirGB | tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB缺省值: 1 |
| minimalDataDirGB | dataDir 指定的时序数据存储目录所需要保留的最小空间,单位 GB缺省值: 2 |
@ -168,7 +168,7 @@ charset 的有效值是 UTF-8。
| minimalLogDirGB | 当日志文件夹所在磁盘可用空间大小小于该值时停止写日志单位GB缺省值1 |
| numOfLogLines | 单个日志文件允许的最大行数缺省值10,000,000 |
| asyncLog | 日志写入模式0: 同步1: 异步,缺省值: 1 |
| logKeepDays | 日志文件的最长保存时间 单位缺省值0意味着无限保存当设置为大于0 的值时,日志文件会被重命名为 taosdlog.xxx其中 xxx 为日志文件最后修改的时间戳 |
| logKeepDays | 日志文件的最长保存时间 单位缺省值0意味着无限保存,日志文件不会被重命名,也不会有新的日志文件滚动产生,但日志文件的内容有可能会不断滚动,取决于日志文件大小的设置当设置为大于0 的值时,日志文件大小达到设置的上限时会被重命名为 taosdlog.xxx其中 xxx 为日志文件最后修改的时间戳,并滚动产生新的日志文件 |
| slowLogThreshold | 慢查询门限值,大于等于门限值认为是慢查询,单位秒,默认值: 3 |
| slowLogScope | 定启动记录哪些类型的慢查询可选值ALL, QUERY, INSERT, OHTERS, NONE; 默认值ALL |
| debugFlag | 运行日志开关131输出错误和警告日志135输出错误、警告和调试日志143输出错误、警告、调试和跟踪日志; 默认值131 或 135 (取决于不同模块) |

View File

@ -18,7 +18,7 @@ TDengine 客户端驱动提供了应用编程所需要的全部 API并且在
|queryPolicy | 查询语句的执行策略1: 只使用 vnode不使用 qnode; 2: 没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行; 3: vnode 只运行扫描算子,其余算子均在 qnode 执行 缺省值1 |
|querySmaOptimize | sma index 的优化策略0: 表示不使用 sma index永远从原始数据进行查询; 1: 表示使用 sma index对符合的语句直接从预计算的结果进行查询缺省值0 |
|keepColumnName | Last、First、LastRow 函数查询且未指定别名时,自动设置别名为列名(不含函数名),因此 order by 子句如果引用了该列名将自动引用该列对应的函数; 1: 表示自动设置别名为列名(不包含函数名), 0: 表示不自动设置别名; 缺省值: 0 |
|countAlwaysReturnValue | ount/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值; 0返回空行1返回; 缺省值 1; 该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致. |
|countAlwaysReturnValue | count/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值; 0返回空行1返回; 缺省值 1; 该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致. |
|multiResultFunctionStarReturnTags | 查询超级表时last(\*)/last_row(\*)/first(\*) 是否返回标签列;查询普通表、子表时,不受该参数影响; 0不返回标签列1返回标签列 ; 缺省值: 0; 该参数设置为 0 时last(\*)/last_row(\*)/first(\*) 只返回超级表的普通列;为 1 时,返回超级表的普通列和标签列 |
|maxTsmaCalcDelay| 查询时客户端可允许的tsma计算延迟, 若tsma的计算延迟大于配置值, 则该TSMA将不会被使用.; 取值范围: 600s - 86400s, 即10分钟-1小时 ; 缺省值600 秒|
|tsmaDataDeleteMark |TSMA计算的历史数据中间结果保存时间, 单位为毫秒; 取值范围:>= 3600000, 即大于等于1h; 缺省值: 86400000, 即1d |

View File

@ -7,8 +7,6 @@ toc_max_heading_level: 4
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
## 简介
taosKeeper 是 TDengine 3.0 版本监控指标的导出工具,通过简单的几项配置即可获取 TDengine 的运行状态。taosKeeper 使用 TDengine RESTful 接口,所以不需要安装 TDengine 客户端即可使用。
## 安装

View File

@ -4,8 +4,6 @@ sidebar_label: taosdump
toc_max_heading_level: 4
---
## 简介
taosdump 是一个支持从运行中的 TDengine 集群备份数据并将备份的数据恢复到相同或另一个运行中的 TDengine 集群中的工具应用程序。
taosdump 可以用数据库、超级表或普通表作为逻辑数据单元进行备份,也可以对数据库、超级

View File

@ -4,8 +4,6 @@ sidebar_label: taosBenchmark
toc_max_heading_level: 4
---
## 简介
taosBenchmark (曾用名 taosdemo ) 是一个用于测试 TDengine 产品性能的工具。taosBenchmark 可以测试 TDengine 的插入、查询和订阅等功能的性能它可以模拟由大量设备产生的大量数据还可以灵活地控制数据库、超级表、标签列的数量和类型、数据列的数量和类型、子表的数量、每张子表的数据量、插入数据的时间间隔、taosBenchmark 的工作线程数量、是否以及如何插入乱序数据等。为了兼容过往用户的使用习惯,安装包提供 了 taosdemo 作为 taosBenchmark 的软链接。
## 安装

View File

@ -4,9 +4,7 @@ title: 标签索引
description: 使用标签索引提升查询性能
---
## 简介
在 TDengine 3.0.3.0 版本之前(不含),默认在第一列 TAG 上建立索引,但不支持给其它列动态添加索引。从 3.0.3.0 版本开始,可以动态地为其它 TAG 列添加索引。对于第一个 TAG 列上自动建立的索引,其在查询中默认生效,且用户无法对其进行任何干预。适当地使用索引能够有效地提升查询性能。
本节说明 TDengine 的索引机制。在 TDengine 3.0.3.0 版本之前(不含),默认在第一列 TAG 上建立索引,但不支持给其它列动态添加索引。从 3.0.3.0 版本开始,可以动态地为其它 TAG 列添加索引。对于第一个 TAG 列上自动建立的索引,其在查询中默认生效,且用户无法对其进行任何干预。适当地使用索引能够有效地提升查询性能。
## 语法

View File

@ -4,8 +4,6 @@ title: "视图"
sidebar_label: "视图"
---
## 简介
从 TDengine 3.2.1.0 开始TDengine 企业版提供视图功能,便于用户简化操作,提升用户间的分享能力。
视图View本质上是一个存储在数据库中的查询语句。视图非物化视图本身不包含数据只有在从视图读取数据时才动态执行视图所指定的查询语句。我们在创建视图时指定一个名称然后可以像使用普通表一样对其进行查询等操作。视图的使用需遵循以下规则

View File

@ -1,6 +1,7 @@
---
sidebar_label: C/C++
title: C/C++ Connector
toc_max_heading_level: 4
---
C/C++ 开发人员可以使用 TDengine 的客户端驱动,即 C/C++连接器 (以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。应用程序使用时需要包含 TDengine 头文件 _taos.h_里面列出了提供的 API 的函数原型;应用程序还要链接到所在平台上对应的动态库。

View File

@ -1,6 +1,7 @@
---
sidebar_label: PHP
title: PHP Connector
toc_max_heading_level: 4
---
`php-tdengine` 是由社区贡献的 PHP 连接器扩展,还特别支持了 Swoole 协程化。

View File

@ -3,9 +3,6 @@ sidebar_label: ODBC
title: TDengine ODBC
---
## 简介
TDengine ODBC 是为 TDengine 实现的 ODBC 驱动程序,支持 Windows 系统的应用(如 [PowerBI](https://powerbi.microsoft.com/zh-cn/) 等)通过 ODBC 标准接口访问本地、远程和云服务的 TDengine 数据库。
TDengine ODBC 提供基于 WebSocket推荐和 原生连接两种方式连接 TDengine 数据库,使用时可以为 TDengine 数据源设置不同的连接方式。访问云服务时必须使用 WebSocket 连接方式。

View File

@ -1,6 +1,7 @@
---
title: REST API
sidebar_label: REST API
toc_max_heading_level: 4
description: 详细介绍 TDengine 提供的 RESTful API.
---

View File

@ -122,7 +122,7 @@ description: TDengine 服务端的错误码列表和详细说明
| 0x80000335 | Cluster cfg inconsistent | 配置不一致 | 检查dnode节点与mnode节点配置是否一致。检查方式1.节点启动时,在日志中输出 2.使用show variables |
| 0x8000033B | Cluster id not match | 节点配置数据不一致 | 检查各节点data/dnode/dnodes.json文件中的clusterid |
| 0x80000340 | Account already exists | (仅企业版)内部错误 | 上报issue |
| 0x80000342 | Invalid account options | (仅企业版)操作不zh | 确认操作是否正确 |
| 0x80000342 | Invalid account options | (仅企业版)该操作不支持 | 确认操作是否正确 |
| 0x80000344 | Invalid account | 账户不存在 | 确认账户是否正确 |
| 0x80000350 | User already exists | Create user, 重复创建 | 确认操作是否正确 |
| 0x80000351 | Invalid user | 用户不存在 | 确认操作是否正确 |
@ -311,7 +311,7 @@ description: TDengine 服务端的错误码列表和详细说明
| ---------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| 0x80000903 | Sync timeout | 场景1发生了切主旧主节点上已经开始协商但尚未达成一致的请求将超时。 场景2从节点响应超时导致协商超时。 | 检查集群状态例如show vgroups查看服务端日志以及服务端节点之间的网络状况。 |
| 0x8000090C | Sync leader is unreachable | 场景1选主过程中 场景2客户端请求路由到了从节点且重定向失败 场景3客户端或服务端网络配置错误 | 检查集群状态、网络配置、应用程序访问状态等。查看服务端日志,以及服务端节点之间的网络状况。 |
| 0x8000090F | Sync new config error | 成员变更配置错误 | 预 |
| 0x8000090F | Sync new config error | 成员变更配置错误 | 内部错误,用户无法干预 |
| 0x80000911 | Sync not ready to propose | 场景1恢复未完成 | 检查集群状态例如show vgroups。查看服务端日志以及服务端节点之间的网络状况。 |
| 0x80000914 | Sync leader is restoring | 场景1发生了切主选主后日志重演中 | 检查集群状态例如show vgroups。查看服务端日志观察恢复进度。 |
| 0x80000915 | Sync invalid snapshot msg | 快照复制消息错误 | 服务端内部错误 |

View File

@ -265,7 +265,7 @@ TDengine 在写入数据时如果有很严重的乱序写入问题,会严重
### 26 遇到报错 “DND ERROR Version not compatible,cliver : 3000700swr wer : 3020300”
说明客户端和服务端版本不兼容这里cliver的版本是3.0.7.0,server版本是 3.2.3.0。目前的兼容策略是前三位一致client 和 sever才能兼容。
### 27 修改database的root密码后启动taos遇到报错 “failed to connect to server, reason: Authen tication failure”
### 27 修改database的root密码后启动taos遇到报错 “failed to connect to server, reason: Authentication failure”
默认情况启动taos服务会使用系统默认的用户名root和密码尝试连接taosd在root密码修改后启用taos连接就需要指明用户名和密码例如: taos -h xxx.xxx.xxx.xxx -u root -p然后输入新密码进行连接。
### 28 修改database的root密码后Grafana监控插件TDinsight无数据展示

View File

@ -184,7 +184,7 @@ int32_t mndProcessWriteMsg(SMnode *pMnode, SRpcMsg *pMsg, SFsmCbMeta *pMeta) {
code = mndTransValidate(pMnode, pRaw);
if (code != 0) {
mError("trans:%d, failed to validate requested trans since %s", transId, terrstr());
code = 0;
// code = 0;
pMeta->code = code;
goto _OUT;
}
@ -192,7 +192,7 @@ int32_t mndProcessWriteMsg(SMnode *pMnode, SRpcMsg *pMsg, SFsmCbMeta *pMeta) {
code = sdbWriteWithoutFree(pMnode->pSdb, pRaw);
if (code != 0) {
mError("trans:%d, failed to write to sdb since %s", transId, terrstr());
code = 0;
// code = 0;
pMeta->code = code;
goto _OUT;
}
@ -207,7 +207,10 @@ int32_t mndProcessWriteMsg(SMnode *pMnode, SRpcMsg *pMsg, SFsmCbMeta *pMeta) {
if (pTrans->stage == TRN_STAGE_PREPARE) {
bool continueExec = mndTransPerformPrepareStage(pMnode, pTrans, false);
if (!continueExec) goto _OUT;
if (!continueExec) {
if (terrno != 0) code = terrno;
goto _OUT;
}
}
mndTransRefresh(pMnode, pTrans);

View File

@ -1569,6 +1569,7 @@ static int32_t mndTransExecuteUndoActionsSerial(SMnode *pMnode, STrans *pTrans,
bool mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans, bool topHalf) {
bool continueExec = true;
int32_t code = 0;
terrno = 0;
int32_t numOfActions = taosArrayGetSize(pTrans->prepareActions);
if (numOfActions == 0) goto _OVER;
@ -1579,7 +1580,9 @@ bool mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans, bool topHalf) {
STransAction *pAction = taosArrayGet(pTrans->prepareActions, action);
code = mndTransExecSingleAction(pMnode, pTrans, pAction, topHalf);
if (code != 0) {
mError("trans:%d, failed to execute prepare action:%d, numOfActions:%d", pTrans->id, action, numOfActions);
terrno = code;
mError("trans:%d, failed to execute prepare action:%d, numOfActions:%d, since %s", pTrans->id, action,
numOfActions, tstrerror(code));
return false;
}
}

View File

@ -275,12 +275,14 @@ void metaPauseTbCursor(SMTbCursor *pTbCur) {
int32_t metaResumeTbCursor(SMTbCursor *pTbCur, int8_t first, int8_t move) {
int32_t code = 0;
int32_t lino;
int8_t locked = 0;
if (pTbCur->paused) {
metaReaderDoInit(&pTbCur->mr, pTbCur->pMeta, META_READER_LOCK);
locked = 1;
code = tdbTbcOpen(((SMeta *)pTbCur->pMeta)->pUidIdx, (TBC **)&pTbCur->pDbc, NULL);
TSDB_CHECK_CODE(code, lino, _exit);
if (code != 0) {
TSDB_CHECK_CODE(code, lino, _exit);
}
if (first) {
code = tdbTbcMoveToFirst((TBC *)pTbCur->pDbc);
@ -304,6 +306,9 @@ int32_t metaResumeTbCursor(SMTbCursor *pTbCur, int8_t first, int8_t move) {
}
_exit:
if (code != 0 && locked) {
metaReaderReleaseLock(&pTbCur->mr);
}
return code;
}
@ -791,6 +796,7 @@ void metaCloseSmaCursor(SMSmaCursor *pSmaCur) {
if (pSmaCur->pMeta) metaULock(pSmaCur->pMeta);
if (pSmaCur->pCur) {
(void)tdbTbcClose(pSmaCur->pCur);
pSmaCur->pCur = NULL;
tdbFree(pSmaCur->pKey);
tdbFree(pSmaCur->pVal);
@ -1307,7 +1313,8 @@ int32_t metaFilterTableIds(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
}
TAOS_CHECK_GOTO(metaCreateTagIdxKey(pCursor->suid, pCursor->cid, tagData, nTagData, pCursor->type,
param->reverse ? INT64_MAX : INT64_MIN, &pKey, &nKey), NULL, END);
param->reverse ? INT64_MAX : INT64_MIN, &pKey, &nKey),
NULL, END);
int cmp = 0;
TAOS_CHECK_GOTO(tdbTbcMoveTo(pCursor->pCur, pKey, nKey, &cmp), 0, END);

View File

@ -73,6 +73,10 @@ static int32_t initGroupColsInfo(SGroupColsInfo* pCols, bool grpColsMayBeNull, S
}
static void logGroupCacheExecInfo(SGroupCacheOperatorInfo* pGrpCacheOperator) {
if (pGrpCacheOperator->downstreamNum <= 0 || NULL == pGrpCacheOperator->execInfo.pDownstreamBlkNum) {
return;
}
char* buf = taosMemoryMalloc(pGrpCacheOperator->downstreamNum * 32 + 100);
if (NULL == buf) {
return;

View File

@ -440,7 +440,10 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
// try to filter data block according to current results
code = doDynamicPruneDataBlock(pOperator, pBlockInfo, status);
QUERY_CHECK_CODE(code, lino, _end);
if (code) {
pAPI->tsdReader.tsdReaderReleaseDataBlock(pTableScanInfo->dataReader);
QUERY_CHECK_CODE(code, lino, _end);
}
if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
qDebug("%s data block skipped due to dynamic prune, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64,

View File

@ -570,7 +570,12 @@ static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
if (pInfo->pCur == NULL) {
pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
} else {
(void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
if (code != 0) {
pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
pInfo->pCur = NULL;
QUERY_CHECK_CODE(code, lino, _end);
}
}
if (pInfo->pSchema == NULL) {
@ -786,7 +791,8 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
} else {
(void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
QUERY_CHECK_CODE(code, lino, _end);
}
while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
@ -1589,7 +1595,12 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
firstMetaCursor = 1;
}
if (!firstMetaCursor) {
(void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
if (code != 0) {
pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
pInfo->pCur = NULL;
QUERY_CHECK_CODE(code, lino, _end);
}
}
blockDataCleanup(pInfo->pRes);

View File

@ -2238,6 +2238,8 @@ static int32_t parseDataFromFileImpl(SInsertParseContext* pCxt, SVnodeModifyOpSt
if (pStmt->insertType != TSDB_QUERY_TYPE_FILE_INSERT) {
return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is exclusive", NULL);
}
} else {
return buildInvalidOperationMsg(&pCxt->msg, tstrerror(code));
}
// just record pTableCxt whose data come from file