# 卷影副本索引

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-shadow-replicas.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-shadow-replicas.html)

译文链接 : [卷影副本索引](/pages/viewpage.action?pageId=4260489)

贡献者 : [飞师傅](/display/~zhangyifei)

 此功能是实验性功能，可能在未来的版本中完全更改或删除。

如果你想要使用共享文件系统，可以使用卷影副设置来选择索引数据在磁盘上保存的位置，以及 **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。