这几个神秘参数,教你TDengine集群的正确使用方式

2022-03-22 00:00:00 数据 集群 参数 场景 节点

小 T 导读:为什么我的集群数据分布得不均匀?这篇文章就是为了解决这个问题而写的。但即便是没有遇到“TDengine集群数据不均匀分布”这个现象的用户,我们也推荐一读。因为可能你目前只是在通用场景下使用集群,当一些特殊的场景出现时,深入地了解集群参数和数据库架构原理才会真正地让你做到游刃有余。至于集群如何搭建并不是本文主题,请严格根据官方文档指示操作即可。官方文档地址:https://taosdata.com/docs/cn/v2.0/cluster

为了充分理解文章内容,首先大家一定要先了解vnode这个概念——每个 vnode 都是一个相对独立的工作单元,是存储时序数据(表)的基本单元,具有独立的运行线程,内存空间与持久化存储的路径。如果觉得不够清晰的话,接着往下读,随着知识点的串联,或许您会豁然开朗起来。现在,我们来根据不同的场景给出具体分析:通常来说,数据分配不均匀有两种。

场景一:表分布不均匀

需要测试表数量很少的数据库性能时比较容易发生这个现象:你建了1200张表,但是却发现有1000张表都在同一个vnode里面,只有200张表在另一个vnode里面。这种场景的坏处是,大部分表都进入了同一个vnode数据分布不均匀。此外还会导致只有两个线程在为TDengine工作,因此无法利用计算机的多核(假设你的服务器CPU是双核以上),从而浪费了TDengine的横向扩展性。我先来简单说说导致上述情况的原因——在TDengine中有这样三个参数:

  • maxVgroupsPerDb: 每个数据库中能够使用的大vnode个数(单个副本),默认为0;
  • minTablesPerVnode: 每个vnode中必须创建的小表数,即是说这是轮建表用的步长(就是满多少表写下一个vnode),默认1000;
  • tablelncStepPerVnode:每个vnode中超过小表数后的递增步长(即是后续满多少表写下一个vnode),默认1000。

在持续的建表过程中,TDengine就是靠这三个参数来控制表的分布的。大家可以在使用taosdemo批量建表的时候观察一下:打开另一个taos窗口,在建表的时候一直输入show vgroups命令,就能看到上述参数所控制的建表过程了:在个vnode中,表数量从0开始逐渐递增,随着数量达到minTablesPerVnode后,开始创建下一个vnode并继续在其中建表。之后,重复该过程直到vnode数量达到maxVgroupsPerDb。之后,TDengine将回到个vnode继续创建新表,在补充每个vnode的表数达到tablelncStepPerVnode数量后,后续以tablelncStepPerVnode为步长继续在vnode中依次创建表,直到建完全部表。(描述看着繁琐,自己动手跑一遍会很直观)

明白了这个逻辑后,我们可以再来回头看为什么会出现场景一的情况。答案已经很简单了,因为minTablesPerVnode这个参数的值默认是1000,所以前1000个表肯定会只出现在个vnode里,这就给用户造成了数据分配并不平均的错觉。

那么要如何调整成我们预期的效果呢。

别急——在此之前我们还需要再多了解一下这个参数:maxVgroupsPerDb。大家可能在taos.cfg中留意过maxVgroupsPerDb这个参数的值默认是0,根据参数描述,0代表的是自动配置。但是关于这个自动配置的详情在官网上是有解释的:“每个 Database 可以创建固定数目的 vgroup,默认与 CPU 核数相同,可通过 maxVgroupsPerDb 配置”。

如果不了解vgroup概念,建议到官网查看:https://taosdata.com/docs/cn/v2.0/architecture

相关文章