别名是什么
别名(alias)是指向一个或多个索引的虚拟名称,用于读写解耦与零停机切换。写入别名用 is_write_index 指定唯一的写目标,读别名可以同时覆盖新旧索引从而平滑迁移;过滤别名能把别名限定在部分文档上,路由别名则能减少写入时的分片广播。应用只认别名,索引的滚动与重建对业务透明。
基本信息
| 接口 | POST /_aliases,actions 数组原子批量增删 |
|---|---|
| 写别名 | add 时设 is_write_index: true,同一别名只能有一个写索引 |
| 过滤别名 | filter 字段把别名限定在部分文档上 |
| 路由别名 | routing 绑定固定路由值,减少写入分片广播 |
| 查看 | GET /<index>/_alias 或 GET /_alias/<名称> |
| 适用版本 | Elasticsearch 7.x / 8.x |
典型使用场景
- 索引滚动:新索引建好后把写别名切过去
- 迁移重建:新索引灌完数据后用别名原子切换
- 多索引联合查询:一个别名覆盖按日期的多个索引
- 按租户或地区拆分:过滤别名只暴露部分文档
- 灰度验证:新旧索引同时挂在读别名下做结果比对
- 简化业务配置:应用侧只配别名,不关心索引命名
示例
示例
POST /_aliases
{
"actions": [
{ "add": { "index": "logs-000002", "alias": "logs", "is_write_index": true } }, # 新索引作为写目标
{ "remove": { "index": "logs-000001", "alias": "logs" } }, # 旧索引摘掉写标记
{ "add": { "index": "logs-000001", "alias": "logs_read" } } # 保留只读访问
]
}
GET /logs/_alias # 查看别名指向
GET /logs/_search # 业务侧只查别名别名类型与用途
| 类型 | 关键参数 | 用途 |
|---|---|---|
| 写别名 | is_write_index | 指定唯一写入目标 |
| 读别名 | 无 | 同时覆盖多个索引 |
| 过滤别名 | filter | 只暴露部分文档 |
| 路由别名 | routing | 减少写入分片广播 |
| 滚动别名 | 配合 ILM rollover | 写入永远指向最新索引 |
同一别名在同一时刻只能有一个写索引,重复指定会报错;切换写目标时先在动作里把新索引设为写索引。
别名操作通过 _aliases 的 actions 一次性提交是原子的,避免先删后加造成中间状态;切换完成后可用 GET /_alias 核对指向。
GET /<alias>/_search 会同时查询别名下所有索引,滚动期间新旧数据可能重复出现;确认无冗余后再移除旧索引上的别名。