集群管理 API
# 集群管理 API
# 前言
Cerebro 为我们提供了简单的集群管理功能,这些监控、管理的功能本质上也都是通过 ES 提供的 API 来实现的。
# cat APIs
_cat
APIs 提供查看集群相关信息的同时,其特别之处在于它返回的结果不是 JSON,而是非常适合人类阅读的格式。
当使用 _cat
时其后面不跟任何子节点,返回结果是各个 API 的目录(URL),在忘记有啥接口的时候这个功能非常好用:
# 使用 _cat API 获取所有可用的目录
GET /_cat/
# 结果
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
......
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上述这些 API 都可以加入下面几个参数:
- v 参数:每个命令都可以使用 v 参数来打印详细信息。如:
GET /_cat/nodes?v
。 - h 参数:使用 h 参数可以强制只显示某些列。如:
GET /_cat/nodes?h=node.role,port,name
。 - help 参数:使用 help 参数可以输出这个接口可用的列名和其解析。如:
GET /_cat/master?help
。
# 查看索引文档总数和整个集群文档总数
# 获取索引 books 的文档总数
GET /_cat/count/books?v
# 获取整个集群所有索引的文档总数
GET /_cat/count?v
2
3
4
5
# 查看集群健康状态
# 查看集群健康状态
GET /_cat/health?v
GET /_cat/health?v&ts=false
2
3
ts=false
的参数是返回结果中去除时间戳。
# 查看磁盘使用情况
# 获取各个节点磁盘的使用情况
GET /_cat/allocation?v
2
更多的关于 _cat
APIs 的使用示例,可以参考官方文档 (opens new window)。
# 集群管理 API
集群管理的 API 提供了获取或者更改集群信息的功能,例如集群节点过滤、查看集群信息、查看节点信息、更新集群设置、重置路由等。
# 集群节点过滤
# 获取所有节点
GET /_nodes/_all
2
除了 _all
外,ES 支持的节点过滤器有如下几个:
_all
:列出所有节点。_local
:列出本地节点。_master
:列出主节点- IP 或者主机名字:列出指定 IP 或者主机名字的节点。
- 节点 ID 或者名称:列出指定 ID 或者名称的节点。
*
:IP、主机名字、节点 ID、名称都可以包括通配符。master:true/false
:列出主节点 / 不列出主节点。data:true/false
:列出数据节点 / 不列出数据节点。ingest:true/false
:列出索引预处理节点 / 不列出索引预处理节点。coordinating_only:true/false
:列出协调节点 / 不列出协调节点。
比如:
# 节点类型过滤:过滤出 master、data、ingest、coordinating 节点的信息
GET /_nodes/master:true,data:true,ingest:true,coordinating:true
2
如果只想返回某个节选部分的结果,可以使用以下示例:
# 列出 process 节选信息
GET /_nodes/master:true,data:true,ingest:true,coordinating:true/process
2
更多的使用示例你可以参考官方文档 (opens new window)。
# 查看集群信息
可以使用集群信息查看的接口查看集群健康状态、集群状态、集群统计信息、集群的设置等,示例如下:
# 查看集群健康状态
GET /_cluster/health
# 查看集群状态
GET /_cluster/state
# 查看集群统计信息
GET /_cluster/stats?human&pretty
# 查看集群的设置
GET /_cluster/settings?include_defaults=true
2
3
4
5
6
7
8
9
10
11
# 查看节点信息
查看节点信息的 API 比较简单,示例如下:
# 获取节点信息的请求格式
GET /_nodes
GET /_nodes/<node_id>
GET /_nodes/<metric>
GET /_nodes/<node_id>/<metric>
# 获取节点信息的示例
GET /_nodes
GET /_nodes/node_id1,node_id2 # 获取 node_id1 和 node_id2 的信息
GET /_nodes/stats
GET /_nodes/node_id1,node_id2/stats # 获取 node_id1 和 node_id2 的统计信息
2
3
4
5
6
7
8
9
10
11
其中 metric 可以指定获取结果中的每个部分,其选项比较多,参考官方文档 (opens new window)。
# 更新集群设置
更新集群设置的示例如下:
PUT /_cluster/settings
{
"persistent": {
"indices.recovery.max_bytes_per_sec": "100m"
}
}
2
3
4
5
6
如上示例,我们设置了集群恢复时的吞吐量,其默认值为 0 的时候为无限制。
# 重置路由
reroute API 可以允许用户手动修改集群中分片的分配情况。使用 reroute API 可以将一个分片从某个节点移到另一个节点,也可以将未分配的分片指定分配到某个节点。
官方的示例:
POST /_cluster/reroute
{
"commands": [
{
"move": {
"index": "test", "shard": 0,
"from_node": "node1", "to_node": "node2"
}
},
{
"allocate_replica": {
"index": "test", "shard": 1,
"node": "node3"
}
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
如上示例,使用 "move"
指令,将索引 "test"
的分片 0 从节点 "node1"
移动到了 "node2"
。使用 "allocate_replica"
指令将 "test"
索引未分配的分片 1 的副本分配到节点 "node3"
。
需要注意的是,在执行了任何路由重置指令后, ES 将会执行重新平衡数据的操作来保持平衡状态,但是这个操作受 cluster.routing.rebalance.enable (opens new window)(是否允许重新平衡)设置值的影响。
reroute API 在 ES 集群运维的时候经常用到,更详细的使用示例可以参考官方文档 (opens new window)。
# 参考资料
(完)