本文,我们将讨论以下ES中最容器使用、可能也是最有用的特性之一:别名。别名正如其名,他们是你使用的指针或者名称,对于1个或多个具体的所有。由于其提供的灵活性,别名再扩展集群和管理数据在索引中的分布时是非常有用的。即使使用的Elasticsearch集群只有一个单独的索引,也请使用别名。因为,以后你会为其赋予灵活性而感谢现在。
什么是别名
🤔思考:别名到底是什么,创建一个别名会为Elasticsearch带来怎样的额外负载(任何额外功能,不可能不存在不需要资源就能实现)?
别名是索引之上得抽象,非常强大和灵活。别名的生命周期是存于集群状态之中,由主节点管理。这意味着,如果有一个称为idaho的别名,指向了名为土豆的索引,那么负载就是集群状态映射中额外的键,将名称idaho映射为具体的索引名称-土豆。这就意味着,和额外的索引相比,别名更加轻量级,维护数千个别名都不会负面地影响集群。不过,我们反对创建数十万甚至是上百万的别名,因为到了这个临界点,即使最小的单个映射条目都会引起集群状态膨胀为一个很大的规模。由于每次集群状态发生变化时,整个状态都需要发送到每个节点,所以创建一个新集群状态的操作将耗费更长的时间
别名为什么是有用的
(1)灵活的扩容:推荐每个人为他们的Elasticsearch所以使用别名,因为在未来重建索引的时候,别名会赋予你更多的灵活性。假设一开始创建索引只有一个主分片,之后你又决定为索引扩容。如果为原索引使用的是别名,现在你可以修改别名让其指向额外创建的新索引,而无须修改被搜索的索引之名称(假设一开始你就为搜索使用了别名)。
(2)动态的滚动查询:在实际应用中,我们也不应该向单个索引持续写入数据,知道它的分片巨大无比。巨大的索引会在数据老化后难以删除,以——id为单位删除文档不会立即释放空间,删除doc只在lucene分段合并时才会真正从磁盘中删除。即使手工触发分段合并,仍会引起较高的I/O压力,并且可能因为分段巨大导致合并过程中磁盘空间不足(分段大小大于此片可用空间的一半)
因此,另外一个有用的特性是:在不同的索引创建窗口。比如,如果为数据创建了每日索引,你可能期望一个滑动窗口覆盖过去一周的数据,别名就称为last-7-days.然后,每天创建新的每日索引时,将其加入别名,同时删除第8天前的旧索引。
这样,对于业务方来说,读取时使用的别名不变,当需要删除数据的时候,可以直接删除整个索引
(3)进行索引分组
(4)使用别名过滤器来屏蔽文档,他们可以对正在执行的查询自动地实施过滤
(5)结合别名和路由,在查询或索引得时候自动地使用路由值。
管理别名
使用专门的别名API端点和一系列操作来创建别名。每个操作是一个添加或删除的映射,外加这个操作所针对的索引和别名。
添加和移除索引别名
上面为get-together索引增加名为gt-alias的别名,而虚构的old-get-together索引将删除别名gt-alias,如果索引不存在,别名操作将会失败。
当然上面复合操作也可以用Elasticsearch的HTTP方法,在别名API上执行单个的操作:
别名的创建
当创建别名的时候,API端点有很多选项可供选择。例如,你可以在一个具体的索引上、多个索引上或名称符合某个模式的索引上创建别名。
别名的删除
接收同样的路径参数格式
curl -XDELETE 'localhost:9200/{index}/_aliaa/{alias}'
别名信息的获取
当然你也可以向某个索引发送一个_alias的GET请求,检索指向该索引的全部别名。或者也可以去掉索引名称,检索某个别名所指向的全部索引。
除了索引_alias端点,你有一系列不同的方法来获取索引的别名信息:
补充
使用别名过滤器来屏蔽文档
他们可以对正在执行的查询自动地实施过滤。比如:对于你的get-together数据,一个别名仅仅指向包含elasticsearch标签的分组,那么这个别名可能非常有用的。如此依赖,你可以创建一个自动进行过滤的别名,如下:
结合别名和路由
注:定制路由允许你将分享同一个路由值得多篇文档归集到单一分片中,而一旦这些文档放入到统一索引,就可以路由某些查询,让它们可以在索引分片得子集中执行
别名是索引之上得抽象,非常强大和灵活。假设别名指向一个单独得索引,那么他们也可以和路由一起使用,在查询或索引得时候自动地使用路由值。如果某个别名指向了多个索引,而你试图将文档索引到该别名,那么Elasticsearch就会返回一个错误,原因是系统不知道文档应该被索引到哪个具体的索引数据。
仍然使用前面的例子,你可以创建一个称为denver-events的别名,自动地将名称中包含“denver”关键词的活动挑选出来。同时将“denver”加入路由,这样在搜索和索引的时候,系统会限制查询的执行范围。
当使用denver-events别名来建立索引的时候,这和使用routing=denver字符串参数的效果相同。由于别名是轻量级的,可以根据需要创建很多,而与此同时使用定制路由来支持更好的扩展