homework-jianmu/docs/zh/07-operation/07-multi.md

4.3 KiB
Raw Blame History

sidebar_label title toc_max_heading_level
多级存储 多级存储 4

TDengine 特有的多级存储功能,其作用是将较近的热度较高的数据存储在高速介质上,而时间久远热度很低的数据存储在低成本介质上,达成了以下目标:

  • 降低存储成本 -- 将数据分级存储后,海量极冷数据存入廉价存储介质带来显著经济性
  • 提升写入性能 -- 得益于每级存储可支持多个挂载点WAL 预写日志也支持 0 级的多挂载点并行写入,极大提升写入性能(实际场景测得支持持续写入每秒 3 亿测点以上),在机械硬盘上可获得极高磁盘 IO 吞吐(实测可达 2GB/s
  • 方便维护 -- 配置好各级存储挂载点后,系统数据迁移等工作,无需人工干预;存储扩容更灵活、方便
  • 对 SQL 透明 -- 无论查询的数据是否跨级,一条 SQL 可返回所有数据,简单高效

配置方式

多级存储支持 3 级,每级最多可配置 16 个挂载点。

Tips 典型的配置方案有0 级配置多个挂载点,每个挂载点对应单块 SAS 硬盘1 级配置多个挂载点,每个挂载点对应单块或多块 SATA 硬盘2 级可配置 S3 存储或其他廉价网络存储。

TDengine 多级存储配置方式如下(在配置文件/etc/taos/taos.cfg 中):

dataDir [path] <level> <primary>
  • path: 挂载点的文件夹路径。
  • level: 介质存储等级,取值为 012。 0 级存储最新的数据1 级存储次新的数据2 级存储最老的数据,省略默认为 0。 各级存储之间的数据流向0 级存储 -> 1 级存储 -> 2 级存储。 同一存储等级可挂载多个硬盘,同一存储等级上的数据文件分布在该存储等级的所有硬盘上。 需要说明的是,数据在不同级别的存储介质上的移动,是由系统自动完成的,用户无需干预。
  • primary: 是否为主挂载点0或 1省略默认为 1。 在配置中只允许一个主挂载点的存在level=0primary=1例如采用如下的配置方式
dataDir /mnt/data1 0 1
dataDir /mnt/data2 0 0
dataDir /mnt/data3 1 0
dataDir /mnt/data4 1 0
dataDir /mnt/data5 2 0
dataDir /mnt/data6 2 0

注意 1. 多级存储不允许跨级配置,合法的配置方案有:仅 0 级,仅 0 级+ 1 级,以及 0 级+ 1 级+ 2 级。而不允许只配置 level=0 和 level=2而不配置 level=1。 2. 禁止手动移除使用中的挂载盘,挂载盘目前不支持非本地的网络盘。

负载均衡

在多级存储中,有且只有一个主挂载点,主挂载点承担了系统中最重要的元数据存储,同时各个 vnode 的主目录均存在于当前 dnode 主挂载点上,从而导致该 dnode 的写入性能受限于单个磁盘的 IO 吞吐能力。

从 TDengine 3.1.0.0 开始,如果一个 dnode 配置了多个 0 级挂载点,我们将该 dnode 上所有 vnode 的主目录均衡分布在所有的 0 级挂载点上,由这些 0 级挂载点共同承担写入负荷。

在网络 I/O 及其它处理资源不成为瓶颈的情况下,通过优化集群配置,测试结果证明整个系统的写入能力和 0 级挂载点的数量呈现线性关系,即随着 0 级挂载点数量的增加,整个系统的写入能力也成倍增加。

同级挂载点选择策略

一般情况下,当 TDengine 要从同级挂载点中选择一个用于生成新的数据文件时,采用 round robin 策略进行选择。但现实中有可能每个磁盘的容量不相同,或者容量相同但写入的数据量不相同,这就导致会出现每个磁盘上的可用空间不均衡,在实际进行选择时有可能会选择到一个剩余空间已经很小的磁盘。

为了解决这个问题,从 3.1.1.0 开始引入了一个新的配置 minDiskFreeSize当某块磁盘上的可用空间小于等于这个阈值时该磁盘将不再被选择用于生成新的数据文件。该配置项的单位为字节其值应该大于 2GB即会跳过可用空间小于 2GB 的挂载点。

从 3.3.2.0 版本开始,引入了一个新的配置 disable_create_new_file用于控制在某个挂载点上禁止生成新文件其缺省值为 false即每个挂载点上默认都可以生成新文件。