文件传输功能配置
本页面提供了在 EMQX 中配置文件传输功能设置的说明。主题将涵盖用于管理文件元数据、片段和导出文件的存储选项以及用于文件传输操作的 MQTT 设置。本页还将具体说明本地存储后端和用于文件导出的 S3 导出器。
EMQX 允许不配置大多数文件传输设置并使用默认值。
配置文件传输存储设置
EMQX 提供了用于管理文件元数据、片段和导出文件的存储选项。
要启用本地文件存储,请使用以下配置:
{
file_transfer {
enable = true
storage {
local {
enable = true
}
}
}
}
使用本地文件存储,EMQX 将文件元数据和片段存储在接收节点的本地文件系统中。此外,本地文件存储使用配置的导出器导出已上传的文件。EMQX 支持两种导出器:本地导出器和 S3 导出器,分别将文件导出到本地文件系统和兼容 S3 的对象存储系统。可以同时设置多个导出器的设置,但只能启用一个。
文件片段设置
文件片段设置允许您配置如何管理文件片段。可以指定以下参数:
root
:存储片段的根目录。- 片段垃圾回收设置。
{
file_transfer {
enable = true
storage {
local {
enable = true
segments {
root = "/var/lib/emqx/file_transfer/segments"
gc {
interval = "1h"
maximum_segments_ttl = "1d"
minimum_segments_ttl = "1h"
}
}
}
}
}
}
您需要根据预期的文件传输负载、文件大小、并发传输和可用磁盘空间这些因素为这些参数选择适当的值。
本地导出器设置
本地导出器允许将文件导出到本地文件系统。您只需设置导出文件的根文件夹。
{
file_transfer {
enable = true
storage {
local {
enable = true
exporter {
local {
enable = true
root = "/var/lib/emqx/file_transfer/exported"
}
}
}
}
}
}
随着时间的推移,导出的文件可能会累积,可能导致导出目录中存在大量文件。为了解决这个问题,EMQX 使用存储导出文件的分桶存储方案。该方案使用以下工作原理:
- 先计算出文件 ID 和客户端 ID 的 sha256 哈希值,比如:
ABCDEFG012345...
。 - 将文件存储在 6 级目录层次结构中,每一级定义如下:
- 哈希的前两个字节作为第一级目录名称;
- 接下来的两个字节作为第二级目录名称;
- 剩余的哈希作为第三级目录名称;
- 转义的客户端 ID;
- 转义文件 ID;
- 元数据中的文件名作为最后一层。
例如,导出的文件会存储在这样的目录结构中:AB/CD/EFGH.../clientid/file_id/escaped_file_name_from_the_metadata
。
EMQX 提供了用于列出和下载导出文件的 API。
S3 导出器设置
S3 导出器允许将文件导出到兼容 S3 的对象存储系统。它具有以下配置设置:
min_part_size
和max_part_size
:S3 导出器使用分块上传将文件上传到 S3。在上传之前,片段将被收集到大于min_part_size
的块中,而大于max_part_size
的片段将导致错误。transport_settings
:用于与S3的底层 HTTP(S) 连接的设置,允许安全文件上传和连接池管理。
与本地导出器使用的分桶存储方案不同,使用 S3 导出器导出的文件使用更简单的 3 级层次结构存储:
- 转义的客户端 ID;
- 转义文件 ID;
- 文件名。
配置文件传输的 MQTT 设置
为了优化文件传输操作并防止客户端等待时间过长,我们可以为不同的文件传输操作设置特定的超时时间。可以配置以下 MQTT 传输设置:
file_transfer {
enable = true
init_timeout = "10s"
store_segment_timeout = "10s"
assemble_timeout = "60s"
}
init_timeout
:初始化操作的超时时间。store_segment_timeout
:存储文件片段的超时时间。assemble_timeout
:文件组装的超时时间。
如果这些操作中的任何一个超过了指定的超时时间,MQTT 客户端将收到带有 RC_UNSPECIFIED_ERROR
代码的PUBACK数据包。