TDEngine生产实践开发经验趟坑总结

本文档详细总结了TDEngine服务端的安装配置要点,包括版本匹配、hosts配置、数据目录管理、高可用设置等。同时,针对应用开发中遇到的问题,如JNI与REST接口性能对比、SQL限制、时间戳处理、数据写入规则等进行了阐述,为开发者提供了实用的解决策略和最佳实践。
摘要由CSDN通过智能技术生成

一、安装与配置问题总结

  1. 服务端的安装版本与客户端需要保持一致。(如果是在同一主机,安装服务端后, 会自带客户端。)

  2. etc/hosts下的IP与主机名称的映射, 不要存在多个映射,即IP与主机名称保持唯一性。

  3. 如果IO瓶颈, 要注意dataDir是否配置多个存储路径,且在不同磁盘下面,配置新的目录时需清空原有数据,

    多个dataDir配置示例:

    dataDir /data/tdengine/data1 0 1
    dataDir /data/tdengine/data2 0 0
    dataDir /data/tdengine/data3 0 0
    

    第一个层级0 代表是同一级存储, 不存在按时间分段情况;最后面层级是指定主挂载点, 这里表示只允许一个主挂载点。

  4. 如果有采用jni方式连接, 是可以支持高可用, 需在配置文件中指定secondEp

    vi /etc/taos/taos.cfg

    firstEp               cluster_node1:6030
    secondEp              cluster_node2:6030
    
  5. 如果采用rest方式连接,要支持高可用, 需要加一层LB负载。

  6. 如重装清除数据, 将dataDir目录也清空。

  7. 性能最大化配置, 可以参考以下配置。

    #first fully qualified domainname(FQDN) for TD engine system
    firstEp taos1:6030
    #local fully qualified domainname(FQDN)
    fqdn taos1
    #first port number for the connection ( 12 continuous UDP/TCP portnumber are used)
    serverPort 6030
    #logfile'sdirectory
    logDir  /usr/local/TDengine/log
    #datafile'sdirectory
    dataDir /usr/local/TDengine/data
    #temporaryfile'sdirectory
    tempDir /usr/local/TDengine/tmp
    #numberofthreads per CPU core
    numOfThreadsPerCore 2.0
    #numberofthreads to commit cache data
    numOfCommitThreads 40
    #theproportionof total CPU cores available for query processing
    #2.0:thequerythreads will be set to double of the CPU cores.
    #1.0:allCPUcores are available for query processing[default] .
    #0.5:onlyhalfof the CPU cores are available for query.
    #0.0:onlyonecore available.
    ratioOfQueryCores  2.0
    #thelast_row/first/lastaggregator will not change the original columnname in the result fields
    keepColumnName  1
    #numberofmanagement nodes in the system
    numOfMnodes  2
    #enable/disableloadbalancing
    balance  0
    #numberofseconds allowed for ad node to be offline, for cluster only
    offlineThreshold  86400
    #maxnumberof v groups per db, 0 means configured automatically
    maxVgroupsPerDb 30
    #numberofcache blocks per vnode
    blocks  60
    #thenumberof acknowledgments required for successful data writing
    quorum  2
    #max length of an SQL
    maxSQLLength  1048576
    #system timezone
    timezone  Asia/Shanghai(CST, +0800)
    #system locale
    locale enUS.UTF-8
    # default system charset
    charset UTF-8
    # max number of connections allowed in dnode
    maxShellConns  50000
    # max number of connections allowed in client
    maxConnections  50000
    # enable/disable system monitor
    monitor  1
    wallevel  1 
    

    numOfThreadsPerCore为每个CPU核心的消费线程数量;numOfCommitThreads 为写入线程的最大数量。

  8. 部署TDEngine集群至少需要三个节点, 如果只有两个数据节点, 可以通过增加一个Arbitrator节点,组成集群, Arbitrator对于偶数个副本的情形,使用它可以防止split brain(脑裂)。

二、应用开发问题总结

