大幅降低存储成本,Elasticsearch可搜索快照是如何办到的?

标签: 成本 elasticsearch 搜索 | 发表时间:2020-12-16 19:26 | 作者:云加社区
出处:https://www.infoq.cn

Elasticsearch 7.10 版本最近发布,该版本有一个重磅特性:Searchable snapshots (可搜索快照功能),可以大幅度地降低存储成本。那么 Searchable snapshots 的使用方式和实现效果是怎样的呢,下面就让我们来一探究竟吧!

一、功能介绍

在 Searchable snapshots 可搜索快照功能发布之前,通过调用 _snapshot API 对索引打的快照,不管是存储在 S3 还是 HDFS 或者是腾讯云的对象存储 COS上,都是不能够直接进行查询的。

快照只能用于数据的冷备份,如果要查询的话需要先调用 API 把快照恢复到集群中,当快照中的索引初始化完成后,才可以去查询。

而可搜索快照功能就使得存储在远端 S3、HDFS、COS 中的快照能够满足查询的需求了,ES 的数据文件不是只能存储在本地文件系统上,还可以支持存储在远端的 S3、HDFS、COS 等存储介质上,实际上实现了存储与计算的分离。

Searchable snapshots 可搜索快照功能预计会给 ES 带来新的繁荣,因为有非常多的用户使用 ELK 架构构建日志系统。日志的数据量是非常大的,但是查询的频率一般比较低,所以用户的痛点是:在满足基本查询需求的条件下同时降低 ES 的存储成本。

现在基于 Searchable snapshots 可搜索快照功能,可以把大量的比较旧的索引都存储到 S3/COS 上,真正需要查询的时候可以去查询 S3/COS 中的数据。因为 S3/COS 本身成本是非常低的,大约只有 SSD 磁盘的十分之一,所以使用 ES 存储数据的成本大大降低了。

另外一方面,可搜索快照功能也可以提高集群的稳定性,可以仅仅使用一个较小规模的集群支撑最近一段时间热索引的读写即可,老的索引都可以存放在 S3/COS 中,真正需要查询的时候再去查 S3/COS 中的数据,因为集群规模小,不至于出现一个超大规模的集群存储所有的数据,从而导致集群不稳定的现象发生。

不过就当前 7.10 版本的可搜索快照功能的特点来看,没有我们预想的可以完全实现存储计算分离。

因为当把一个存储在 S3/COS 上的快照 mount 到一个集群中时,需要先执行快照恢复,把快照中的文件从 S3/COS 读取到集群的本地磁盘上,快照中的索引先进行初始化,索引所有的数据文件恢复完毕后该索引才变为 green。

看起来和我们手动去从快照中恢复索引没有什么两样,区别在于 Searchable snapshots 可搜索快照功能时,在执行快照恢复的这段过程中索引仍然是可以查询的。如果集群本地磁盘上的索引文件不存在的话就直接去 S3/COS 中去读,只不过读的过程会比较慢。

而为什么需要先把数据文件从 S3/COS 恢复到本地呢?官方的解释是这样可以保证查询性能,在一个可搜索快照中的索引完全初始化完成后,读取该索引和读取普通的索引的性能几乎没有差别。实际上可搜索快照类型的索引在集群的本地磁盘上存放了完整的一份数据文件,只不过命名规则和普通的索引不一样。

因为当前 7.10 版本的可搜索快照功能,数据还需要从 S3/COS 中恢复到集群的本地磁盘上缓存一份,所以该功能真正的用处在于可以节省最多一半的存储空间。可搜索快照类型的索引在集群中默认副本数为 0, 数据的可靠性以及弹性完全交由 S3/COS 来保证,不需要额外给索引增加副本,从而可以降低一半的存储成本。

当集群中可搜索快照类型的索引的分片因为节点故障不可用时, ES 会自动地从 S3/COS 中读取分片对应的数据文件进行恢复,从而保证数据的可靠性;如果需要提高可搜索快照类型的索引的副本数量,也是直接从 S3/COS 中读取数据,而不是从本地磁盘上复制主分片的数据文件。

利用当前版本的可搜索快照功能,我们可以对一些老的查询频率非常低的索引,先备份到 S3/COS,之后删除,然后再把备份好的快照 mount 到集群中,使得这些索引下需要的时候仍然可以查询。

在极端情况下,实际上只需要对这些老的查询频率非常低的索引,只进行备份,真正需要查询的时候再 mount 到集群上,当然,需要容忍缓慢的查询过程。

当前 7.10 版本的可搜索快照功能的为 Beta 版,社区里也给出了该功能的路线图,会在将来的版本中实现完全的计算存储分离,直接去访问 S3/COS 中的索引数据完成查询, 而不是像当前这个版本需要先恢复到本地磁盘中。

所以总的来说,当前 7.10 版本的可搜索快照功能,一方面可以降低一半左右的存储空间,大大的节省了成本;另外一方面保证了从快照中恢复到集群上的索引的查询性能,使得应用层不必感知到这种新的存储方式带来的变化。

二、使用方式

可搜索快照的使用方式比较简单,我们可以选择通过手动调用 API 来把远端的快照 mount 到集群中,也可以在 ILM中 使用。

