提交 1c26d444 编写于 作者: X Xiaoyu Wang

Merge remote-tracking branch 'origin/3.0' into feat/3.0_systable_privilege_wxy

--- ---
title: 产品简介 title: 产品简介
description: 简要介绍 TDengine 的主要功能
toc_max_heading_level: 2 toc_max_heading_level: 2
--- ---
......
--- ---
sidebar_label: 基本概念
title: 数据模型和基本概念 title: 数据模型和基本概念
description: TDengine 的数据模型和基本概念
--- ---
为了便于解释基本概念,便于撰写示例程序,整个 TDengine 文档以智能电表作为典型时序数据场景。假设每个智能电表采集电流、电压、相位三个量,有多个智能电表,每个电表有位置 location 和分组 group ID 的静态属性. 其采集的数据类似如下的表格: 为了便于解释基本概念,便于撰写示例程序,整个 TDengine 文档以智能电表作为典型时序数据场景。假设每个智能电表采集电流、电压、相位三个量,有多个智能电表,每个电表有位置 location 和分组 group ID 的静态属性. 其采集的数据类似如下的表格:
......
--- ---
sidebar_label: Docker sidebar_label: Docker
title: 通过 Docker 快速体验 TDengine title: 通过 Docker 快速体验 TDengine
description: 使用 Docker 快速体验 TDengine 的高效写入和查询
--- ---
本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用[安装包的方式快速体验](../../get-started/package/)。如果您希望为 TDengine 贡献代码或对内部技术实现感兴趣,请参考 [TDengine GitHub 主页](https://github.com/taosdata/TDengine) 下载源码构建和安装. 本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用[安装包的方式快速体验](../../get-started/package/)。如果您希望为 TDengine 贡献代码或对内部技术实现感兴趣,请参考 [TDengine GitHub 主页](https://github.com/taosdata/TDengine) 下载源码构建和安装.
......
--- ---
sidebar_label: 安装包 sidebar_label: 安装包
title: 使用安装包立即开始 title: 使用安装包立即开始
description: 使用安装包快速体验 TDengine
--- ---
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
......
--- ---
title: 建立连接 title: 建立连接
description: "本节介绍如何使用连接器建立与 TDengine 的连接,给出连接器安装、连接的简单说明。" description: 使用连接器建立与 TDengine 的连接,以及连接器的安装和连接
--- ---
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
......
--- ---
sidebar_label: 数据建模
title: TDengine 数据建模 title: TDengine 数据建模
description: TDengine 中如何建立数据模型
--- ---
TDengine 采用类关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。 TDengine 采用类关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。
......
--- ---
sidebar_label: 写入数据
title: 写入数据 title: 写入数据
description: TDengine 的各种写入方式
--- ---
TDengine 支持多种写入协议,包括 SQL,InfluxDB Line 协议, OpenTSDB Telnet 协议,OpenTSDB JSON 格式协议。数据可以单条插入,也可以批量插入,可以插入一个数据采集点的数据,也可以同时插入多个数据采集点的数据。同时,TDengine 支持多线程插入,支持时间乱序数据插入,也支持历史数据插入。InfluxDB Line 协议、OpenTSDB Telnet 协议和 OpenTSDB JSON 格式协议是 TDengine 支持的三种无模式写入协议。使用无模式方式写入无需提前创建超级表和子表,并且引擎能自适用数据对表结构做调整。 TDengine 支持多种写入协议,包括 SQL,InfluxDB Line 协议, OpenTSDB Telnet 协议,OpenTSDB JSON 格式协议。数据可以单条插入,也可以批量插入,可以插入一个数据采集点的数据,也可以同时插入多个数据采集点的数据。同时,TDengine 支持多线程插入,支持时间乱序数据插入,也支持历史数据插入。InfluxDB Line 协议、OpenTSDB Telnet 协议和 OpenTSDB JSON 格式协议是 TDengine 支持的三种无模式写入协议。使用无模式方式写入无需提前创建超级表和子表,并且引擎能自适用数据对表结构做调整。
......
--- ---
sidebar_label: 查询数据
title: 查询数据 title: 查询数据
description: "主要查询功能,通过连接器执行同步查询和异步查询" description: "主要查询功能,通过连接器执行同步查询和异步查询"
--- ---
......
--- ---
title: 开发指南 title: 开发指南
sidebar_label: 开发指南
description: 让开发者能够快速上手的指南
--- ---
开发一个应用,如果你准备采用TDengine作为时序数据处理的工具,那么有如下几个事情要做: 开发一个应用,如果你准备采用TDengine作为时序数据处理的工具,那么有如下几个事情要做:
......
--- ---
sidebar_label: 错误码 sidebar_label: 错误码
title: TDengine C/C++ 连接器错误码 title: TDengine C/C++ 连接器错误码
description: C/C++ 连接器的错误码列表和详细说明
--- ---
本文中详细列举了在使用 TDengine C/C++ 连接器时客户端可能得到的错误码以及所要采取的相应动作。其它语言的连接器在使用原生连接方式时也会所得到的返回码返回给连接器的调用者。 本文中详细列举了在使用 TDengine C/C++ 连接器时客户端可能得到的错误码以及所要采取的相应动作。其它语言的连接器在使用原生连接方式时也会所得到的返回码返回给连接器的调用者。
......
--- ---
sidebar_label: 手动部署 sidebar_label: 手动部署
title: 集群部署和管理 title: 集群部署和管理
description: 使用命令行工具手动部署 TDengine 集群
--- ---
## 准备工作 ## 准备工作
......
--- ---
sidebar_label: Kubernetes sidebar_label: Kubernetes
title: 在 Kubernetes 上部署 TDengine 集群 title: 在 Kubernetes 上部署 TDengine 集群
description: 利用 Kubernetes 部署 TDengine 集群的详细指南
--- ---
作为面向云原生架构设计的时序数据库,TDengine 支持 Kubernetes 部署。这里介绍如何使用 YAML 文件一步一步从头创建一个 TDengine 集群,并重点介绍 Kubernetes 环境下 TDengine 的常用操作。 作为面向云原生架构设计的时序数据库,TDengine 支持 Kubernetes 部署。这里介绍如何使用 YAML 文件一步一步从头创建一个 TDengine 集群,并重点介绍 Kubernetes 环境下 TDengine 的常用操作。
......
--- ---
sidebar_label: Helm sidebar_label: Helm
title: 使用 Helm 部署 TDengine 集群 title: 使用 Helm 部署 TDengine 集群
description: 使用 Helm 部署 TDengine 集群的详细指南
--- ---
Helm 是 Kubernetes 的包管理器,上一节使用 Kubernets 部署 TDengine 集群的操作已经足够简单,但 Helm 依然可以提供更强大的能力。 Helm 是 Kubernetes 的包管理器,上一节使用 Kubernets 部署 TDengine 集群的操作已经足够简单,但 Helm 依然可以提供更强大的能力。
......
--- ---
sidebar_label: 部署集群
title: 部署集群 title: 部署集群
description: 部署 TDengine 集群的多种方式
--- ---
TDengine 支持集群,提供水平扩展的能力。如果需要获得更高的处理能力,只需要多增加节点即可。TDengine 采用虚拟节点技术,将一个节点虚拟化为多个虚拟节点,以实现负载均衡。同时,TDengine可以将多个节点上的虚拟节点组成虚拟节点组,通过多副本机制,以保证供系统的高可用。TDengine的集群功能完全开源。 TDengine 支持集群,提供水平扩展的能力。如果需要获得更高的处理能力,只需要多增加节点即可。TDengine 采用虚拟节点技术,将一个节点虚拟化为多个虚拟节点,以实现负载均衡。同时,TDengine可以将多个节点上的虚拟节点组成虚拟节点组,通过多副本机制,以保证供系统的高可用。TDengine的集群功能完全开源。
......
--- ---
title: 表管理 title: 表管理
sidebar_label:
description: 对表的各种管理操作
--- ---
## 创建表 ## 创建表
......
--- ---
sidebar_label: 超级表管理 sidebar_label: 超级表管理
title: 超级表 STable 管理 title: 超级表 STable 管理
description: 对超级表的各种管理操作
--- ---
## 创建超级表 ## 创建超级表
......
--- ---
sidebar_label: 数据写入 sidebar_label: 数据写入
title: 数据写入 title: 数据写入
description: 写入数据的详细语法
--- ---
## 写入语法 ## 写入语法
......
--- ---
sidebar_label: 数据查询 sidebar_label: 数据查询
title: 数据查询 title: 数据查询
description: 查询数据的详细语法
--- ---
## 查询语法 ## 查询语法
......
--- ---
sidebar_label: 函数 sidebar_label: 函数
title: 函数 title: 函数
description: TDengine 支持的函数列表
toc_max_heading_level: 4 toc_max_heading_level: 4
--- ---
......
--- ---
sidebar_label: 时序数据特色查询 sidebar_label: 时序数据特色查询
title: 时序数据特色查询 title: 时序数据特色查询
description: TDengine 提供的时序数据特有的查询功能
--- ---
TDengine 是专为时序数据而研发的大数据平台,存储和计算都针对时序数据的特定进行了量身定制,在支持标准 SQL 的基础之上,还提供了一系列贴合时序业务场景的特色查询语法,极大的方便时序场景的应用开发。 TDengine 是专为时序数据而研发的大数据平台,存储和计算都针对时序数据的特定进行了量身定制,在支持标准 SQL 的基础之上,还提供了一系列贴合时序业务场景的特色查询语法,极大的方便时序场景的应用开发。
......
--- ---
sidebar_label: 数据订阅 sidebar_label: 数据订阅
title: 数据订阅 title: 数据订阅
description: TDengine 消息队列提供的数据订阅功能
--- ---
TDengine 3.0.0.0 开始对消息队列做了大幅的优化和增强以简化用户的解决方案。 TDengine 3.0.0.0 开始对消息队列做了大幅的优化和增强以简化用户的解决方案。
......
--- ---
sidebar_label: 流式计算 sidebar_label: 流式计算
title: 流式计算 title: 流式计算
description: 流式计算的相关 SQL 的详细语法
--- ---
......
--- ---
sidebar_label: 运算符 sidebar_label: 运算符
title: 运算符 title: 运算符
description: TDengine 支持的所有运算符
--- ---
## 算术运算符 ## 算术运算符
......
--- ---
sidebar_label: JSON 类型使用说明 sidebar_label: JSON 类型使用说明
title: JSON 类型使用说明 title: JSON 类型使用说明
description: 对 JSON 类型如何使用的详细说明
--- ---
......
--- ---
title: 转义字符说明 title: 转义字符说明
sidebar_label: 转义字符
description: TDengine 中使用转义字符的详细规则
--- ---
## 转义字符表 ## 转义字符表
......
--- ---
sidebar_label: 命名与边界限制 sidebar_label: 命名与边界限制
title: 命名与边界限制 title: 命名与边界限制
description: 合法字符集和命名中的限制规则
--- ---
## 名称命名规则 ## 名称命名规则
......
--- ---
sidebar_label: 保留关键字 sidebar_label: 保留关键字
title: TDengine 保留关键字 title: TDengine 保留关键字
description: TDengine 保留关键字的详细列表
--- ---
## 保留关键字 ## 保留关键字
......
--- ---
sidebar_label: 集群管理 sidebar_label: 集群管理
title: 集群管理 title: 集群管理
description: 管理集群的 SQL 命令的详细解析
--- ---
组成 TDengine 集群的物理实体是 dnode (data node 的缩写),它是一个运行在操作系统之上的进程。在 dnode 中可以建立负责时序数据存储的 vnode (virtual node),在多节点集群环境下当某个数据库的 replica 为 3 时,该数据库中的每个 vgroup 由 3 个 vnode 组成;当数据库的 replica 为 1 时,该数据库中的每个 vgroup 由 1 个 vnode 组成。如果要想配置某个数据库为多副本,则集群中的 dnode 数量至少为 3。在 dnode 还可以创建 mnode (management node),单个集群中最多可以创建三个 mnode。在 TDengine 3.0.0.0 中为了支持存算分离,引入了一种新的逻辑节点 qnode (query node),qnode 和 vnode 既可以共存在一个 dnode 中,也可以完全分离在不同的 dnode 上。 组成 TDengine 集群的物理实体是 dnode (data node 的缩写),它是一个运行在操作系统之上的进程。在 dnode 中可以建立负责时序数据存储的 vnode (virtual node),在多节点集群环境下当某个数据库的 replica 为 3 时,该数据库中的每个 vgroup 由 3 个 vnode 组成;当数据库的 replica 为 1 时,该数据库中的每个 vgroup 由 1 个 vnode 组成。如果要想配置某个数据库为多副本,则集群中的 dnode 数量至少为 3。在 dnode 还可以创建 mnode (management node),单个集群中最多可以创建三个 mnode。在 TDengine 3.0.0.0 中为了支持存算分离,引入了一种新的逻辑节点 qnode (query node),qnode 和 vnode 既可以共存在一个 dnode 中,也可以完全分离在不同的 dnode 上。
......
--- ---
sidebar_label: 元数据 sidebar_label: 元数据
title: 存储元数据的 Information_Schema 数据库 title: 存储元数据的 Information_Schema 数据库
description: Information_Schema 数据库中存储了系统中所有的元数据信息
--- ---
TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。`INFORMATION_SCHEMA` 数据库旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)所提供的信息的访问。与 SHOW 语句相比,使用 SELECT ... FROM INFORMATION_SCHEMA.tablename 具有以下优点: TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。`INFORMATION_SCHEMA` 数据库旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)所提供的信息的访问。与 SHOW 语句相比,使用 SELECT ... FROM INFORMATION_SCHEMA.tablename 具有以下优点:
......
--- ---
sidebar_label: 统计数据 sidebar_label: 统计数据
title: 存储统计数据的 Performance_Schema 数据库 title: 存储统计数据的 Performance_Schema 数据库
description: Performance_Schema 数据库中存储了系统中的各种统计信息
--- ---
TDengine 3.0 版本开始提供一个内置数据库 `performance_schema`,其中存储了与性能有关的统计数据。本节详细介绍其中的表和表结构。 TDengine 3.0 版本开始提供一个内置数据库 `performance_schema`,其中存储了与性能有关的统计数据。本节详细介绍其中的表和表结构。
......
--- ---
sidebar_label: SHOW 命令 sidebar_label: SHOW 命令
title: 使用 SHOW 命令查看系统元数据 title: 使用 SHOW 命令查看系统元数据
description: SHOW 命令的完整列表
--- ---
SHOW 命令可以用来获取简要的系统信息。若想获取系统中详细的各种元数据、系统信息和状态,请使用 select 语句查询 INFORMATION_SCHEMA 数据库中的表。 SHOW 命令可以用来获取简要的系统信息。若想获取系统中详细的各种元数据、系统信息和状态,请使用 select 语句查询 INFORMATION_SCHEMA 数据库中的表。
......
--- ---
sidebar_label: 权限管理 sidebar_label: 权限管理
title: 权限管理 title: 权限管理
description: 企业版中才具有的权限管理功能
--- ---
本节讲述如何在 TDengine 中进行权限管理的相关操作。 本节讲述如何在 TDengine 中进行权限管理的相关操作。
......
--- ---
sidebar_label: 自定义函数 sidebar_label: 自定义函数
title: 用户自定义函数 title: 用户自定义函数
description: 使用 UDF 的详细指南
--- ---
除了 TDengine 的内置函数以外,用户还可以编写自己的函数逻辑并加入TDengine系统中。 除了 TDengine 的内置函数以外,用户还可以编写自己的函数逻辑并加入TDengine系统中。
......
--- ---
sidebar_label: 索引 sidebar_label: 索引
title: 使用索引 title: 使用索引
description: 索引功能的使用细节
--- ---
TDengine 从 3.0.0.0 版本开始引入了索引功能,支持 SMA 索引和 FULLTEXT 索引。 TDengine 从 3.0.0.0 版本开始引入了索引功能,支持 SMA 索引和 FULLTEXT 索引。
......
--- ---
sidebar_label: 异常恢复 sidebar_label: 异常恢复
title: 异常恢复 title: 异常恢复
description: 如何终止出现问题的连接、查询和事务以使系统恢复正常
--- ---
在一个复杂的应用场景中,连接和查询任务等有可能进入一种错误状态或者耗时过长迟迟无法结束,此时需要有能够终止这些连接或任务的方法。 在一个复杂的应用场景中,连接和查询任务等有可能进入一种错误状态或者耗时过长迟迟无法结束,此时需要有能够终止这些连接或任务的方法。
......
--- ---
title: TDinsight - 基于Grafana的TDengine零依赖监控解决方案 title: TDinsight
sidebar_label: TDinsight sidebar_label: TDinsight
description: 基于Grafana的TDengine零依赖监控解决方案
--- ---
TDinsight 是使用监控数据库和 [Grafana] 对 TDengine 进行监控的解决方案。 TDinsight 是使用监控数据库和 [Grafana] 对 TDengine 进行监控的解决方案。
......
--- ---
title: 参考手册 title: 参考手册
description: TDengine 中的各种组件的详细说明
--- ---
参考手册是对 TDengine 本身、 TDengine 各语言连接器及自带的工具最详细的介绍。 参考手册是对 TDengine 本身、 TDengine 各语言连接器及自带的工具最详细的介绍。
......
--- ---
sidebar_label: 容量规划 sidebar_label: 容量规划
title: 容量规划 title: 容量规划
description: 如何规划一个 TDengine 集群所需的物理资源
--- ---
使用 TDengine 来搭建一个物联网大数据平台,计算资源、存储资源需要根据业务场景进行规划。下面分别讨论系统运行所需要的内存、CPU 以及硬盘空间。 使用 TDengine 来搭建一个物联网大数据平台,计算资源、存储资源需要根据业务场景进行规划。下面分别讨论系统运行所需要的内存、CPU 以及硬盘空间。
......
--- ---
title: 容错和灾备 title: 容错和灾备
sidebar_label: 容错和灾备
description: TDengine 的容错和灾备功能
--- ---
## 容错 ## 容错
......
--- ---
title: 数据导入 title: 数据导入
description: 如何导入外部数据到 TDengine
--- ---
TDengine 提供多种方便的数据导入功能,一种按脚本文件导入,一种按数据文件导入,一种是 taosdump 工具导入本身导出的文件。 TDengine 提供多种方便的数据导入功能,一种按脚本文件导入,一种按数据文件导入,一种是 taosdump 工具导入本身导出的文件。
......
--- ---
title: 数据导出 title: 数据导出
description: 如何导出 TDengine 中的数据
--- ---
为方便数据导出,TDengine 提供了两种导出方式,分别是按表导出和用 taosdump 导出。 为方便数据导出,TDengine 提供了两种导出方式,分别是按表导出和用 taosdump 导出。
......
--- ---
title: 系统监控 title: 系统监控
description: 监控 TDengine 的运行状态
--- ---
TDengine 通过 [taosKeeper](/reference/taosKeeper/) 将服务器的 CPU、内存、硬盘空间、带宽、请求数、磁盘读写速度等信息定时写入指定数据库。TDengine 还将重要的系统操作(比如登录、创建、删除数据库等)日志以及各种错误报警信息进行记录。系统管理员可以从 CLI 直接查看这个数据库,也可以在 WEB 通过图形化界面查看这些监测信息。 TDengine 通过 [taosKeeper](/reference/taosKeeper/) 将服务器的 CPU、内存、硬盘空间、带宽、请求数、磁盘读写速度等信息定时写入指定数据库。TDengine 还将重要的系统操作(比如登录、创建、删除数据库等)日志以及各种错误报警信息进行记录。系统管理员可以从 CLI 直接查看这个数据库,也可以在 WEB 通过图形化界面查看这些监测信息。
......
--- ---
title: 诊断及其他 title: 诊断及其他
description: 一些常见问题的诊断技巧
--- ---
## 网络连接诊断 ## 网络连接诊断
......
--- ---
sidebar_label: Grafana sidebar_label: Grafana
title: Grafana title: Grafana
description: 使用 Grafana 与 TDengine 的详细说明
--- ---
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
......
--- ---
sidebar_label: Prometheus sidebar_label: Prometheus
title: Prometheus title: Prometheus
description: 使用 Prometheus 访问 TDengine
--- ---
import Prometheus from "../14-reference/_prometheus.mdx" import Prometheus from "../14-reference/_prometheus.mdx"
......
--- ---
sidebar_label: Telegraf sidebar_label: Telegraf
title: Telegraf 写入 title: Telegraf 写入
description: 使用 Telegraf 向 TDengine 写入数据
--- ---
import Telegraf from "../14-reference/_telegraf.mdx" import Telegraf from "../14-reference/_telegraf.mdx"
......
--- ---
sidebar_label: collectd sidebar_label: collectd
title: collectd 写入 title: collectd 写入
description: 使用 collected 向 TDengine 写入数据
--- ---
import CollectD from "../14-reference/_collectd.mdx" import CollectD from "../14-reference/_collectd.mdx"
......
--- ---
sidebar_label: StatsD sidebar_label: StatsD
title: StatsD 直接写入 title: StatsD 直接写入
description: 使用 StatsD 向 TDengine 写入
--- ---
import StatsD from "../14-reference/_statsd.mdx" import StatsD from "../14-reference/_statsd.mdx"
......
--- ---
sidebar_label: icinga2 sidebar_label: icinga2
title: icinga2 写入 title: icinga2 写入
description: 使用 icinga2 写入 TDengine
--- ---
import Icinga2 from "../14-reference/_icinga2.mdx" import Icinga2 from "../14-reference/_icinga2.mdx"
......
--- ---
sidebar_label: TCollector sidebar_label: TCollector
title: TCollector 写入 title: TCollector 写入
description: 使用 TCollector 写入 TDengine
--- ---
import TCollector from "../14-reference/_tcollector.mdx" import TCollector from "../14-reference/_tcollector.mdx"
......
--- ---
sidebar_label: EMQX Broker sidebar_label: EMQX Broker
title: EMQX Broker 写入 title: EMQX Broker 写入
description: 使用 EMQX Broker 写入 TDengine
--- ---
MQTT 是流行的物联网数据传输协议,[EMQX](https://github.com/emqx/emqx)是一开源的 MQTT Broker 软件,无需任何代码,只需要在 EMQX Dashboard 里使用“规则”做简单配置,即可将 MQTT 的数据直接写入 TDengine。EMQX 支持通过 发送到 Web 服务的方式保存数据到 TDengine,也在企业版上提供原生的 TDengine 驱动实现直接保存。 MQTT 是流行的物联网数据传输协议,[EMQX](https://github.com/emqx/emqx)是一开源的 MQTT Broker 软件,无需任何代码,只需要在 EMQX Dashboard 里使用“规则”做简单配置,即可将 MQTT 的数据直接写入 TDengine。EMQX 支持通过 发送到 Web 服务的方式保存数据到 TDengine,也在企业版上提供原生的 TDengine 驱动实现直接保存。
......
--- ---
sidebar_label: HiveMQ Broker sidebar_label: HiveMQ Broker
title: HiveMQ Broker 写入 title: HiveMQ Broker 写入
description: 使用 HivMQ Broker 写入 TDengine
--- ---
[HiveMQ](https://www.hivemq.com/) 是一个提供免费个人版和企业版的 MQTT 代理,主要用于企业和新兴的机器到机器 M2M 通讯和内部传输,满足可伸缩性、易管理和安全特性。HiveMQ 提供了开源的插件开发包。可以通过 HiveMQ extension - TDengine 保存数据到 TDengine。详细使用方法请参考 [HiveMQ extension - TDengine 说明文档](https://github.com/huskar-t/hivemq-tdengine-extension/blob/b62a26ecc164a310104df57691691b237e091c89/README.md) [HiveMQ](https://www.hivemq.com/) 是一个提供免费个人版和企业版的 MQTT 代理,主要用于企业和新兴的机器到机器 M2M 通讯和内部传输,满足可伸缩性、易管理和安全特性。HiveMQ 提供了开源的插件开发包。可以通过 HiveMQ extension - TDengine 保存数据到 TDengine。详细使用方法请参考 [HiveMQ extension - TDengine 说明文档](https://github.com/huskar-t/hivemq-tdengine-extension/blob/b62a26ecc164a310104df57691691b237e091c89/README.md)
--- ---
sidebar_label: Kafka sidebar_label: Kafka
title: TDengine Kafka Connector 使用教程 title: TDengine Kafka Connector
description: 使用 TDengine Kafka Connector 的详细指南
--- ---
TDengine Kafka Connector 包含两个插件: TDengine Source Connector 和 TDengine Sink Connector。用户只需提供简单的配置文件,就可以将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine, 或将 TDengine 中指定数据库的数据(批量或实时)同步到 Kafka。 TDengine Kafka Connector 包含两个插件: TDengine Source Connector 和 TDengine Sink Connector。用户只需提供简单的配置文件,就可以将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine, 或将 TDengine 中指定数据库的数据(批量或实时)同步到 Kafka。
......
--- ---
sidebar_label: 整体架构 sidebar_label: 整体架构
title: 整体架构 title: 整体架构
description: TDengine 架构设计,包括:集群、存储、缓存与持久化、数据备份、多级存储等
--- ---
## 集群与基本逻辑单元 ## 集群与基本逻辑单元
......
--- ---
title: 高可用 title: 高可用
description: TDengine 的高可用设计
--- ---
## Vnode 的高可用性 ## Vnode 的高可用性
......
--- ---
title: 负载均衡 title: 负载均衡
description: TDengine 的负载均衡设计
--- ---
TDengine 中的负载均衡主要指对时序数据的处理的负载均衡。TDengine 采用 Hash 一致性算法将一个数据库中的所有表和子表的数据均衡分散在属于该数据库的所有 vgroup 中,每张表或子表只能由一个 vgroup 处理,一个 vgroup 可能负责处理多个表或子表。 TDengine 中的负载均衡主要指对时序数据的处理的负载均衡。TDengine 采用 Hash 一致性算法将一个数据库中的所有表和子表的数据均衡分散在属于该数据库的所有 vgroup 中,每张表或子表只能由一个 vgroup 处理,一个 vgroup 可能负责处理多个表或子表。
...@@ -7,7 +8,7 @@ TDengine 中的负载均衡主要指对时序数据的处理的负载均衡。TD ...@@ -7,7 +8,7 @@ TDengine 中的负载均衡主要指对时序数据的处理的负载均衡。TD
创建数据库时可以指定其中的 vgroup 的数量: 创建数据库时可以指定其中的 vgroup 的数量:
```sql ```sql
create database db0 vgroups 100; create database db0 vgroups 20;
``` ```
如何指定合适的 vgroup 的数量,这取决于系统资源。假定系统中只计划建立一个数据库,则 vgroup 数量由集群中所有 dnode 所能使用的资源决定。原则上可用的 CPU 和 Memory 越多,可建立的 vgroup 也越多。但也要考虑到磁盘性能,过多的 vgroup 在磁盘性能达到上限后反而会拖累整个系统的性能。假如系统中会建立多个数据库,则多个数据库的 vgroup 之和取决于系统中可用资源的数量。要综合考虑多个数据库之间表的数量、写入频率、数据量等多个因素在多个数据库之间分配 vgroup。实际中建议首先根据系统资源配置选择一个初始的 vgroup 数量,比如 CPU 总核数的 2 倍,以此为起点通过测试找到最佳的 vgroup 数量配置,此为系统中的 vgroup 总数。如果有多个数据库的话,再根据各个数据库的表数和数据量对 vgroup 进行分配。 如何指定合适的 vgroup 的数量,这取决于系统资源。假定系统中只计划建立一个数据库,则 vgroup 数量由集群中所有 dnode 所能使用的资源决定。原则上可用的 CPU 和 Memory 越多,可建立的 vgroup 也越多。但也要考虑到磁盘性能,过多的 vgroup 在磁盘性能达到上限后反而会拖累整个系统的性能。假如系统中会建立多个数据库,则多个数据库的 vgroup 之和取决于系统中可用资源的数量。要综合考虑多个数据库之间表的数量、写入频率、数据量等多个因素在多个数据库之间分配 vgroup。实际中建议首先根据系统资源配置选择一个初始的 vgroup 数量,比如 CPU 总核数的 2 倍,以此为起点通过测试找到最佳的 vgroup 数量配置,此为系统中的 vgroup 总数。如果有多个数据库的话,再根据各个数据库的表数和数据量对 vgroup 进行分配。
......
--- ---
title: 技术内幕 title: 技术内幕
description: TDengine 的内部设计
--- ---
```mdx-code-block ```mdx-code-block
......
--- ---
sidebar_label: TDengine + Telegraf + Grafana sidebar_label: TDengine + Telegraf + Grafana
title: 使用 TDengine + Telegraf + Grafana 快速搭建 IT 运维展示系统 title: TDengine + Telegraf + Grafana
description: 使用 TDengine + Telegraf + Grafana 快速搭建 IT 运维展示系统
--- ---
## 背景介绍 ## 背景介绍
......
--- ---
sidebar_label: TDengine + collectd/StatsD + Grafana sidebar_label: TDengine + collectd/StatsD + Grafana
title: 使用 TDengine + collectd/StatsD + Grafana 快速搭建 IT 运维监控系统 title: TDengine + collectd/StatsD + Grafana
description: 使用 TDengine + collectd/StatsD + Grafana 快速搭建 IT 运维监控系统
--- ---
## 背景介绍 ## 背景介绍
......
--- ---
title: 应用实践 title: 应用实践
description: TDengine 配合其它开源组件的一些应用示例
--- ---
```mdx-code-block ```mdx-code-block
......
--- ---
title: 常见问题及反馈 title: 常见问题及反馈
description: 一些常见问题的解决方法汇总
--- ---
## 问题反馈 ## 问题反馈
......
--- ---
title: FAQ 及其他 title: FAQ 及其他
description: 用户经常遇到的问题
--- ---
```mdx-code-block ```mdx-code-block
......
--- ---
sidebar_label: TDengine 发布历史 sidebar_label: TDengine 发布历史
title: TDengine 发布历史 title: TDengine 发布历史
description: TDengine 发布历史、Release Notes 及下载链接
--- ---
import Release from "/components/ReleaseV3"; import Release from "/components/ReleaseV3";
......
--- ---
sidebar_label: taosTools 发布历史 sidebar_label: taosTools 发布历史
title: taosTools 发布历史 title: taosTools 发布历史
description: taosTools 的发布历史、Release Notes 和下载链接
--- ---
import Release from "/components/ReleaseV3"; import Release from "/components/ReleaseV3";
......
...@@ -268,6 +268,35 @@ STSRow* tGetSubmitBlkNext(SSubmitBlkIter* pIter); ...@@ -268,6 +268,35 @@ STSRow* tGetSubmitBlkNext(SSubmitBlkIter* pIter);
// for debug // for debug
int32_t tPrintFixedSchemaSubmitReq(SSubmitReq* pReq, STSchema* pSchema); int32_t tPrintFixedSchemaSubmitReq(SSubmitReq* pReq, STSchema* pSchema);
struct SSchema {
int8_t type;
int8_t flags;
col_id_t colId;
int32_t bytes;
char name[TSDB_COL_NAME_LEN];
};
typedef struct {
char tbName[TSDB_TABLE_NAME_LEN];
char stbName[TSDB_TABLE_NAME_LEN];
char dbFName[TSDB_DB_FNAME_LEN];
int64_t dbId;
int32_t numOfTags;
int32_t numOfColumns;
int8_t precision;
int8_t tableType;
int32_t sversion;
int32_t tversion;
uint64_t suid;
uint64_t tuid;
int32_t vgId;
int8_t sysInfo;
SSchema* pSchemas;
} STableMetaRsp;
typedef struct { typedef struct {
int32_t code; int32_t code;
int8_t hashMeta; int8_t hashMeta;
...@@ -276,6 +305,7 @@ typedef struct { ...@@ -276,6 +305,7 @@ typedef struct {
int32_t numOfRows; int32_t numOfRows;
int32_t affectedRows; int32_t affectedRows;
int64_t sver; int64_t sver;
STableMetaRsp* pMeta;
} SSubmitBlkRsp; } SSubmitBlkRsp;
typedef struct { typedef struct {
...@@ -290,6 +320,7 @@ typedef struct { ...@@ -290,6 +320,7 @@ typedef struct {
int32_t tEncodeSSubmitRsp(SEncoder* pEncoder, const SSubmitRsp* pRsp); int32_t tEncodeSSubmitRsp(SEncoder* pEncoder, const SSubmitRsp* pRsp);
int32_t tDecodeSSubmitRsp(SDecoder* pDecoder, SSubmitRsp* pRsp); int32_t tDecodeSSubmitRsp(SDecoder* pDecoder, SSubmitRsp* pRsp);
void tFreeSSubmitBlkRsp(void* param);
void tFreeSSubmitRsp(SSubmitRsp* pRsp); void tFreeSSubmitRsp(SSubmitRsp* pRsp);
#define COL_SMA_ON ((int8_t)0x1) #define COL_SMA_ON ((int8_t)0x1)
...@@ -297,13 +328,6 @@ void tFreeSSubmitRsp(SSubmitRsp* pRsp); ...@@ -297,13 +328,6 @@ void tFreeSSubmitRsp(SSubmitRsp* pRsp);
#define COL_SET_NULL ((int8_t)0x10) #define COL_SET_NULL ((int8_t)0x10)
#define COL_SET_VAL ((int8_t)0x20) #define COL_SET_VAL ((int8_t)0x20)
#define COL_IS_SYSINFO ((int8_t)0x40) #define COL_IS_SYSINFO ((int8_t)0x40)
struct SSchema {
int8_t type;
int8_t flags;
col_id_t colId;
int32_t bytes;
char name[TSDB_COL_NAME_LEN];
};
#define COL_IS_SET(FLG) (((FLG) & (COL_SET_VAL | COL_SET_NULL)) != 0) #define COL_IS_SET(FLG) (((FLG) & (COL_SET_VAL | COL_SET_NULL)) != 0)
#define COL_CLR_SET(FLG) ((FLG) &= (~(COL_SET_VAL | COL_SET_NULL))) #define COL_CLR_SET(FLG) ((FLG) &= (~(COL_SET_VAL | COL_SET_NULL)))
...@@ -442,26 +466,6 @@ static FORCE_INLINE int32_t tDecodeSSchemaWrapperEx(SDecoder* pDecoder, SSchemaW ...@@ -442,26 +466,6 @@ static FORCE_INLINE int32_t tDecodeSSchemaWrapperEx(SDecoder* pDecoder, SSchemaW
STSchema* tdGetSTSChemaFromSSChema(SSchema* pSchema, int32_t nCols, int32_t sver); STSchema* tdGetSTSChemaFromSSChema(SSchema* pSchema, int32_t nCols, int32_t sver);
typedef struct {
char tbName[TSDB_TABLE_NAME_LEN];
char stbName[TSDB_TABLE_NAME_LEN];
char dbFName[TSDB_DB_FNAME_LEN];
int64_t dbId;
int32_t numOfTags;
int32_t numOfColumns;
int8_t precision;
int8_t tableType;
int32_t sversion;
int32_t tversion;
uint64_t suid;
uint64_t tuid;
int32_t vgId;
int8_t sysInfo;
SSchema* pSchemas;
} STableMetaRsp;
typedef struct { typedef struct {
char name[TSDB_TABLE_FNAME_LEN]; char name[TSDB_TABLE_FNAME_LEN];
int8_t igExists; int8_t igExists;
......
...@@ -723,6 +723,12 @@ int32_t handleSubmitExecRes(SRequestObj* pRequest, void* res, SCatalog* pCatalog ...@@ -723,6 +723,12 @@ int32_t handleSubmitExecRes(SRequestObj* pRequest, void* res, SCatalog* pCatalog
for (int32_t i = 0; i < pRsp->nBlocks; ++i) { for (int32_t i = 0; i < pRsp->nBlocks; ++i) {
SSubmitBlkRsp* blk = pRsp->pBlocks + i; SSubmitBlkRsp* blk = pRsp->pBlocks + i;
if (blk->pMeta) {
handleCreateTbExecRes(blk->pMeta, pCatalog);
tFreeSTableMetaRsp(blk->pMeta);
taosMemoryFreeClear(blk->pMeta);
}
if (NULL == blk->tblFName || 0 == blk->tblFName[0]) { if (NULL == blk->tblFName || 0 == blk->tblFName[0]) {
continue; continue;
} }
......
...@@ -420,6 +420,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { ...@@ -420,6 +420,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddInt32(pCfg, "mqRebalanceInterval", tsMqRebalanceInterval, 1, 10000, 1) != 0) return -1; if (cfgAddInt32(pCfg, "mqRebalanceInterval", tsMqRebalanceInterval, 1, 10000, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "ttlUnit", tsTtlUnit, 1, 86400 * 365, 1) != 0) return -1; if (cfgAddInt32(pCfg, "ttlUnit", tsTtlUnit, 1, 86400 * 365, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "ttlPushInterval", tsTtlPushInterval, 1, 100000, 1) != 0) return -1; if (cfgAddInt32(pCfg, "ttlPushInterval", tsTtlPushInterval, 1, 100000, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "uptimeInterval", tsUptimeInterval, 1, 100000, 1) != 0) return -1;
if (cfgAddBool(pCfg, "udf", tsStartUdfd, 0) != 0) return -1; if (cfgAddBool(pCfg, "udf", tsStartUdfd, 0) != 0) return -1;
GRANT_CFG_ADD; GRANT_CFG_ADD;
...@@ -567,6 +568,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { ...@@ -567,6 +568,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
tsMqRebalanceInterval = cfgGetItem(pCfg, "mqRebalanceInterval")->i32; tsMqRebalanceInterval = cfgGetItem(pCfg, "mqRebalanceInterval")->i32;
tsTtlUnit = cfgGetItem(pCfg, "ttlUnit")->i32; tsTtlUnit = cfgGetItem(pCfg, "ttlUnit")->i32;
tsTtlPushInterval = cfgGetItem(pCfg, "ttlPushInterval")->i32; tsTtlPushInterval = cfgGetItem(pCfg, "ttlPushInterval")->i32;
tsUptimeInterval = cfgGetItem(pCfg, "uptimeInterval")->i32;
tsStartUdfd = cfgGetItem(pCfg, "udf")->bval; tsStartUdfd = cfgGetItem(pCfg, "udf")->bval;
......
...@@ -5324,6 +5324,10 @@ static int32_t tEncodeSSubmitBlkRsp(SEncoder *pEncoder, const SSubmitBlkRsp *pBl ...@@ -5324,6 +5324,10 @@ static int32_t tEncodeSSubmitBlkRsp(SEncoder *pEncoder, const SSubmitBlkRsp *pBl
if (tEncodeI32v(pEncoder, pBlock->numOfRows) < 0) return -1; if (tEncodeI32v(pEncoder, pBlock->numOfRows) < 0) return -1;
if (tEncodeI32v(pEncoder, pBlock->affectedRows) < 0) return -1; if (tEncodeI32v(pEncoder, pBlock->affectedRows) < 0) return -1;
if (tEncodeI64v(pEncoder, pBlock->sver) < 0) return -1; if (tEncodeI64v(pEncoder, pBlock->sver) < 0) return -1;
if (tEncodeI32(pEncoder, pBlock->pMeta ? 1 : 0) < 0) return -1;
if (pBlock->pMeta) {
if (tEncodeSTableMetaRsp(pEncoder, pBlock->pMeta) < 0) return -1;
}
tEndEncode(pEncoder); tEndEncode(pEncoder);
return 0; return 0;
...@@ -5342,6 +5346,16 @@ static int32_t tDecodeSSubmitBlkRsp(SDecoder *pDecoder, SSubmitBlkRsp *pBlock) { ...@@ -5342,6 +5346,16 @@ static int32_t tDecodeSSubmitBlkRsp(SDecoder *pDecoder, SSubmitBlkRsp *pBlock) {
if (tDecodeI32v(pDecoder, &pBlock->affectedRows) < 0) return -1; if (tDecodeI32v(pDecoder, &pBlock->affectedRows) < 0) return -1;
if (tDecodeI64v(pDecoder, &pBlock->sver) < 0) return -1; if (tDecodeI64v(pDecoder, &pBlock->sver) < 0) return -1;
int32_t meta = 0;
if (tDecodeI32(pDecoder, &meta) < 0) return -1;
if (meta) {
pBlock->pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
if (NULL == pBlock->pMeta) return -1;
if (tDecodeSTableMetaRsp(pDecoder, pBlock->pMeta) < 0) return -1;
} else {
pBlock->pMeta = NULL;
}
tEndDecode(pDecoder); tEndDecode(pDecoder);
return 0; return 0;
} }
...@@ -5379,6 +5393,21 @@ int32_t tDecodeSSubmitRsp(SDecoder *pDecoder, SSubmitRsp *pRsp) { ...@@ -5379,6 +5393,21 @@ int32_t tDecodeSSubmitRsp(SDecoder *pDecoder, SSubmitRsp *pRsp) {
return 0; return 0;
} }
void tFreeSSubmitBlkRsp(void* param) {
if (NULL == param) {
return;
}
SSubmitBlkRsp* pRsp = (SSubmitBlkRsp*)param;
taosMemoryFree(pRsp->tblFName);
if (pRsp->pMeta) {
taosMemoryFree(pRsp->pMeta->pSchemas);
taosMemoryFree(pRsp->pMeta);
}
}
void tFreeSSubmitRsp(SSubmitRsp *pRsp) { void tFreeSSubmitRsp(SSubmitRsp *pRsp) {
if (NULL == pRsp) return; if (NULL == pRsp) return;
......
...@@ -132,7 +132,7 @@ static void *mndThreadFp(void *param) { ...@@ -132,7 +132,7 @@ static void *mndThreadFp(void *param) {
mndCalMqRebalance(pMnode); mndCalMqRebalance(pMnode);
} }
if (lastTime % (tsTelemInterval * 10) == 1) { if (lastTime % (tsTelemInterval * 10) == ((tsTelemInterval - 1) * 10)) {
mndPullupTelem(pMnode); mndPullupTelem(pMnode);
} }
......
...@@ -867,7 +867,7 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq ...@@ -867,7 +867,7 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq
goto _exit; goto _exit;
} }
if (metaCreateTable(pVnode->pMeta, version, &createTbReq, NULL) < 0) { if (metaCreateTable(pVnode->pMeta, version, &createTbReq, &submitBlkRsp.pMeta) < 0) {
if (terrno != TSDB_CODE_TDB_TABLE_ALREADY_EXIST) { if (terrno != TSDB_CODE_TDB_TABLE_ALREADY_EXIST) {
submitBlkRsp.code = terrno; submitBlkRsp.code = terrno;
pRsp->code = terrno; pRsp->code = terrno;
...@@ -875,6 +875,10 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq ...@@ -875,6 +875,10 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq
taosArrayDestroy(createTbReq.ctb.tagName); taosArrayDestroy(createTbReq.ctb.tagName);
goto _exit; goto _exit;
} }
} else {
if (NULL != submitBlkRsp.pMeta) {
vnodeUpdateMetaRsp(pVnode, submitBlkRsp.pMeta);
}
} }
taosArrayPush(newTbUids, &createTbReq.uid); taosArrayPush(newTbUids, &createTbReq.uid);
...@@ -918,11 +922,7 @@ _exit: ...@@ -918,11 +922,7 @@ _exit:
tEncodeSSubmitRsp(&encoder, &submitRsp); tEncodeSSubmitRsp(&encoder, &submitRsp);
tEncoderClear(&encoder); tEncoderClear(&encoder);
for (int32_t i = 0; i < taosArrayGetSize(submitRsp.pArray); i++) { taosArrayDestroyEx(submitRsp.pArray, tFreeSSubmitBlkRsp);
taosMemoryFree(((SSubmitBlkRsp *)taosArrayGet(submitRsp.pArray, i))[0].tblFName);
}
taosArrayDestroy(submitRsp.pArray);
// TODO: the partial success scenario and the error case // TODO: the partial success scenario and the error case
// => If partial success, extract the success submitted rows and reconstruct a new submit msg, and push to level // => If partial success, extract the success submitted rows and reconstruct a new submit msg, and push to level
......
...@@ -934,6 +934,8 @@ static int tdbFetchOvflPage(SPgno *pPgno, SPage **ppOfp, TXN *pTxn, SBTree *pBt) ...@@ -934,6 +934,8 @@ static int tdbFetchOvflPage(SPgno *pPgno, SPage **ppOfp, TXN *pTxn, SBTree *pBt)
return -1; return -1;
} }
tdbPCacheRelease(pBt->pPager->pCache, *ppOfp, pTxn);
return ret; return ret;
} }
...@@ -1277,6 +1279,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, ...@@ -1277,6 +1279,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader,
nLeft -= bytes; nLeft -= bytes;
memcpy(&pgno, ofpCell + bytes, sizeof(pgno)); memcpy(&pgno, ofpCell + bytes, sizeof(pgno));
tdbPCacheRelease(pBt->pPager->pCache, ofp, pTxn);
} }
} else { } else {
int nLeftKey = kLen; int nLeftKey = kLen;
...@@ -1336,6 +1340,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, ...@@ -1336,6 +1340,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader,
memcpy(&pgno, ofpCell + bytes, sizeof(pgno)); memcpy(&pgno, ofpCell + bytes, sizeof(pgno));
tdbPCacheRelease(pBt->pPager->pCache, ofp, pTxn);
nLeftKey -= bytes; nLeftKey -= bytes;
nLeft -= bytes; nLeft -= bytes;
} }
...@@ -1374,6 +1380,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, ...@@ -1374,6 +1380,8 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader,
memcpy(&pgno, ofpCell + vLen - nLeft + bytes, sizeof(pgno)); memcpy(&pgno, ofpCell + vLen - nLeft + bytes, sizeof(pgno));
tdbPCacheRelease(pBt->pPager->pCache, ofp, pTxn);
nLeft -= bytes; nLeft -= bytes;
} }
} }
......
...@@ -111,6 +111,7 @@ void tdbPCacheRelease(SPCache *pCache, SPage *pPage, TXN *pTxn) { ...@@ -111,6 +111,7 @@ void tdbPCacheRelease(SPCache *pCache, SPage *pPage, TXN *pTxn) {
tdbPCacheLock(pCache); tdbPCacheLock(pCache);
nRef = tdbUnrefPage(pPage); nRef = tdbUnrefPage(pPage);
tdbDebug("pcache/release page %p/%d/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id, nRef);
if (nRef == 0) { if (nRef == 0) {
// test the nRef again to make sure // test the nRef again to make sure
// it is safe th handle the page // it is safe th handle the page
...@@ -212,7 +213,8 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) ...@@ -212,7 +213,8 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
pPage->pPager = pPageH->pPager; pPage->pPager = pPageH->pPager;
memcpy(pPage->pData, pPageH->pData, pPage->pageSize); memcpy(pPage->pData, pPageH->pData, pPage->pageSize);
tdbDebug("pcache/pPageH: %p %d %p %p", pPageH, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize, pPage); tdbDebug("pcache/pPageH: %p %d %p %p %d", pPageH, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize, pPage,
TDB_PAGE_PGNO(pPageH));
tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize); tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize);
pPage->kLen = pPageH->kLen; pPage->kLen = pPageH->kLen;
pPage->vLen = pPageH->vLen; pPage->vLen = pPageH->vLen;
...@@ -243,7 +245,7 @@ static void tdbPCachePinPage(SPCache *pCache, SPage *pPage) { ...@@ -243,7 +245,7 @@ static void tdbPCachePinPage(SPCache *pCache, SPage *pPage) {
pCache->nRecyclable--; pCache->nRecyclable--;
// printf("pin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage); // printf("pin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
tdbDebug("pin page %d", pPage->id); tdbDebug("pcache/pin page %p/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id);
} }
} }
...@@ -264,29 +266,23 @@ static void tdbPCacheUnpinPage(SPCache *pCache, SPage *pPage) { ...@@ -264,29 +266,23 @@ static void tdbPCacheUnpinPage(SPCache *pCache, SPage *pPage) {
pCache->nRecyclable++; pCache->nRecyclable++;
// printf("unpin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage); // printf("unpin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
tdbDebug("unpin page %d", pPage->id); tdbDebug("pcache/unpin page %p/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id);
} }
static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage) { static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage) {
uint32_t h = tdbPCachePageHash(&(pPage->pgid)) % pCache->nHash; uint32_t h = tdbPCachePageHash(&(pPage->pgid)) % pCache->nHash;
SPage **ppPage = &(pCache->pgHash[h]); SPage **ppPage = &(pCache->pgHash[h]);
if (*ppPage == pPage) { for (; (*ppPage) && *ppPage != pPage; ppPage = &((*ppPage)->pHashNext))
pCache->pgHash[h] = pPage->pHashNext;
} else {
for (; (*ppPage) && (*ppPage)->pHashNext != pPage; ppPage = &((*ppPage)->pHashNext))
; ;
if (*ppPage) { if (*ppPage) {
(*ppPage)->pHashNext = pPage->pHashNext; *ppPage = pPage->pHashNext;
} pCache->nPage--;
}
if (*ppPage) {
pPage->pHashNext = NULL;
--pCache->nPage;
// printf("rmv page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage); // printf("rmv page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
} }
tdbDebug("remove page %p/%d from hash", pPage, pPage->id); tdbDebug("pcache/remove page %p/%d/%d from hash %" PRIu32, pPage, TDB_PAGE_PGNO(pPage), pPage->id, h);
} }
static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) { static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) {
...@@ -298,7 +294,7 @@ static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) { ...@@ -298,7 +294,7 @@ static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) {
pCache->nPage++; pCache->nPage++;
// printf("add page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage); // printf("add page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
tdbDebug("add page %p/%d to hash", pPage, pPage->id); tdbDebug("pcache/add page %p/%d/%d to hash %" PRIu32, pPage, TDB_PAGE_PGNO(pPage), pPage->id, h);
} }
static int tdbPCacheOpenImpl(SPCache *pCache) { static int tdbPCacheOpenImpl(SPCache *pCache) {
......
...@@ -68,6 +68,8 @@ int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t) ...@@ -68,6 +68,8 @@ int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t)
} }
*ppPage = pPage; *ppPage = pPage;
tdbDebug("page/create: %p %p", pPage, xMalloc);
return 0; return 0;
} }
......
...@@ -4,6 +4,7 @@ system sh/cfg.sh -n dnode1 -c monitorfqdn -v localhost ...@@ -4,6 +4,7 @@ system sh/cfg.sh -n dnode1 -c monitorfqdn -v localhost
system sh/cfg.sh -n dnode1 -c monitorport -v 80 system sh/cfg.sh -n dnode1 -c monitorport -v 80
system sh/cfg.sh -n dnode1 -c monitorInterval -v 1 system sh/cfg.sh -n dnode1 -c monitorInterval -v 1
system sh/cfg.sh -n dnode1 -c monitorComp -v 1 system sh/cfg.sh -n dnode1 -c monitorComp -v 1
system sh/cfg.sh -n dnode1 -c uptimeInterval -v 3
#system sh/cfg.sh -n dnode1 -c supportVnodes -v 128 #system sh/cfg.sh -n dnode1 -c supportVnodes -v 128
#system sh/cfg.sh -n dnode1 -c telemetryReporting -v 1 #system sh/cfg.sh -n dnode1 -c telemetryReporting -v 1
...@@ -14,7 +15,7 @@ system sh/cfg.sh -n dnode1 -c monitorComp -v 1 ...@@ -14,7 +15,7 @@ system sh/cfg.sh -n dnode1 -c monitorComp -v 1
system sh/exec.sh -n dnode1 -s start system sh/exec.sh -n dnode1 -s start
sql connect sql connect
print =============== select * from information_schema.ins_dnodes print =============== create database
sql create database db vgroups 2; sql create database db vgroups 2;
sql use db; sql use db;
sql create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 binary(16)) comment "abd"; sql create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 binary(16)) comment "abd";
......
...@@ -8,7 +8,20 @@ sql create user sysinfo0 pass 'taosdata' ...@@ -8,7 +8,20 @@ sql create user sysinfo0 pass 'taosdata'
sql create user sysinfo1 pass 'taosdata' sql create user sysinfo1 pass 'taosdata'
sql alter user sysinfo0 sysinfo 0 sql alter user sysinfo0 sysinfo 0
sql alter user sysinfo1 sysinfo 1 sql alter user sysinfo1 sysinfo 1
sql create database db sql create database db
sql use db
sql create table db.stb (ts timestamp, i int) tags (t int)
sql create table db.ctb using db.stb tags (1)
sql create table db.ntb (ts timestamp, i int)
sql insert into db.ctb values (now, 1);
sql insert into db.ntb values (now, 1);
sql select * from db.stb
sql select * from db.ctb
sql select * from db.ntb
sql create database d2
sql GRANT all ON d2.* to sysinfo0;
print user sysinfo0 login print user sysinfo0 login
sql close sql close
...@@ -17,11 +30,31 @@ sql connect sysinfo0 ...@@ -17,11 +30,31 @@ sql connect sysinfo0
print =============== check oper print =============== check oper
sql_error create user u1 pass 'u1' sql_error create user u1 pass 'u1'
sql_error drop user sysinfo1 sql_error drop user sysinfo1
sql_error alter user sysinfo1 pass '1'
sql_error alter user sysinfo0 pass '1' sql_error alter user sysinfo0 pass '1'
sql_error alter user sysinfo0 enable 0
sql_error alter user sysinfo0 enable 1
sql_error alter user sysinfo1 pass '1'
sql_error alter user sysinfo1 enable 1
sql_error alter user sysinfo1 enable 1
sql_error GRANT read ON db.* to sysinfo0;
sql_error GRANT read ON *.* to sysinfo0;
sql_error REVOKE read ON db.* from sysinfo0;
sql_error REVOKE read ON *.* from sysinfo0;
sql_error GRANT write ON db.* to sysinfo0;
sql_error GRANT write ON *.* to sysinfo0;
sql_error REVOKE write ON db.* from sysinfo0;
sql_error REVOKE write ON *.* from sysinfo0;
sql_error REVOKE write ON *.* from sysinfo0;
sql_error create dnode $hostname port 7200 sql_error create dnode $hostname port 7200
sql_error drop dnode 1 sql_error drop dnode 1
sql_error alter dnode 1 'debugFlag 135'
sql_error alter dnode 1 'dDebugFlag 131'
sql_error alter dnode 1 'resetlog'
sql_error alter dnode 1 'monitor' '1'
sql_error alter dnode 1 'monitor' '0'
sql_error alter dnode 1 'monitor 1'
sql_error alter dnode 1 'monitor 0'
sql_error create qnode on dnode 1 sql_error create qnode on dnode 1
sql_error drop qnode on dnode 1 sql_error drop qnode on dnode 1
...@@ -44,20 +77,107 @@ sql_error create database d1 ...@@ -44,20 +77,107 @@ sql_error create database d1
sql_error drop database db sql_error drop database db
sql_error use db sql_error use db
sql_error alter database db replica 1; sql_error alter database db replica 1;
sql_error alter database db keep 21
sql_error show db.vgroups sql_error show db.vgroups
sql select * from information_schema.ins_stables where db_name = 'db'
sql select * from information_schema.ins_tables where db_name = 'db' sql_error create table db.stb1 (ts timestamp, i int) tags (t int)
sql_error create table db.ctb1 using db.stb1 tags (1)
sql_error create table db.ntb1 (ts timestamp, i int)
sql_error insert into db.ctb values (now, 1);
sql_error insert into db.ntb values (now, 1);
sql_error select * from db.stb
sql_error select * from db.ctb
sql_error select * from db.ntb
sql use d2
sql create table d2.stb2 (ts timestamp, i int) tags (t int)
sql create table d2.ctb2 using d2.stb2 tags (1)
sql create table d2.ntb2 (ts timestamp, i int)
sql insert into d2.ctb2 values (now, 1);
sql insert into d2.ntb2 values (now, 1);
sql select * from d2.stb2
sql select * from d2.ctb2
sql select * from d2.ntb2
print =============== check show print =============== check show
sql select * from information_schema.ins_users sql_error show users
sql_error show cluster sql_error show cluster
sql_error select * from information_schema.ins_dnodes sql_error select * from information_schema.ins_dnodes
sql_error select * from information_schema.ins_mnodes sql_error select * from information_schema.ins_mnodes
sql_error show snodes sql_error show snodes
sql_error select * from information_schema.ins_qnodes sql_error select * from information_schema.ins_qnodes
sql_error show dnodes
sql_error show snodes
sql_error show qnodes
sql_error show mnodes
sql_error show bnodes sql_error show bnodes
sql_error show db.vgroups
sql_error show db.stables
sql_error show db.tables
sql_error show indexes from stb from db
sql show databases
sql_error show d2.vgroups
sql show d2.stables
sql show d2.tables
sql show indexes from stb2 from d2
#sql_error show create database db
sql_error show create table db.stb;
sql_error show create table db.ctb;
sql_error show create table db.ntb;
sql show streams
sql show consumers
sql show topics
sql show subscriptions
sql show functions
sql_error show grants sql_error show grants
sql show queries
sql show connections
sql show apps
sql_error show transactions
#sql_error show create database d2
sql show create table d2.stb2;
sql show create table d2.ctb2;
sql show create table d2.ntb2;
sql_error show variables;
sql show local variables;
sql_error show dnode 1 variables; sql_error show dnode 1 variables;
sql_error show variables; sql_error show variables;
system sh/exec.sh -n dnode1 -s stop -x SIGINT
print =============== check information_schema
sql show databases
if $rows != 3 then
return -1
endi
sql use information_schema;
sql_error select * from information_schema.ins_dnodes
sql_error select * from information_schema.ins_mnodes
sql_error select * from information_schema.ins_modules
sql_error select * from information_schema.ins_qnodes
sql_error select * from information_schema.ins_cluster
sql select * from information_schema.ins_databases
sql select * from information_schema.ins_functions
sql select * from information_schema.ins_indexes
sql select * from information_schema.ins_stables
sql select * from information_schema.ins_tables
sql select * from information_schema.ins_tags
sql select * from information_schema.ins_users
sql_error select * from information_schema.ins_grants
sql_error select * from information_schema.ins_vgroups
sql_error select * from information_schema.ins_configs
sql_error select * from information_schema.ins_dnode_variables
print =============== check performance_schema
sql use performance_schema;
sql select * from performance_schema.perf_connections
sql select * from performance_schema.perf_queries
sql select * from performance_schema.perf_topics
sql select * from performance_schema.perf_consumers
sql select * from performance_schema.perf_subscriptions
#sql_error select * from performance_schema.perf_trans
#sql_error select * from performance_schema.perf_smas
#sql_error select * from information_schema.perf_streams
#sql_error select * from information_schema.perf_apps
#system sh/exec.sh -n dnode1 -s stop -x SIGINT
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册