--- title: "Easysearch 可搜索快照功能,看这篇就够了" date: 2024-12-25 lastmod: 2024-12-25 description: "可搜索快照功能简化备份数据查询流程,通过创建快照索引实现高效搜索。需设置节点角色(如search),创建快照并恢复为快照索引,支持只读查询,无法写入数据。删除快照索引后可重新创建。" tags: ["Easysearch", "ES", "可搜索快照"] summary: "可搜索快照功能改变了我们对备份数据的查询方式。以往要查询备份数据时,要先找到备份数据所在的快照,然后在一个合适的环境中恢复快照,最后再发起请求查询数据。这个处理路径很长,而且很消耗时间。可搜索快照功能将大大简化该处理路径,节约时间。 角色设置 # 相信你对节点角色的概念已经有所熟悉。要启用可搜索快照功能, Easysearch 集群中必须至少有一个节点拥有 search 角色。参考设置如下。 node.roles: ["search"] node.search.cache.size: 500mb node.roles: 指定节点角色,只有 search 角色的节点才能去搜索快照中的数据。 node.search.cache.size: 执行快照搜索时,数据缓存大小。 混合角色设置,参考如下。 node.roles: ["master","data","search","ingest"] node.search.cache.size: 500mb 创建快照 # 可搜索快照功能使用普通快照作为基础,创建快照命令不变。比如我创建且备份个 infini 索引。 # 创建 infini 索引 POST infini/_doc { "test":"Searchable snapshots" } # 创建快照备份 infini 索引 PUT _snapshot/my-fs-repository/1 { "indices": "infini", "include_global_state": false } 创建快照索引 # 可搜索快照功能的核心是搜索快照中的索引,这一步是通过快照索引实现的。为了和集群中的普通索引区别开来,我们将实际存储在快照中的索引称为快照索引。通过使用 Easysearch 的 _restore API 并指定 remote_snapshot 存储类型来创建快照索引。 创建快照索引时,注意名称不能与当前索引名称重复。通常我们备份完索引后,可删除索引释放节点磁盘空间,创建快照索引时默认使用原来的名称。 # 删除 infini 索引释放磁盘空间 DELETE infini # 创建快照索引,使用原索引名称 POST /_snapshot/my-fs-repository/1/_restore { "indices": "infini", "include_global_state": false, "include_aliases": false, "storage_type": "remote_snapshot" } 创建快照索引的命令和还原快照的命令非常相似,关键在于 storage_type 参数指定 remote_snapshot 存储类型。" --- 可搜索快照功能改变了我们对备份数据的查询方式。以往要查询备份数据时,要先找到备份数据所在的快照,然后在一个合适的环境中恢复快照,最后再发起请求查询数据。这个处理路径很长,而且很消耗时间。可搜索快照功能将大大简化该处理路径,节约时间。 ## 角色设置 相信你对节点角色的概念已经有所熟悉。要启用可搜索快照功能,[Easysearch](https://infinilabs.cn/products/easysearch/) 集群中必须至少有一个节点拥有 search 角色。参考设置如下。 ```plain node.roles: ["search"] node.search.cache.size: 500mb ``` - node.roles: 指定节点角色,只有 search 角色的节点才能去搜索快照中的数据。 - node.search.cache.size: 执行快照搜索时,数据缓存大小。 混合角色设置,参考如下。 ```plain node.roles: ["master","data","search","ingest"] node.search.cache.size: 500mb ``` ## 创建快照 可搜索快照功能使用普通快照作为基础,创建快照命令不变。比如我创建且备份个 infini 索引。 ```plain # 创建 infini 索引 POST infini/_doc { "test":"Searchable snapshots" } # 创建快照备份 infini 索引 PUT _snapshot/my-fs-repository/1 { "indices": "infini", "include_global_state": false } ``` {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/1.png" "" %}} ## 创建快照索引 可搜索快照功能的核心是搜索快照中的索引,这一步是通过快照索引实现的。为了和集群中的普通索引区别开来,我们将实际存储在快照中的索引称为快照索引。通过使用 Easysearch 的 \_restore API 并指定 remote_snapshot 存储类型来创建快照索引。 创建快照索引时,注意名称不能与当前索引名称重复。通常我们备份完索引后,可删除索引释放节点磁盘空间,创建快照索引时默认使用原来的名称。 ```plain # 删除 infini 索引释放磁盘空间 DELETE infini # 创建快照索引,使用原索引名称 POST /_snapshot/my-fs-repository/1/_restore { "indices": "infini", "include_global_state": false, "include_aliases": false, "storage_type": "remote_snapshot" } ``` 创建快照索引的命令和还原快照的命令非常相似,关键在于 storage_type 参数指定 remote_snapshot 存储类型。 如果要将快照中的全部索引都创建快照索引,可省略 indices 参数。 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/2.png" "" %}} 如果想在创建快照索引时指定不同的名字,参考下面的命令。 ```plain POST /_snapshot/my-fs-repository/1/_restore { "indices": "infini", "include_global_state": false, "include_aliases": false, "storage_type": "remote_snapshot", "rename_pattern": "(infini)", "rename_replacement": "snapshot-$1" } ``` - rename_pattern: 使用此选项指定索引匹配的正则表达式。使用捕获组重用索引名称的部分。 - rename_replacement: 使用 $0 包括整个匹配索引名称,使用 $1 包括第一个捕获组的内容,等等。 上述命令创建出来的快照索引名称是 snapshot-infini 。 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/3.png" "" %}} 经过上面一系列的操作,我已经拥有了两个快照索引。 ## 搜索快照索引 我们通过搜索快照索引达到搜索快照数据的目的,令人开心的是搜索快照索引和搜索普通索引的语法完全一样。😀 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/4.png" "" %}} ## 常见问题 **如何区分普通索引和快照索引呢?** 我们可以通过索引的 settings 信息区分,快照索引的 settings 信息中有 store.type: remote_snapshot 信息,普通索引没有此信息。 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/5.png" "" %}} **快照索引能写入数据吗?** 快照索引无法写入,数据仍然保持在快照格式中存储在存储库中,因此可搜索快照索引本质上是只读的。 任何尝试写入可搜索快照索引的操作都会导致错误。 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/6.png" "" %}} **快照索引不想要了怎么办?** 直接删除,需要时再执行创建快照索引流程。此外快照在创建快照索引后,无法直接删除快照,要先删除快照索引。 {{% load-img "/img/blog/2024/searchable-snapshot-read-this-article/7.png" "" %}} 如果您对上述内容有任何疑问,欢迎与我讨论。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}