创建数据表时提示more dnodes are needed

问题描述

TDengine Database 的客户提出的问题是:服务器配置是48G总节点50个,创建一个数据库和一个超级表,在超级表下面现在有45000个子表,节点使用数量为46个,如果子表再增加的话,只能加配置了吗?

TDengine 时序数据库 - 创建数据表时提示more dnodes are needed 2019110715193742.png 2

问题分析

当出现more dnodes are needed的出错信息时,表示没有更多的vnode用于创建表,这种情况有三种原因:

  • 硬盘空间不足,导致无法创建新的vnode
  • 硬盘没有写权限,导致无法创建新的vnode
  • 当前机器配置支持的vnode数目已经达到上限

前两种情况很好解释,如果是第三种原因,怎么在不改变机器配置的情况下增加可用表数目呢?TDengine Database的数据存储在vnode上,一个vnode包含固定数量的表,每台机器又包含了固定数量的vnode,可从这两个方面调整参数。

1.增加vnode表数目

在创建数据库的时候指定参数

create database db tables 2000 cache 10240 ablocks 4 tblocks 50 

这些参数含义如下:

  • tables:每个vnode允许创建表的最大数目
  • cache: 内存块的大小,单位为字节
  • tblocks: 每张表最大的内存块数
  • ablocks: 每张表平均的内存块数

增加每个vnode的最大表数目需要更改tables参数,但该参数不能无限大,通常在4-20000之间。通过修改配置,可以提高机器能创建的最大表数目。但是TDengine的设计中,每张表都占用固定内存,大致公式是:

cache*ablocks + tblocks*8 + 1000

以上数据库配置,每张表需要占用的内存约为42K,例如创建100万表,需要42GB内存,各位可以自己计算一下当前机器配置能够承载的表数目。也有的同学可能会想降低alockscache的大小,以便最大化表数目,那么需要注意以下几点:

  • ablocks 最好大于2,至少需要大于1
  • cache 至少为每行数据总字节数的20倍,例如两列的表,第一列为 timestamp,第二列为int,则每行数据为12字节,那么cache至少为240

当把这些参数都调整很小时,系统性能会下降,这也是题中应有之意。

2.增加vnode总数目

TDengine Database的vnode数目与计算机CPU核数有关,每个CPU核可以支持8个vnode,当总vnode数目小于50时,系统默认设置为50,当总vnode数目大于256时,系统默认设置为256。如果需要修改这个数字,可在配置文件/etc/taos/taos.cfg中修改numOfTotalVnodes参数。
还有一个参数maxTables需要关注,表示系统能够创建的最大表数目,默认值为650000,当预计创建的表数量大于此值时,需要到/etc/taos/taos.cfg中修改。

结论

遗憾的是,以上这两类方法,均不能动态修改。增加vnode表数目的方法,需要删除数据库;增加vnode总数目的方法,需要卸载数据库重新安装。
因此,各位在进行测试的时候,根据自己的数据量和机器配置,预先调整好参数。