阅读 66

大数据利器Elasticsearch搜索之索引别名alias实现零停机

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
本Elasticsearch相关文章的版本为:7.4.2

在前一篇文章中,我们介绍了如何重新索引数据,但是我们需要修改应用中的索引名称,但是使用索引别名可以不用修改应用中的索引别名,实现应用零停机。

索引别名

索引别名就像Windows系统中的桌面快捷方式或者Linux系统中的软链接。
以Linux中的软链接为例:
假设某软件启动时读取的配置文件名为config.yml, 目前需要使用新的配置文件new_config.yml但是又不希望修改启动文件,那么我们可以使用软链接把config.yml指向new_config.yml即可。

xxxx -c config.yml
复制代码

那么启动文件读取config.yml的时候实际上是读取new_config.yml的内容。

ln -s new_config.yml config.yml
复制代码

那么在Elasticsearch中,也提供了这种类似的功能,那就是索引别名。以前一篇如何重新索引数据的测试索引为例,有以下背景情况:

  1. Elasticsearch中的重新索引前的索引名为old_book_index
  2. 通过alise接口为old_book_index索引绑定别名book
  3. 在应用服务中访问此索引时通过别名book进行请求数据
PUT /old_book_index/_alias/book
复制代码

现在我们进行数据重新索引操作:

POST /_reindex
{
  "source": {
    "index": "old_book_index"
  },
  "dest": {
    "index": "new_book_index"
  }
}
复制代码

现在new_book_index才是我们应该访问的索引数据, 但是应用服务中通过别名book实际访问的是old_book_index。此时,我们只需要把book别名从索引old_book_index中移除,同时把book重新绑定到new_book_index, 这样应用服务在无需任何改动下通过别名book就可以访问正确的new_book_index索引数据了。

POST /_aliases
{
    "actions": [
        { "remove": { "index": "old_book_index", "alias": "book" }},
        { "add":    { "index": "new_book_index", "alias": "book" }}
    ]
}
复制代码

此时,我们就可以通过索引别名book访问支持全文检索的description字段了:

POST /book/_search
{
  "query": {
    "match": {
      "description": "guide"
    }
  }
}
复制代码
文章分类
后端
文章标签