1. 手动munt快照

直接调用API:

POST /_snapshot/my_repository/my_snapshot/_mount?wait_for_completion=true { "index": "test", "renamed_index": "test1", "index_settings": { "index.number_of_replicas": 0 }, "ignored_index_settings": [ "index.refresh_interval" ] }

上述操作把快照 my_snapshot 中的 test 索引挂载到集群中,重命名为 test1, 挂载后的索引副本数设置为 0, 同时忽略掉旧索引中设置的 index.refresh_interval 参数。

在执行完上述操作后,可以看到集群中出现了一个新的索引 test1, 集群当前状态为 yellow,test 索引的分片执行初始化,初始化完成后,test1 索引状态变为 green。

此时查看新索引 test1 的 settings,发现其和普通的索引有以下不同点:

{ "test1":{ "settings":{ "index": { "blocks":{ "write":"true" }, "recovery":{ "type":"snapshot_prewarm" }, "store":{ "type":"snapshot", "snapshot":{ "snapshot_name":"test", "index_uuid":"p1Opq7gdQz6WTeKgiIEaTw", "index_name":"test-aggregation-2020-11-25-02", "repository_name":"my_repository2", "snapshot_uuid":"Muy7vsiLSWKbQf3mJALfLw" } } } } } }

index.blocks.write 默认为 true,也即可搜索快照索引默认是只读的;index.recovery.type 为 snapshot_prewarm, 意味着数据是从快照中恢复的;index.store.type 为 snapshot,区别于普通索引的 fs 方式。

另外需要注意的是,索引 test1 恢复到 green 后,除了索引的部分元数据和底层的数据文件命名方式与普通的索引不同,索引自身的一些数据结构如 FST 也是常驻内存的,并不会在查询完毕后自动释放掉内存,所以此时已经和普通的索引区别不大了。当然,新索引test1也是可以冻结的,冻结的执行过程和普通的索引相同。

2. 在ILM中使用

在 ILM 索引生命周期管理中也可以使用可搜索快照功能,通过 API 使用该功能的基本用法如下:

PUT _ilm/policy/my_policy { "policy": { "phases": { "cold": { "actions": { "searchable_snapshot" : { "snapshot_repository" : "my_repository", "force_merge_index": true } } } } } }

对于使用上述 ILM 策略的索引,在 cold phase 会首先把该索引备份到指定的快照仓库 my_repository 中,然后再把快照中的索引挂载为一个可搜索快照的索引。

使用过程中需要注意以下几点:

可搜索快照只能在cold phase使用;如果 ILM 策略有配置 delete phase, 默认情况下,在 delete phase 会主动删除 cold phase 中的可搜索快照, 因此需要在 delete phase 中显式设置 delete_searchable_snapshot 为 false;默认情况下 force_merge_index 为 true, 也即在索引进入到 cold phase 时,会先把索引 force merge 到 1 个 segment,然后再备份到快照仓库中。此举一方面是为了降低存储到 S3/COS 上的存储成本,同时降低后续从 S3/COS 中拉取数据时的产生的费用,文件越少读取 S3/COS 产生的费用就越低;另外一方面当数据从 S3/COS 恢复到本地后,也可以获得较好的查询性能。

比较遗憾的是,在当前 7.10 版本中,还不支持直接在 kibana 的索引生命周期管理页面中通过操作界面直接使用可搜索快照功能。

三、未来展望

Searchable snapshots 可搜索快照功能,在当前 Beta 版本中,仍然需要把存储在远端 S3/COS 中的数据恢复到本地缓存起来,所以可以节省的存储成本是有限的。所以,官方也给出了可搜索快照功能的路线图:

结合 Data tiers 数据分层功能我们看到,当前 Beta 版的可搜索快照是用在数据分层的 Cold 层,在该层中的索引一般是只读的,但是仍然需要保证一定的查询性能。

所以在 Cold 层可以把数据先从 S3/COS 中恢复到集群的本地磁盘上,做一层缓存,查询索引的时候优先从本地缓存中读取,这样查询性能就有了保证。

但是数据的可靠性或者弹性可以完全由 S3/COS 来保证,因此在 Cold 层中的索引,可以只保留主分片,当主分片所在的节点故障时可以从远端的 S3/COS 中恢复数据,这样存储成本就降低了一半。

而官方未来的规划,是要开发 Frozen 层,在该层中的索引,对查询性能没有较高的要求,因此可以直接去查询 S3/COS 中的数据,而不需要再把数据从 S3/COS 中恢复到本地缓存起来。

因此在 Frozen 层,才真正实现了存储与计算的分离,带来的影响是不可估量的,因为一个集群能够支撑的数据存储量可以无限大,用户的成本可以大大的降低。

然而,在 Frozen 层,直接去查询存储在 S3/COS 上的数据,查询性能就完全取决于 S3/COS 的 API 接口的性能,可能会造成查询过程非常缓慢。

而在早先的版本中,ES 已经实现了异步查询 Async search, 提交查询请求时只返回一个 ID, 后续通过轮询这个 ID 获取到查询结果,在轮询过程中可以获取到查询的部分结果,直至查询结果完全返回。因此 Async search 就解决了在 Frozen 层因为查询数据缓慢带来的的体验效果不好的问题。

