Hi,TDengine 的用户朋友们,为防止过多的共性问题困扰大家,方便大家学习、吸收经验,从今天开始我们会对近期社区内用户遇到的共性问题进行精选、汇总,每两周给大家带来一次分享。 这是此类专栏的第一期内容,为大家分享如下七个常见问题:

  1. 客户端连接串如何保证高可用?
  2. Java 应用使用 taos-jdbcdriver 连接 TDengine 时, RESTful 与原生 ( JNI ) 接口性能相比如何,该如何选型?
  3. TDengine 如何做表关联?是使用 JOIN 吗?
  4. 为什么 RESTful 接口无响应、Grafana 无法添加 TDengine 为数据源、TDengineGUI 选了 6041 端口还是无法连接成功?
  5. TDengine 数据备份工具 taosdump 如何使用?
  6. Windows 客户端无法正常显示中文字符?
  7. 发生了 OOM 怎么办?

1. 客户端连接串如何保证高可用? 本周有较多的用户提到了这个问题,类似的还有 「如何给多节点 TDengine 集群的链接配置高可用」。这个问题时常出现在社区中,DBA、运维同学较为关心。我们已经整理成了文章,详情可看博客:[TDengine 如何做到客户端高可用?]

2. Java 应用使用 taos-jdbcdriver 连接 TDengine 时, RESTful 与原生 ( jni ) 接口性能相比如何,该如何选型? 使用 RESTful 连接时,不依赖 TDengine 客户端驱动,可以跨平台,RESTful 连接支持所有能运行 Java 的平台。原生连接支持的平台则和 TDengine 客户端驱动支持的平台一致。 因此 RESTful 相比于原生连接使用起来更加灵活、方便,但采用 RESTful 的方式连接,其性能相较于原生连接会低 30% 左右。

推荐在每秒写入量小于 200 万条记录的场景下,优先选择 RESTful 。用户也可根据自己场景做性能测试,若使用 RESTful 连接时性能完全能满足业务操作需求则优先选择 RESTful ,反之选择原生连接。

3. TDengine 如何做表关联?是使用 JOIN 吗? TDengine 支持在 「普通表与普通表」、「超级表与超级表」、「子查询与子查询」之间进行自然连接,其语法相较于 INNER JOIN 有所不同,并且各种表进行关联查询的限制也不尽相同。

详细内容请看文档: JOIN 子句

4. 为什么 RESTful 接口无响应、Grafana 无法添加 TDengine 为数据源、TDengineGUI 选了 6041 端口还是无法连接成功? 上述问题也间歇性的出现在社区中,许多用户充满了疑问,特别是一些从 TDengine 旧版本升到 2.4 及之后版本的用户们,这是因为在 2.4 之前的版本中没有单独的 taosAdapter 组件,RESTful 接口是由 taosd 内置的 HTTP 服务提供的,而如今要实现上述功能需要执行:systemctl start taosadapter 命令来启动 taosAdapter 服务。

需要说明的是,taosAdapter 的日志路径 path 需要单独配置,默认路径是 /var/log/taos ;日志等级 logLevel 有 8 个等级,默认等级是 info ,配置成 panic 可关闭日志输出。请注意操作系统 / 目录的空间大小,可通过命令行参数、环境变量或配置文件来修改配置,默认配置文件是 /etc/taos/taosadapter.toml 。

有关 taosAdapter 组件的详细介绍请看文档:taosAdapter

5. TDengine 数据备份工具 taosdump 如何使用? taosdump 是 TDengine 集群的数据备份、还原工具,使用前请先查看文档中的说明及注意事项 :taosdump

需要注意的是,taosdump 采用逻辑备份的方式进行备份,其不应被用于备份任何原始数据、环境设置、 硬件信息、服务端配置或集群的拓扑结构;并且当备份的表数量很多时很容易导致文件系统卡住(一个表一个备份文件),推荐书写脚本循环调用 taosdump 按照较细的粒度备份到不同目录。

6. Windows 客户端无法正常显示中文字符? Windows 系统中一般是采用 GBK/GB18030 存储中文字符,而 TDengine 的默认字符集为 UTF-8 ,在 Windows 系统中使用 TDengine 客户端时,客户端驱动会将字符统一转换为 UTF-8 编码后发送到服务端存储,因此在应用开发过程中,调用接口时正确配置当前的中文字符集即可。

【 v2.2.1.5以后版本 】在 Windows 10 环境下运行 TDengine 客户端命令行工具 taos 时,若无法正常输入、显示中文,可以对客户端 taos.cfg 做如下配置:

locale C charset UTF-8 再次运行客户端命令行工具 taos ,即能正常进行操作。

另外,在 TDengine 中,中文字符或其他多字节字符需用 nchar 类型存储,不要用 binary 类型进行存储,否则在用 taosdump 工具导出导入时将出现乱码,导致不可修复的异常,binary 建议只用于存储 ASCII 可见字符。

7. 发生了 OOM 怎么办? OOM 是操作系统的保护机制,当操作系统内存(包括 SWAP )不足时,会杀掉某些进程,从而保证操作系统的稳定运行。通常内存不足主要是如下两个原因导致,一是剩余内存小于 vm.min_free_kbytes ;二是程序请求的内存大于剩余内存。还有一种情况是内存充足但程序占用了特殊的内存地址,也会触发 OOM 。

TDengine 会预先为每个 VNode 分配好内存,每个 Database 的 VNode 个数受 maxVgroupsPerDb 影响,每个 VNode 占用的内存大小受 Blocks 和 Cache 影响。要防止 OOM,需要在项目建设之初合理规划内存,并合理设置 SWAP ,除此之外查询过量的数据也有可能导致内存暴涨,这取决于具体的查询语句。TDengine 企业版对内存管理做了优化,采用了新的内存分配器,对稳定性有更高要求的用户可以考虑选择企业版。

结尾语 感谢您阅读本期问题精选,希望以上内容对您有帮助。您在使用 TDengine 的过程中,若遇到棘手的问题或对 TDengine 有改进意见,欢迎在 GitHub 上给我们提 Issue ,内容越详细越好,也可微信扫下方二维码加入社区,与大家进行交流 ~ 最后,感谢使用 TDengine Time-Series Database !

::: hljs-center

e0045b634a36cf75d023d681763057ac_tdengineE5B08FT1.jpg

加小 T 为好友,立即加入到物联网大数据技术交流群