挂载多磁盘目录
在配置Elasticsearch(ES)时,许多用户会为其设置多个数据存储目录(path.data
),这主要是为了增加存储容量。如果服务器配备了RAID卡,使用RAID 0来创建一个大的单一目录是一种非常方便的做法,这样可以避免处理多个目录的复杂性。然而,在实际测试中,我们发现数据似乎只写入了一个磁盘,尽管监控显示磁盘读写速率还有很大的剩余空间。
这引发了一个问题:是否可以并发写入以提高性能?
首先,我们需要理解Elasticsearch的分片(shard)分配机制。一个分片只会被分配到一个物理目录上,它不会被进一步分割存储到多个目录盘上。这意味着,尽管你配置了多个数据目录,但单个分片并不会跨目录写入数据。然而,如果一个索引有足够的分片,且分片数大于数据节点数,那么数据确实可以写入多个磁盘。但在大多数情况下,多目录配置并没有并发写入的效果。对于多磁盘配置,推荐使用RAID 0,这样可以使得磁盘I/O均匀分布到所有磁盘上,从而提高性能。
分片分配相关知识
官方文档也提到,使用多个IO设备(通过指定多个path.data
路径)来存储节点上的分片,对于增加总存储空间和提高IO性能是非常有用的,尤其是当IO性能成为Elasticsearch使用的瓶颈时。
在处理多个数据目录时,Elasticsearch会选择一个最佳目录(通常是最不常用的)来分配给分片存储数据文件。如果你遇到了数据只写入一个磁盘的问题,这可能是因为其他磁盘没有被选为最佳目录,或者磁盘的性能和配置存在问题。
此外,使用RAID 0虽然可以提高性能,但它也有其风险,尤其是当出现硬盘故障时,可能会导致整个节点上的所有分片丢失。因此,官方推荐使用多个目录来提高数据的安全性。
总的来说,如果你的目标是提高写入性能,并且对数据安全性的要求不是非常高,可以考虑使用RAID 0。但如果你更关心数据的安全性,那么使用多个数据目录,并确保每个分片至少有一个副本分片,将是更好的选择。这样可以保证即使某个磁盘发生故障,数据也不会丢失。在实际操作中,可以根据你的具体需求和风险承受能力来做出决策。
查证官网说明
将path.data配置成多个路径,也即使用多个IO设备,对于增大总存储空间很有用,也有提升IO性能的效果。
Using multiple IO devices (by specifying multiple `path.data` paths) to hold the shards
on your node is useful for increasing total storage space,
and improving IO performance, if that's a bottleneck for your Elasticsearch usage.
shard分配的基本逻辑:
多目录情况下,一个shard被分配到一个node上之后,node会挑选一块最佳目录(多数是空的)分配给这个shard存储数据文件。
前面提到raid 0是另一条路,但是raid 0是条带化存储数据,出现坏盘的情况就会全军覆没(对ES来说存在该节点的所有shard都丢失),官方推荐使用多目录。
因此,你的shard需要至少一个副本分片来保证数据不会丢失。
如何确保Elasticsearch的分片在多个数据目录中均匀分布?
为了确保Elasticsearch的分片在多个数据目录中均匀分布,您可以采取以下措施:
-
合理规划分片数量:在创建索引时,合理规划分片的数量对于确保分片均匀分布至关重要。过多的分片会增加集群的管理开销,而过少的分片可能导致单个节点上的资源竞争。根据Elasticsearch官方文档,建议每个分片包含大约1亿到2亿个文档,或者分片大小在10GB到50GB之间。
-
使用数据流和ILM:对于时间序列数据,可以使用数据流和索引生命周期管理(ILM)来自动管理分片。数据流允许您跨多个基于时间的索引存储数据,而ILM可以自动管理这些索引。
-
监控和调整分片分布:使用Elasticsearch的监控工具来跟踪分片的分布情况。如果发现某个节点上的分片过多,可以调整
index.routing.allocation.total_shards_per_node
设置来限制单个节点上的分片数量。 -
磁盘水位标记:通过设置磁盘水位标记(low and high watermarks),可以控制节点上的磁盘使用情况,防止某些路径的磁盘使用率过高而影响整个节点的性能。Elasticsearch会尝试在磁盘使用率低于高水位标记时,将分片从该节点迁移出去。
-
分片分配感知:如果您的集群分布在多个物理位置(如不同的机架或数据中心),可以使用分片分配感知来确保分片在这些位置之间均匀分布。通过为节点设置自定义属性(如
rack_id
或zone_id
),Elasticsearch可以在分配分片时考虑到这些物理位置。 -
集群级分片分配过滤:如果您需要对特定节点或节点组进行维护或退役,可以使用集群级分片分配过滤来排除这些节点,从而控制分片的分配。
-
避免不必要的映射字段:默认情况下,Elasticsearch会自动为每个文档中的每个字段创建映射。这些映射字段会在磁盘上占用空间,并在内存中保留元数据。为了避免不必要的开销,可以使用显式映射来控制字段的创建,或者使用运行时字段来处理不常用的字段。