所以,在将来 Frozen 层开发完成之后,我们可以借助于完全实现存储于计算分离的可搜索快照功能,根据需要从 S3/COS 中去查询数据,真正做到按需加载。查询完毕后,此次查询而加载的内存数据将会自动释放,不仅节省了大量的存储成本,也因为集群的规模可以变得非常小而使得集群的稳定性大大地提高。

总的来说,不光是 Searchable sanpshots 功能,还有 Data tiers 数据分层功能,都还在逐渐演进的路上,两者结合起来,将会给 Elasticsearch 带来革命性的变革!

头图:Unsplash

作者:高斌龙 - 腾讯云大数据研发工程师

原文: 大幅降低存储成本,Elasticsearch可搜索快照是如何办到的?"

来源:云加社区 - 微信公众号 [ID:QcloudCommunity]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关 [成本 elasticsearch 搜索] 推荐:

大幅降低存储成本,Elasticsearch可搜索快照是如何办到的?

- - InfoQ推荐
Elasticsearch 7.10 版本最近发布,该版本有一个重磅特性:Searchable snapshots (可搜索快照功能),可以大幅度地降低存储成本. 那么 Searchable snapshots 的使用方式和实现效果是怎样的呢,下面就让我们来一探究竟吧. 在 Searchable snapshots 可搜索快照功能发布之前,通过调用 _snapshot API 对索引打的快照,不管是存储在 S3 还是 HDFS 或者是腾讯云的对象存储 COS上,都是不能够直接进行查询的.

Elasticsearch:使用 Elasticsearch 进行语义搜索

- - 掘金 后端
在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用. 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果. 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局限性. 主要缺点之一在于它对词汇匹配的依赖. 关键字搜索将查询中的每个单词视为独立的实体,通常会导致结果可能与用户的意图不完全一致.

[Elasticsearch] 分布式搜索

- - 编程语言 - ITeye博客
本文翻译自Elasticsearch官方指南的 Distributed Search Execution一章. 在继续之前,我们将绕一段路来谈谈在分布式环境中,搜索是如何执行的. 和在分布式文档存储(Distributed Document Store)中讨论的基本CRUD操作相比,这个过程会更加复杂一些.

ElasticSearch入门-搜索如此简单

- - ITeye博客
搜索引擎我也不是很熟悉,但是数据库还是比较了解. 可以把搜索理解为数据库的like功能的替代品. 第一、like的效率不行,在使用like时,一般都用不到索引,除非使用前缀匹配,才能用得上索引. 第二、like的不能做到完全的模糊匹配. 比如like '%化痰冲剂%'就不能把”化痰止咳冲剂“搜索出来.

Elasticsearch搜索类型(query type)详解

- - ITeye博客
欢迎发送邮件至 [email protected]. 请支持原创 http://donlianli.iteye.com/blog/2094305. es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH.

基于Elasticsearch实现搜索推荐

- - GinoBeFunny
在 基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此基础上进一步优化搜索体验,在当搜索无结果或结果过少时提供推荐搜索词给用户. 在根据用户输入和筛选条件进行搜索后,有时返回的是无结果或者结果很少的情况,为了提升用户搜索体验,需要能够给用户推荐一些相关的搜索词,比如用户搜索【迪奥】时没有找到相关的商品,可以推荐搜索【香水】、【眼镜】等关键词.

基于Elasticsearch实现搜索建议

- - GinoBeFunny
搜索建议是搜索的一个重要组成部分,一个搜索建议的实现通常需要考虑建议词的来源、匹配、排序、聚合、关联的文档数和拼写纠错等,本文介绍一个基于Elasticsearch实现的搜索建议. 电商网站的搜索是最基础最重要的功能之一,搜索框上面的良好体验能为电商带来更高的收益,我们先来看看淘宝、京东、亚马逊网站的搜索建议.

【翻译】用 elasticsearch 和 elasticsearch 为数十亿次客户搜索提供服务

- - IT技术博客大学习
标签:   elasticsearch   elasticsearch   搜索.    原文地址: http://www.elasticsearch.org/blog/using-elasticsearch-and-logstash-to-serve-billions-of-searchable-events-for-customers/.

Elasticsearch分布式搜索架构原理 | Elasticsearch权威指南(中文版)

- -
在继续之前,我们将绕道讲一下搜索是如何在分布式环境中执行的. 它比我们之前讲的基础的增删改查(create-read-update-delete,CRUD)请求要复杂一些. 本章的信息只是出于兴趣阅读,使用Elasticsearch并不需要理解和记住这里的所有细节. 阅读这一章只是增加对系统如何工作的了解,并让你知道这些信息以备以后参考,所以别淹没在细节里.

开源搜索引擎评估:lucene sphinx elasticsearch

- - 鲁塔弗的博客
lucene系,java开发,包括 solr和 elasticsearch. sphinx,c++开发,简单高性能. 搜索引擎程序这个名称不妥当,严格说来应该叫做 索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用: 替代mysql数据库 内置的索引.