1、索引状态的管理
对索引状态的管理操作包括:清空缓存(clear cache)、刷新索引(refresh index)、冲洗索引(refresh index)、强制合并(force merge)、关闭索引(close index)、冻结索引(freeze index)。
1.1、清空缓存(clear cache)
ES使用的缓存有三类:节点的查询缓存、分片的请求缓存、字段数据(fielddata)缓存。fielddata是一种缓存于内存中的数据结构,它是一个文档主键指向每个字段数据的映射,类似于数据库中的表结构。
我们可以使用以下代码来清空某类缓存:
// 清空字段数据缓存
POST /{索引名称}/_cache/clear?fielddata=true
// 清空节点的查询缓存
POST /{索引名称}/_cache/clear?query=true
// 清空分片的请求缓存
POST /{索引名称}/_cache/clear?request=true
如果要想把索引的所有类型的缓存都一次性清空,则可以使用以下代码:
POST /{索引名称}/_cache/clear
1.2、刷新索引(refresh index)和 冲洗索引(refresh index)
数据写入到索引的时候,并不会直接写入到磁盘上,因为写入磁盘的成本比较高,会按着一定流程将数据周期性的持久化到磁盘上。索引数据写入磁盘的过程如下图:
整个过程大体分为4步:
- 将数据写入到缓冲区和事务日志中,此时写入的数据还不能被搜索到。
- 通过「刷新索引」将缓冲区中的数据写入到文件系统缓存。
- 通过「冲洗索引」将文件系统缓存中的数据写入到磁盘中。
- 清空事务日志(每次写入磁盘后会清空事务日志,正常情况下,一趟正常流程下来,事务日志最后应该是空的)。
对于事务日志的作用:假设ES宕机,它会在下次启动的时候自动将事务日志中的数据恢复到磁盘上,以此来减少数据丢失。
1.3、强制合并(force merge)
一个索引可以对应一个或多个主分片,每个分片实质上就是一个Lucene索引,一个Lucene索引又包含一个或多个段(segment)。
数据文档从索引中删除的时候,并不是真正的从磁盘上删除,而是给这个要删除的数据文档设置一个删除标记。
「强制合并」要做的就是将零碎的小段合并一个大段并且将标记为删除的数据索引真正的从磁盘中去除掉,借此可以将被标记为删除的数据文档所占据的空间释放出来。
1.4、关闭索引(close index)
对于ES中那些业务上不需要但是又不能删除的索引,我们可以通过「关闭索引」使得被关闭的所以不再接收读写请求。索引被关闭后,该索引在集群中相关的内部数据也会被销毁。
关闭索引和重新打开索引的操作如下:
// 关闭索引
POST /{索引名称}/_close
// 重新打开索引
POST /{索引名称}/_open
1.5、冻结索引(freeze index)
针对那些不会再被写入数据,且偶尔需要查询的索引,我们可以选择「冻结索引」。索引一旦被冻结,则只允许读数据,不能再写数据。
查询被冻结的索引时,ES会实时构建索引的每个分片的瞬时数据结构,并在完成查询后将这些数据结构删除。
冻结索引和解冻索引的操作如下:
// 关闭索引
POST /{索引名称}/_freeze
// 重新打开索引
POST /{索引名称}/_unfreeze
2、索引的块
我们可以通过索引的块(blocks)阻止对某个索引的写请求和读请求,即使某索引称为只写或只读的状态。
索引的块的配置如下:
配置 | 含义 |
---|---|
index.blocks.read_only | 设置为true时,索引及元数据变为只读状态,不可写入、不可删除 |
index.blocks.read_only_allow_delete | 设置为true时,与index.blocks.read only类似但可以删除索引 |
index.blocks.read | 设置为true时,禁止索引的读取操作 |
index.blocks.write | 设置为true时,禁止索引的写入操作,但是可以写入元数据 |
index.blocks.metadata | 设置为true时,阻止读写元数据 |
假设我们要把某个索引设置为只读的状态,命令如下:
PUT {索引名称}/_settings
{
"index.blocks.read_only":"true"
}
3、参考文献
- 《Elasticsearch数据搜索与分析实战》——王深湛
上一篇:《聊一聊Elasticsearch的索引(1)》
下一篇:无(本篇为最终章)