Elasticsearch索引監控之Indices Segments API與Indices Shard Stores

本文將繼續介紹elasticsearch索引監控之Indices segments與Indices Shard stores api。node

Indices Segments

提供Lucene索引(分片級別)使用的segments(段信息)。web

其對應的示例代碼以下:json

 1public static final void test_Indices_segments() {
2        TransportClient client = EsClient.getTransportClient();
3        try {
4            IndicesSegmentsRequest request = new IndicesSegmentsRequest();
5            request.indices("logs_write");
6            ActionFuture<IndicesSegmentResponse> responseFuture = client.admin().indices().segments(request);
7            IndicesSegmentResponse response = responseFuture.get();
8            System.out.println(response);
9        } catch (Throwable e) {
10            e.printStackTrace();
11        } finally {
12            EsClient.close(client);
13        }
14}

返回結果相似:api

 1{
2  "_shards": ...
3  "indices": {
4    "test": {
5      "shards": {
6        "0": [
7          {
8            "routing": {
9              "state""STARTED",
10              "primary"true,
11              "node""zDC_RorJQCao9xf9pg3Fvw"
12            },
13            "num_committed_segments"0,
14            "num_search_segments"1,
15            "segments": {
16              "_0": {
17                "generation"0,
18                "num_docs"1,
19                "deleted_docs"0,
20                "size_in_bytes"3800,
21                "memory_in_bytes"1410,
22                "committed"false,
23                "search"true,
24                "version""7.0.0",
25                "compound"true,
26                "attributes": {
27                }
28              }
29            }
30          }
31        ]
32      }
33    }
34  }
35}

返回結果字段說明以下:微信

  • _0
    段的名稱,表示第一個段。app

  • generation
    在須要編寫新段時基本上遞增的生成數。段名是從這個生成號派生出來的。運維

  • num_docs
    存儲在此段中的未刪除文檔的數量。elasticsearch

  • deleted_docs
    存儲在此段中的已刪除文檔的數量。若是這個數大於0,那麼當這個段合併時,空間就會被回收。post

  • size_in_bytes
    段使用的磁盤空間量,以字節爲單位。ui

  • memory_in_bytes
    段存儲在內存中的字節數,若是-1表示elasticsearch沒法計算。

  • committed
      段是否已在磁盤上同步(是否已經提交到磁盤)。

  • search
    是否可搜索,若是爲false,表示段已提交到磁盤,但尚未被refresh,故暫時不可用來搜索。

  • version
    底層使用的lucene版本。

  • compound
    段是否存儲在複合文件中。當爲true時,這意味着Lucene將該段中的全部文件合併爲一個文件,以便保存文件描述符。

  • attributes
    其餘屬性。

另外Indices Segments支持verbose默認,將輸出一些調試信息,其返回結果以下:

 1{
2        "_0": {
3
4            "ram_tree": [
5                {
6                    "description""postings [PerFieldPostings(format=1)]",
7                    "size_in_bytes"2696,
8                    "children": [
9                        {
10                            "description""format 'Lucene50_0' ...",
11                            "size_in_bytes"2608,
12                            "children" :[ ... ]
13                        },
14                    ]
15                },
16                ]
17        }
18}

Indices Shard Stores

主要展現索引分片副本的存儲信息。默認狀況下,列表只存儲至少有一個未分配副本的分片的信息。當集羣健康狀態爲黃色時,將列出至少有一個未分配副本的分片的存儲信息。當集羣健康狀態爲紅色時,這將列出具備未分配初選的碎片的存儲信息。

