此功能是实验性功能,可能在未来的版本中完全更改或删除。
如果你想要使用共享文件系统,可以使用卷影副设置来选择索引数据在磁盘上保存的位置,以及 Elasticsearch 如何在一个索引的所有分片上重复操作。
为了充分利用 index.data_path
和 index.shadow_replicas
设置,你需要允许 Elasticsearch 对多个实例使用同一个数据目录,方法是在 elasticsearch.yml 文件中设置 node.add_lock_id_to_custom_path
为 false。
node.add_lock_id_to_custom_path: false
你还需要向安全管理器指定自定义索引的位置,以便可以应用正确的权限。你可以通过 elasticsearch.yml 文件中的 path.shared_data
进行设置。
path.shared_data: /opt/data
这表示着 Elasticsearch 可以读写 path.shared_data
设置的目录中的任意文件。
然后,你可以使用自定义数据路径创建索引,也就是每个节点都使用这个路径获取数据。
因为卷影副本不会在副本分片上索引文档,所以如果没有在包含副本的节点上处理最新的集群状态,副本已知的映射可能会在索引已知的映射之后。因此,强烈建议使用卷影副本时使用预定义映射。
curl -XPUT 'localhost:9200/my_index' -d '
{
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 4,
"data_path": "/opt/data/my_index",
"shadow_replicas": true
}
}'
在上面的例子中,"/opt/data/my_index"路径是一个共享文件系统,它必须让 Elasticsearch 集群每个节点都可以访问。你还必须确保 Elasticsearch 进程拥有读写 index.data_path
目录的权限。
data_path
不必包含索引名,在上述例子中,使用了"my_index",但也可以就用"/opt/data/"。
使用 index.shadow_replicas
为"true"的设置创建的索引,不会将文档操作复制到任何副本分片上,它只会持续刷新。一旦分段在卷影副本所在的文件系统上可以用(在一次 Elasticsearch "Flush" 之后),可以使用常规刷新(由 index.refresh_interval
管理)让新数据可搜索。
注意 由于文档只在主分片上有索引,如果只在副本分片上执行上述命令,实时的GET请求可能无法返回文档,因此如果没有设置偏好标识,GET API请求会自动设置
?preference=_primary
标识。
为了确保以足够快的方式同步数据,你可能需要将索引刷新的阀值调整为所需的值。因为一次 flush 操作需要 fsync 分段文件到磁盘上,所以它会对其他所有的副本节点可见。 因为增加 flush 次数会影响索引性能,所以用户应该测试适合他们的 flush 阀值水平。
Elasticsearch 集群仍然会检测主分片的丢失,并且在丢失的情况下将副本分片转换为主分片。因为每个卷影副本都没有维护IndexWriter
,所以这种转换需要稍长的时间。
以下是可以使用设置更新API变更的设置列表:
1.index.data_path
(string)
用于设置存放索引数据的路径。请注意,默认情况下Elasticsearch会将节点信息附加到路径,以确保在同一台机器上的多个Elasticsearch实例不共享数据目录。
2.index.shadow_replicas
表示此索引是否使用卷影副本。默认为 false
。
3. index.shared_filesystem
表示此索引是否使用共享文件系统。如果index.shadow_replicas
设置为true
,则默认为true
,否则为false
。
4.index.shared_filesystem.recover_on_any_node
表示是否应允许索引的主分片在群集中的任何节点上恢复。如果找到保存分片副本的节点,则恢复首选该节点。默认为false。