Elasticsearch用的好,下班下的早,浅谈三温暖架构

639 阅读3分钟

冷热资料管理基本概念

针对time-based 的资料,Elasticsearch 在 5.x 版的时候,就提出了 Hot-Warm 的架构,主要是针对 常用的资料 与 时间较久也就是不常用的资料 分开用不同的硬体来存放,以达到资源有效的利用,不过从 Elastic Stack 6.3 开始,陆续在接连的几个版本中,针对 time-based 资料的管理机制,提供了更全面的解决方案。

Hot-Warm-Cold Architecture

这边提到了 Hot Warm Cold 三种状态,可想而知,就是除了分出 Hot Warm 之外,还要更细分出 Cold 的存放方式,所以使用上的资料管理顺序,也就如下图所示,新进来的资料就是会配置到 Hot Data Node,再来一段时间后,进入 Warm Data Node,再过一段时间后,最后进入 Code Data Node。

而这三种的定义与差异如下:

Hot: 因为负责最新的资料,所以会负责处理 indexing 的资料,同时新的资料被使用的机率也最高,所以也会处理频繁的 searching 请求。

Warm: 当一份 Index 的资料成长到一定的量、或是已经过了一段时间,会将这份资料转到 Warm data node,这时 Warn data node 是 read-only 也就是不会需要处理 indexing 的请求,只会专注在处理 searching 的请求。

Cold: 当一份 Index 的资料经过一段较长的时间,判定会较少使用到时,会将他移到 Cold data node,并且针对这些资料进行 Freeze 的处理,这时资料会被以最节省系统资源的状态下被保存,还是可以提供查询,但速度会较慢。

Hot Warm Cold 的資源使用狀況

从上图可以看到,在这种架构下,各自针对 JVM heap 的使用状况:

Hot Node 因为会处理 Indexing 的请求,所以 JVM heap 会有一定比例拿来处理 Indexing。

Warm Node 不处理 Indexing 所以只会有一半 JVM heap 拿来处理 query request,剩下的会来给 Lucene 用作暂存。

Cold Node 不会处理 Indexing,而且针对 query request 所产生的 transient cache 也会一用完就尽快的释放,减少 heap 的使用。

Freeze Indices

所谓的 code data 就是被 freeze 的 indices。

那么 Elasticsearch 为什么要特别建立这个 Freeze 的机制。

一般的 Index,随着搜索的用法等不同,JVM heap需要的大小与 Index 存放的资料量比例,大约是 1:8 ~1:100 不等,因此这会限制了某个 Index 能存放的资料量的大小。

但是我们在较少用的旧资料上,我们希望能有更有效的资源使用,也就是一个同样记忆体大小的 Node 能存放更多的资料、也愿意牺牲一些查询时的反应速度,因此 Elasticsearch 就设计的这个 Freeze 的机制,让被 Freeze 的 Index 能尽量减少 heap 的使用。

Freeze API

要把一个 Index freeze 或 unfreeze 使用的方式如下:

POST /my_index/_freeze
POST /my_index/_unfreeze

目前 Freeze Index 时,Elasticsearch 会在背后将 Index close 再重新打开,所以 cluster 的状态会短暂进入 红灯 直到 index 重新打开时,primary shard 被重新载入。

freezed Index 是 read-only ,也就是连 Segment file 的 _forcemerge 都不能操作,所以要 Freeze 之前,先记得将 Index 进行 segment file 的 force merge。

POST /sampledata/_forcemerge?max_num_segments=1

搜索被 Freeze 的 Index

为了避免 Freezed index 在无意识的情况下被存取到, Freezed Index 是会被指定为 throttled 的,也就是预设 Elasticsearch 的搜索,是不会查到 Freezed index 的资料,若是要查询包含 Freezed index 里的资料,需要在搜索时带上 ignore_throttled=false 的参数。

GET /sampledata/_search?ignore_throttled=false
{
 "query": {
   "match": {
     "name": "kevin"
   }
 }
}

在 Kibana 搜索到 Freezed Index 里的资料

若是在 Kibana 里,想要搜索 Freezed Index 的资料的话,需要从以下的地方进入:

左边 Menu 选单底下的 Stack Management > 找到 Kibana 里的 Advanced Settings > 找到 Search 里的 Search in frozen indices 并设定成 On。