對應的JAVA示例以下:

 1public static final void test_Indices_Shard_Stores() {
2   TransportClient client = EsClient.getTransportClient();
3   try {
4      IndicesShardStoresRequest request = new IndicesShardStoresRequest();
5      request.indices("logs_write");
6      ActionFuture<IndicesShardStoresResponse> responseFuture = client.admin().indices().shardStores(request);
7      IndicesShardStoresResponse response = responseFuture.get();
8      ImmutableOpenMap<String, ImmutableOpenIntMap<List<IndicesShardStoresResponse.StoreStatus>>> data =  response.getStoreStatuses();
9      List indexList = new ArrayList();
10      for (Iterator it = data.keysIt(); it.hasNext(); ) {
11         String key = (String)it.next();
12         Map indexData = new HashMap();
13         indexList.add(indexData);
14         List indexShardList = new ArrayList();
15         indexData.put(key, indexShardList);
16         ImmutableOpenIntMap<List<IndicesShardStoresResponse.StoreStatus>> value = data.get(key);
17         for(Iterator it2 = value.keysIt(); it2.hasNext(); ) {
18            Integer key2 = (Integer)it2.next();
19            Map shardData = new HashMap();
20            indexShardList.add(shardData);
21            List shardStoreStatusList = new ArrayList();
22            shardData.put(key2 + "", shardStoreStatusList);
23            List<IndicesShardStoresResponse.StoreStatus> storeStatusList = value.get(key2);
24            for(IndicesShardStoresResponse.StoreStatus storeStatus : storeStatusList) {
25               Map storeStatusMap = new HashMap();
26               shardStoreStatusList.add(storeStatusMap);
27               storeStatusMap.put("allocationId", storeStatus.getAllocationId());
28               storeStatusMap.put("allocationStatus", storeStatus.getAllocationStatus().value());
29               Map discoveryNodeData = new HashMap();
30               storeStatusMap.put("discoveryNode", discoveryNodeData);
31               DiscoveryNode node = storeStatus.getNode();
32               discoveryNodeData.put("name", node.getName());
33               discoveryNodeData.put("name", node.getAddress());
34               discoveryNodeData.put("attributes", node.getAttributes());
35               discoveryNodeData.put("ephemeralId", node.getEphemeralId());
36               discoveryNodeData.put("hostAddress", node.getHostAddress());
37               discoveryNodeData.put("hostName", node.getHostName());
38               discoveryNodeData.put("id", node.getId());
39               discoveryNodeData.put("roles", node.getRoles());
40            }
41         }
42      }
43      System.out.println(FastJsonUtils.getBeanToJson(indexList));
44   } catch (Throwable e) {
45      e.printStackTrace();
46   } finally {
47      EsClient.close(client);
48   }
49}

返回的結果爲:

 1[
2    {
3        "logs-000002":[
4        {
5            0:[    // @1
6                    {
7                        "discoveryNode":{   // @2
8                            "hostName":"127.0.0.1",
9                            "roles":[
10                                "MASTER",
11                                "DATA",
12                                "INGEST"
13                            ],
14                            "name":{
15                                "address":"127.0.0.1",
16                                "fragment":true,
17                                "port":9300
18                            },
19                            "attributes":{
20                                "ml.machine_memory":"16964890624",
21                                "ml.max_open_jobs":"20",
22                                "xpack.installed":"true",
23                                "ml.enabled":"true"
24                            },
25                            "hostAddress":"127.0.0.1",
26                            "id":"ekEDWaVVRH-944BgEsfRLA",
27                            "ephemeralId":"ox0CP9hhQOu1klZgNv7Ezw"
28                        },
29                        "allocationId":"KRw3BYPFTrK39HOYXzwXBA",      // @3
30                        "allocationStatus":"primary"                                      // @4
31                    }
32                ]
33            }
34
35            //因爲當前試驗環境爲單機模式,故省略其餘分片信息
36
37        ]
38    }
39]

代碼@1:分片編號。
代碼@2:分片所在的節點的信息,包含名稱、角色、id、地址等信息。
代碼@3:副本的分配ID。
代碼@4:分配的狀態,其值爲primary、replica、unused。

索引監控相關API就介紹到這裏了。



更多文章請關注微信公衆號:


一波廣告來襲,做者新書《RocketMQ技術內幕》已出版上市:

《RocketMQ技術內幕》已出版上市,目前可在主流購物平臺(京東、天貓等)購買,本書從源碼角度深度分析了RocketMQ NameServer、消息發送、消息存儲、消息消費、消息過濾、主從同步HA、事務消息;在實戰篇重點介紹了RocketMQ運維管理界面與當前支持的39個運維命令;並在附錄部分羅列了RocketMQ幾乎全部的配置參數。本書獲得了RocketMQ創始人、阿里巴巴Messaging開源技術負責人、Linux OpenMessaging 主席的高度承認並做序推薦。目前是國內第一本成體系剖析RocketMQ的書籍。

本文分享自微信公衆號 - 中間件興趣圈(dingwpmz_zjj)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索