Elasticsearch 集群管理与操作指南
1. 索引别名的使用
在 Elasticsearch 中处理多个索引时,可能会难以跟踪。例如,存储日志时,由于日志消息量通常很大,按天创建单个索引是一种合理的数据划分方式。但随着时间推移,管理众多索引会变得困难。索引别名可以简化这一过程,让我们用一个名称操作多个索引。
- 索引别名的定义 :索引别名是一个或多个索引的额外名称,可通过该名称查询索引。一个别名可关联多个索引,一个索引也可属于多个别名。但需注意,不能使用关联多个索引的别名进行索引操作或实时 GET 操作,否则 Elasticsearch 会抛出异常,不过关联单个索引的别名可用于索引操作。
- 创建别名 :使用 HTTP POST 方法向 _aliases REST 端点发送定义好的操作来创建索引别名。示例如下:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "add" : { "index" : "day10", "alias" : "week12" } },
{ "add" : { "index" : "day11", "alias" : "week12" } },
{ "add" : { "index" : "day12", "alias" : "week12" } }
]
}'
若别名不存在,上述命令会创建它;若已存在,则会将指定索引添加到该别名中。
-
搜索操作
:原本跨三个索引的搜索命令如下:
curl -XGET 'localhost:9200/day10,day11,day12/_search?q=test'
使用别名后,可简化为:
curl -XGET 'localhost:9200/week12/_search?q=test'
- 修改别名 :可通过类似添加索引到别名的方式从别名中移除索引,只需将 add 命令替换为 remove 命令。例如,从 week12 别名中移除 day9 索引的命令如下:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "remove" : { "index" : "day9", "alias" : "week12" } }
]
}'
- 组合命令 :add 和 remove 命令可在一个请求中发送。例如,将之前的添加和移除命令组合成一个请求:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "add" : { "index" : "day10", "alias" : "week12" } },
{ "add" : { "index" : "day11", "alias" : "week12" } },
{ "add" : { "index" : "day12", "alias" : "week12" } },
{ "remove" : { "index" : "day9", "alias" : "week12" } }
]
}'
- 检索所有别名 :使用 HTTP GET 命令检索集群中所有可用别名或某个索引关联的所有别名。示例如下:
curl -XGET 'localhost:9200/day10/_aliases'
curl -XGET 'localhost:9200/_aliases'
第二个命令的响应示例如下:
{
"day10" : {
"aliases" : {
"week12" : { }
}
},
"day11" : {
"aliases" : {
"week12" : { }
}
},
"day12" : {
"aliases" : {
"week12" : { }
}
}
}
- 移除别名 :使用 _alias 端点移除别名。例如,从 data 索引中移除 client 别名的命令如下:
curl -XDELETE localhost:9200/data/_alias/client
- 过滤别名 :别名的使用类似于 SQL 数据库中的视图,可使用完整的 Query DSL 对计数、搜索、按查询删除等操作应用查询。例如,创建一个名为 client 的别名,对 data 索引应用 clientId 过滤器:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{
"add" : {
"index" : "data",
"alias" : "client",
"filter" : { "term" : { "clientId" : "12345" } }
}
} ]
}'
使用该别名时,请求会自动按 clientId 字段值为 12345 进行过滤。
-
别名与路由
:可向别名添加路由值。例如,基于用户标识符进行路由,为 client 别名设置查询时使用 12345、12346、12347 路由值,索引时使用 12345 路由值:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{
"add" : {
"index" : "data",
"alias" : "client",
"search_routing" : "12345,12346,12347",
"index_routing" : "12345"
}
} ]
}'
使用该别名进行索引时,会使用 index_routing 属性指定的值;查询时,会使用 search_routing 属性指定的值。例如,发送以下查询:
curl -XGET 'localhost:9200/client/_search?q=test&routing=99999,12345'
实际使用的路由值为 12345,因为 Elasticsearch 会取 search_routing 属性和查询路由参数的公共值。
2. Elasticsearch 插件
Elasticsearch 插件可扩展其功能,主要分为 Java 插件和站点插件。
-
插件基础
:插件位于 plugins 目录下的子目录中。可手动创建插件目录并解压插件存档,也可使用插件脚本安装。站点插件被 Elasticsearch 的内置 HTTP 服务器视为文件集,通过 /_plugin/plugin_name/ URL 提供服务,无 Java 内容的插件会自动被视为站点插件,它不会改变 Elasticsearch 的行为。Java 插件通常包含 .jar 文件,会扫描 es-plugin.properties 文件,该文件包含 Elasticsearch 用于配置插件和扩展功能的入口类信息,Java 插件也可包含供内置 HTTP 服务器使用的站点部分,需放在 _site 目录中。
-
安装插件
:默认从 download.elasticsearch.org 网站下载插件,若该位置无插件,会检查 Maven Central、Maven Sonatype 和 GitHub 仓库。插件工具假设插件地址包含组织名、插件名和版本号。示例如下:
bin/plugin -install elasticsearch/elasticsearch-lang-javascript/2.0.0.RC1
上述命令会安装允许使用 JavaScript 脚本语言的插件。若省略版本号,Elasticsearch 会尝试查找与自身版本相同或最新的主版本插件。若有自定义插件且无法从上述站点获取,可使用 –url 选项指定插件位置,包括本地文件系统。示例如下:
bin/plugin -install lang-javascript -url file:///tmp/elasticsearch-lang-javascript-2.0.0.RC1.zip
- 移除插件 :移除插件可直接删除其目录,也可使用插件工具。例如,移除 river-mongodb 插件的命令如下:
bin/plugin -remove river-mongodb
安装或移除插件后,需重启 Elasticsearch 节点使更改生效。
3. 更新设置 API
Elasticsearch 可通过 elasticsearch.yml 文件指定各种参数进行调优,但该文件中的值可在运行时使用 Elasticsearch REST API 更改。设置属性时,使用 HTTP PUT 方法向 _cluster/settings URI 发送请求,有临时和永久属性设置两种选项。
-
临时属性设置
:临时属性设置仅在首次重启前有效。示例如下:
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient" : {
"PROPERTY_NAME" : "PROPERTY_VALUE"
}
}'
- 永久属性设置 :若要使属性设置在重启后仍然有效,使用 persistent 对象。可随时使用以下命令获取这些设置:
curl -XGET localhost:9200/_cluster/settings
4. 相关操作流程总结
以下是部分操作的流程总结:
graph LR
A[创建索引别名] --> B[发送 HTTP POST 请求到 _aliases 端点]
B --> C{别名是否存在}
C -- 否 --> D[创建别名]
C -- 是 --> E[添加指定索引到别名]
F[移除索引别名] --> G[发送 HTTP DELETE 请求到 _alias 端点]
H[安装插件] --> I[使用插件脚本指定插件地址]
I --> J{插件地址是否有效}
J -- 是 --> K[下载并安装插件]
J -- 否 --> L[检查其他仓库]
M[移除插件] --> N[使用插件脚本指定插件名称]
N --> O[删除插件目录]
5. 操作命令汇总
| 操作类型 | 命令示例 |
|---|---|
| 创建索引别名 |
curl -XPOST 'localhost:9200/_aliases' -d '{ "actions" : [ { "add" : { "index" : "day10", "alias" : "week12" } } ] }'
|
| 移除索引别名 |
curl -XDELETE localhost:9200/data/_alias/client
|
| 安装插件 |
bin/plugin -install elasticsearch/elasticsearch-lang-javascript/2.0.0.RC1
|
| 移除插件 |
bin/plugin -remove river-mongodb
|
| 设置临时属性 |
curl -XPUT 'localhost:9200/_cluster/settings' -d '{ "transient" : { "PROPERTY_NAME" : "PROPERTY_VALUE" } }'
|
| 获取集群设置 |
curl -XGET localhost:9200/_cluster/settings
|
6. 索引别名操作的更多应用场景
索引别名在实际应用中有多种场景,能极大提升操作的便利性和灵活性。以下是一些常见的应用场景及对应操作:
- 数据迁移 :在进行数据迁移时,可创建一个别名指向旧索引,在迁移过程中逐渐将数据迁移到新索引,最后将别名指向新索引,而应用程序无需感知索引的变化。例如,将数据从 old_data 索引迁移到 new_data 索引:
# 初始时别名指向旧索引
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "add" : { "index" : "old_data", "alias" : "data_alias" } }
]
}'
# 数据迁移完成后,将别名指向新索引
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "remove" : { "index" : "old_data", "alias" : "data_alias" } },
{ "add" : { "index" : "new_data", "alias" : "data_alias" } }
]
}'
- 按时间范围查询 :对于按时间存储的数据,可创建不同时间范围的别名,方便按时间范围进行查询。例如,创建一个名为 last_month 的别名,指向上个月的日志索引:
curl -XPOST 'localhost:9200/_aliases' -d '{
"actions" : [
{ "add" : { "index" : "logs_2024_05", "alias" : "last_month" } }
]
}'
7. 插件使用的注意事项
在使用 Elasticsearch 插件时,有一些注意事项需要关注:
- 兼容性 :插件版本需与 Elasticsearch 版本兼容,否则可能导致功能异常或无法正常工作。在安装插件前,务必查看插件的官方文档,确认其支持的 Elasticsearch 版本范围。
- 安全性 :从不可信来源获取的插件可能存在安全风险,如包含恶意代码或漏洞。建议从官方或知名的开源仓库获取插件,并定期更新插件以修复潜在的安全问题。
- 性能影响 :某些插件可能会对 Elasticsearch 的性能产生影响,如占用过多的系统资源或增加查询响应时间。在生产环境中使用插件前,应在测试环境中进行充分的性能测试,评估插件对系统性能的影响。
8. 更新设置 API 的实际应用案例
更新设置 API 在实际应用中有很多用途,以下是一些具体案例:
- 动态调整集群资源分配 :在业务高峰期,可临时增加 Elasticsearch 集群的资源分配,以提高系统的处理能力。例如,临时增加搜索线程池的大小:
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient" : {
"thread_pool.search.size" : "20"
}
}'
- 优化索引刷新间隔 :根据业务需求,可动态调整索引的刷新间隔,以平衡写入性能和查询实时性。例如,在写入大量数据时,适当增大索引刷新间隔:
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient" : {
"index.refresh_interval" : "30s"
}
}'
9. 操作流程图补充
以下是插件安装和移除操作的详细流程图:
graph TD
A[开始] --> B[选择操作类型]
B --> C{安装插件}
B --> D{移除插件}
C --> E[指定插件地址]
E --> F{地址是否有效}
F -- 是 --> G[下载插件]
F -- 否 --> H[检查其他仓库]
H --> E
G --> I[解压插件到指定目录]
I --> J[重启 Elasticsearch 节点]
D --> K[指定插件名称]
K --> L[查找插件目录]
L --> M[删除插件目录]
M --> N[重启 Elasticsearch 节点]
J --> O[操作完成]
N --> O
10. 命令使用技巧总结
| 操作类型 | 命令技巧 |
|---|---|
| 索引别名操作 | 使用组合命令可一次性完成多个操作,减少与 Elasticsearch 的交互次数,提高操作效率。 |
| 插件安装 | 省略版本号时,可让 Elasticsearch 自动选择合适的版本,但在某些情况下可能会选择不理想的版本,建议明确指定版本号。 |
| 更新设置 API | 临时属性设置可用于临时调整系统配置,永久属性设置用于长期生效的配置更改,根据实际需求选择合适的设置方式。 |
通过合理使用索引别名、插件和更新设置 API,可有效管理 Elasticsearch 集群,提高系统的灵活性和性能。在实际应用中,应根据具体业务需求和系统环境,灵活运用这些功能和技巧。
超级会员免费看

被折叠的 条评论
为什么被折叠?