1、官方介绍JNI方式比REST方式, 在写入性能上有50%以上提升,实际上没明显差别, 使用JNI方式是不支持MyBatis框架,要采用原生JDBC方式处理, 需要注意(并发下, 会有大量阻塞)。

2、数据库的时间戳可以支持到纳秒级, 是针对数据库, 不针对具体某张表。
请添加图片描述

3、如果数据不能写入, 报出时间超出范围, 需要检查数据库的有效时间设置
请添加图片描述
如果keep 设置的是365天, days设置的是10, 那么写入数据的有效时间是【-375 ~ 375】

4、TDEngine最大SQL的长度为1M,超出此长度会报错。

5、TDEngine的时间插入必须是有序的, 也就是后面插入数据的时间, 不能小于前面插入数据的时间, 否则会导致TD重排, 降低性能。

6、TDEngine的表名如果过长,且出现非英文字母字符, 会报错。

7、单SQL可以支持多表多记录插入,但最好要保障每个表写入的连续性。

8、避免动态建立子表,最好能预先建表。

9、如果SQL比较短,restful方式比jni方式要慢。

10、restful方式如果查询大结果集、超过100万记录时, 需要采用limit方式进行分页处理。

11、jni支持参数绑定,restful不支持, 采用restful可以无需装客户端。

12、SQL 语句中的英文字符不区分大小写(会自动转化为小写执行)。

13、TDEngine默认会开启使用从6030至6042共13个端口, 注意防火墙需开放对应的端口, 并且TCP与UDP都需打开。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要连接TDengine数据库,在Django中,可以使用第三方库taos来实现。具体步骤如下: 1. 安装taos库 可以使用pip命令来安装taos库: ``` pip install taos ``` 2. 配置数据库连接信息 在Django的settings.py文件中,可以添加以下配置信息: ``` TDENGINE_HOST = 'localhost' TDENGINE_PORT = 6030 TDENGINE_USER = 'root' TDENGINE_PASSWORD = 'taosdata' TDENGINE_DB_NAME = 'test' ``` 其中,TDENGINE_HOST是TDengine数据库的地址,TDENGINE_PORT是端口号,TDENGINE_USER是用户名,TDENGINE_PASSWORD是密码,TDENGINE_DB_NAME是要连接的数据库名称。 3. 创建数据库连接 在Django的models.py文件中,可以使用以下代码创建数据库连接: ``` from taos import * def get_tdengine_conn(): tdengine_conn = connect(TDENGINE_HOST, TDENGINE_USER, TDENGINE_PASSWORD, TDENGINE_DB_NAME, port=TDENGINE_PORT) return tdengine_conn ``` 4. 创建数据表 在Django的models.py文件中,可以使用以下代码创建数据表: ``` from django.db import models from .utils import get_tdengine_conn class MyModel(models.Model): name = models.CharField(max_length=50) age = models.IntegerField() class Meta: db_table = 'my_table' def save(self, *args, **kwargs): with get_tdengine_conn() as conn: cursor = conn.cursor() sql = "INSERT INTO my_table (name, age) VALUES ('{}', {})".format(self.name, self.age) cursor.execute(sql) cursor.close() super(MyModel, self).save(*args, **kwargs) ``` 其中,utils.py文件中的get_tdengine_conn()函数用于获取数据库连接,MyModel类用于定义数据表结构,save()方法用于保存数据。 5. 查询数据 在Django的views.py文件中,可以使用以下代码查询数据: ``` from django.http import JsonResponse from .utils import get_tdengine_conn def query_data(request): with get_tdengine_conn() as conn: cursor = conn.cursor() sql = "SELECT * FROM my_table" cursor.execute(sql) rows = cursor.fetchall() cursor.close() data = [] for row in rows: data.append({ 'id': row[0], 'name': row[1], 'age': row[2] }) return JsonResponse({'data': data}) ``` 其中,query_data()函数用于查询数据,get_tdengine_conn()函数用于获取数据库连接,JsonResponse用于返回查询结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦神-mirson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值