测试提到给ES配置了许多数据存储目录,但是在实测当中发现数据基本上只往其中一块盘去写数据(监控了磁盘读写速率),询问是否可以并发写以便提高性能。
此前,我给ES配置多个数据目录(path.data
)主要是为了增大存储上限,如果机器上配备有RAID卡直接使用存储卡做raid 0的单一大目录就十分便捷,无需考虑多目录的问题了。对测试遇到的问题试验及查证如下:
- 一个
shard
只会分配在一个物理目录上面,它不会再被切分存储到多个目录盘上 - 单索引具有足够的分片时,数据会写到多个盘(分片数 > data节点数)
- 所以,多目录在一般情况下没有并发写的效果,多磁盘推荐使用
raid 0
,磁盘I/O可以均匀分布到所有磁盘。
查证官网说明
将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需要至少一个副本分片来保证数据不会丢失。