Elasticsearch 7.15 存储类型详解
核心概念
index.store.type
是一个索引级设置,它决定了 Elasticsearch 在节点上使用哪种底层文件系统实现来存储和访问索引数据(分片)。
在 7.15 版本中,这个设置主要用于应对不同的操作系统和硬件环境,以优化 I/O 性能。
主要可选值及其含义
在 Elasticsearch 7.15 中,index.store.type
主要有以下几个可选值:
-
fs
(默认值)- 描述:这是默认且推荐的设置。它不是一个具体的实现,而是一个“智能选择器”。
- 行为:Elasticsearch 会根据运行环境和操作系统,自动选择最合适的存储类型。在大多数 Linux 系统上,它会选择
hybridfs
。在其他系统(如 Windows 或 macOS)上,它可能会选择simplefs
或niofs
。 - 建议:除非你有非常明确的理由,否则应该坚持使用默认的
fs
。Elasticsearch 的自动选择通常是最优的。
-
hybridfs
- 描述:这是
fs
类型在 Linux 上通常选择的实际实现。它是一个混合型实现,结合了niofs
和mmapfs
的优点。 - 行为:对于索引文件(如
.cfs
复合文件),它使用mmapfs
(内存映射)来利用其快速读取的优势。对于其他类型的文件(如事务日志translog
),它使用niofs
来保证稳定性。 - 适用场景:这是大多数 Linux 生产环境的理想选择。
- 描述:这是
-
niofs
- 描述:使用 Java 的 NIO(
FileChannel
)来读写文件。 - 优点:线程之间可以共享同一个文件描述符,这意味着即使有多个线程访问同一个分片,所需的文件描述符(file descriptors)也相对较少。
- 缺点:性能通常不如
mmapfs
。 - 适用场景:适用于所有支持 Java NIO 的平台(几乎所有平台)。如果你遇到文件描述符耗尽的问题,可以考虑使用此类型,但通常
hybridfs
是更好的选择。
- 描述:使用 Java 的 NIO(
-
mmapfs
- 描述:使用内存映射文件(
mmap
)来映射索引文件到虚拟内存中。 - 优点:读操作非常快,因为它可以直接利用操作系统的页面缓存,减少了从内核空间到用户空间的数据拷贝。
- 缺点:
- 会占用大量的虚拟地址空间(在 64 位系统上这通常不是问题)。
- 可能会“浪费”一部分内存,因为映射的文件可能不会被立即回收。
- 最重要的:它需要消耗大量的文件描述符。如果管理不当,很容易导致文件描述符耗尽,使节点无法工作。
- 适用场景:对于以读为主的、索引大小小于虚拟地址空间的工作负载,且你能够妥善管理文件描述符限制(
vm.max_map_count
)的系统。使用需谨慎。
- 描述:使用内存映射文件(
-
simplefs
- 描述:使用普通的 Java 随机访问文件(
RandomAccessFile
)。 - 缺点:性能较差,在多线程访问时存在瓶颈。
- 建议:不推荐在生产环境中使用。主要用于一些简单的测试或兼容性极老的 JVM。
- 描述:使用普通的 Java 随机访问文件(
如何配置
你可以在创建索引时指定该设置,或者通过 update-index-settings
API 动态地更新已存在的索引(但某些更改可能不会对已存在的分片立即生效)。
示例 1:创建索引时指定
PUT /my_index
{"settings": {"index.store.type": "niofs"}
}
示例 2:动态更新现有索引的设置
PUT /my_index/_settings
{"index.store.type": "niofs"
}
示例 3:在 elasticsearch.yml
中配置全局默认值(不推荐)
虽然可以,但强烈不推荐这样做,因为它会忽略不同机器的具体硬件和环境差异。最佳实践是使用默认的 fs
,让 Elasticsearch 自动选择。
index.store.type: niofs
总结与建议
存储类型 | 推荐度 | 特点 | 适用场景 |
---|---|---|---|
fs | ★★★★★ | 默认值,自动选择最佳实现(Linux 上通常是 hybridfs ) | 绝大多数生产环境 |
hybridfs | ★★★★☆ | 混合模式,结合 mmapfs (读快)和 niofs (写稳)的优点 | Linux 生产环境(是 fs 通常的选择) |
niofs | ★★★☆☆ | 基于 NIO,节省文件描述符,性能适中 | 所有平台,文件描述符有限的系统 |
mmapfs | ★★☆☆☆ | 读性能极快,但消耗大量文件描述符和虚拟内存 | 只读场景,且能妥善管理文件描述符的系统 |
simplefs | ★☆☆☆☆ | 性能差 | 仅用于测试 |
给你的最终建议是:
除非你确切的知道为什么要更改它,并且有充分的性能测试证明更改是有效的,否则请永远使用默认的 index.store.type: fs
。 Elasticsearch 的默认行为已经为绝大多数用户和场景做了充分优化。盲目更改此设置可能会引入性能问题或稳定性风险(尤其是 mmapfs
的文件描述符问题)。