首页 > 技术文章 > Elasticsearch 猫cat API

ruhuanxingyun 2020-01-10 08:59 原文

1. cat Allocation:提供分配给每个数据节点的分片数量及磁盘空间的快照

  A. 请求:GET /_cat/allocation/<node_id>  |  GET  /_cat/allocation

     路径参数 node_id:节点ID或名称,多个以逗号分隔;

  B. 查询参数

    bytes:用于显示字节值的单位,字节大小单位

    format:指定响应类型,有text/json/smile/yaml/cbor等,有些格式可以通过http请求头Accept来指定,如:application/json;

    local:默认false,表示从主节点检索信息,设置为true,则仅从本地节点检索信息   

    h:要显示的列名称,多个以逗号分隔;

    v:如果为true,则响应列标题

  C. 结果信息

列名 说明
shards 节点分片数
disk.indices ES索引的磁盘使用量
disk.used 磁盘的总使用量(不只ES)
disk.avail 可用磁盘容量
disk.total 磁盘总量
disk.percent 磁盘使用百分比
host 节点host
ip 节点IP
node 节点名

  D. kibana操作

  E. java编写

    注意:该方式获取文件系统磁盘信息可能会出现问题,这是项目运行一段时间后发现的,见上面图右边第5行数据-unassigned shards,推荐使用集群统计中拿磁盘信息,参考:https://www.cnblogs.com/ruhuanxingyun/p/12193148.html

  /**
     * 获取磁盘容量信息
     *
     * @return map
     */
    private Map<String, Long> getDiskSpace() {
        Request request = new Request(HttpMethod.GET.toString(), "/_cat/allocation");
        request.addParameter("bytes", "b");
        request.addParameter("format", "json");
        Map<String, Long> map = new HashMap<>(4);

        try {
            Response response = restHighLevelClient.getLowLevelClient().performRequest(request);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String content = EntityUtils.toString(response.getEntity());
                JSONArray jsonArray = JSONUtil.parseArray(content);
                // 节点数
                int length = jsonArray.size();
                long totalSpace = 0, usableSpace = 0, freeSpace = 0;
                for (Object obj : jsonArray) {
                    Map<String, String> allocationMap = (Map) obj;
                    totalSpace += Long.valueOf(allocationMap.get("disk.total"));
                    usableSpace += Long.valueOf(allocationMap.get("disk.used"));
                    freeSpace += Long.valueOf(allocationMap.get("disk.avail"));
                }

                map.put("totalSpace", totalSpace / length);
                map.put("usableSpace", usableSpace / length);
                map.put("freeSpace", freeSpace / length);
                log.info(String.format("磁盘容量信息:%s", map.toString()));
            } else {
                log.info("获取磁盘容量信息失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.info("获取磁盘容量信息失败");
        }

        return map;
    }

  

可参考:ES猫官网地址

  

推荐阅读