全部產品
Search
文件中心

Elasticsearch:通過X-Pack Watcher實現CCR異常警示通知

更新時間:Jun 10, 2026

Elasticsearch X-Pack Watcher可跟蹤網路,具備對基礎設施、索引資料和叢集健康等指標的監控和警示能力。您可以在Kibana控制台上擷取跨叢集複製CCR(Cross Cluster Replication)功能相關的監控,並通過X-Pack Watcher監控CCR異常實現警示。本文介紹如何將CCR擷取的讀資料請求耗時及CCR Checkpoint作為預警條件,實現CCR異常警示通知。

功能介紹

X-Pack Watcher主要由以下四個組件組成:Trigger(定時觸發器,定義監控檢測的執行頻率)、Input(資料輸入,從叢集擷取監控資料)、Condition(觸發條件,判斷是否滿足警示閾值)和Actions(警示動作,定義滿足條件後的通知方式,例如Webhook)。

前提條件

  • 已建立Elasticsearch執行個體。 具體操作,請參見建立Elasticsearch執行個體

    說明
    • 舊網路架構下,X-Pack Watcher功能僅支援單可用性區域Elasticsearch執行個體,不支援多可用性區域執行個體。

    • 新網路架構下,需要配置執行個體私網串連打通網路限制。具體操作,請參見配置執行個體私網串連

    關於網路架構,請參見【通知】網路架構調整

  • 已開啟Elasticsearch執行個體的X-Pack Watcher功能。 具體操作,請參見配置YML參數

  • 已在使用者VPC下建立ECS執行個體。具體操作,請參見自訂購買執行個體

    說明

    Elasticsearch的X-Pack Watcher功能不支援直接與公網通訊,需要基於執行個體的私網地址(Virtual Private Cloud環境)通訊。因此,使用者VPC下的ECS執行個體需要持有公網IP或通過配置SNAT實現公網訪問。更多資訊,請參見綁定Elastic IP Address配置SNAT

操作步驟

步驟一:建立並配置DingTalk機器人

  1. 建立一個DingTalk警示接收群。

  2. 在群的右上方單擊設定.png表徵圖,在群設定面板中,單擊机器人

  3. 機器人管理 對話方塊中,單擊添加機器人,選擇自訂,單擊添加

  4. 輸入機器人名字,選中自訂關鍵詞並輸入關鍵詞。

    重要

    關鍵詞必須包含在您設定的警示資訊中。

  5. 選中《自訂機器人服務及免責條款》,單擊完成

  6. 單擊Webhook後的複製,複製機器人的Webhook地址。

    請保管好Webhook地址,以備後用。同時不要將其公布在外部網站上,泄露Webhook地址有安全風險。

步驟二:配置Nginx代理和ECS安全性群組

  1. 在ECS上配置Nginx代理。

    Nginx代理的作用是轉寄警示資訊。Elasticsearch的X-Pack Watcher服務把警示資訊發送到Nginx上,Nginx再把警示資訊轉寄到DingTalk或者企業微信中。

    1. 在ECS上安裝Nginx。

    2. 配置nginx.conf檔案。

      使用以下配置替換nginx.conf檔案中server部分的配置。

      server
        {
          listen 8080;#監聽連接埠
          server_name localhost;#網域名稱
          index index.html index.htm index.php;
          root /usr/local/webserver/nginx/html;#網站目錄
            location ~ .*\.(php|php5)?$
          {
            #fastcgi_pass unix:/tmp/php-cgi.sock;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
          }
          location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
          {
            expires 30d;
            # access_log off;
          }
          location / {
            proxy_pass <Webhook地址>;
          }
          location ~ .*\.(js|css)?$
          {
            expires 15d;
            # access_log off;
          }
          access_log off;
        }

      <Webhook地址>替換為接收警示訊息的DingTalk機器人的Webhook地址。

    3. 載入修改後的設定檔並重啟Nginx。

      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新載入設定檔
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重啟Nginx
  2. 配置ECS安全性群組。

    允許ECS上的Nginx代理接收來自Elasticsearch執行個體的警示資訊。

    1. 登入阿里雲ECS控制台

    2. 在左側導覽列,單擊執行個體與鏡像 > 執行個體

    3. 執行個體頁面,單擊目標執行個體名稱。

    4. 單擊安全性群組頁簽。

    5. 安全性群組列表頁簽,單擊目標安全性群組名稱。

    6. 入方向頁簽,單擊增加規則

    7. 填寫相關參數。

      參數

      說明

      授權策略

      選擇允许

      優先順序

      保持預設。

      協議

      選擇自訂TCP

      訪問來源

      添加您購買的Elasticsearch執行個體所有節點的IP地址。

      說明

      參見查看節點的基本資料,擷取Elasticsearch執行個體中所有節點的IP地址。

      訪問目的

      填寫您常用的連接埠(配置Nginx時需要用到,本文以8080為例)。

      描述

      輸入對規則的描述。

    8. 單擊確定

步驟三:配置Watcher警示

  1. 登入目標Elasticsearch執行個體的Kibana控制台,根據頁面提示進入Kibana首頁。

    登入Kibana控制台的具體操作,請參見登入Kibana控制台

    說明

    本文以Elasticsearch 6.7.0版本為例,其他版本操作可能略有差別,請以實際介面為準。

  2. 在左側導覽列,單擊Dev Tools

  3. Console中,執行如下命令建立一個警示文檔。

    PUT _watcher/watch/ccr_watcher
    {
      "trigger": {
        "schedule": {
          "interval": "10s"
        }
      },
      "input": {
        "search": {
          "request": {
            "indices": [
              ".monitoring-es*" 
            ],
            "body": {
              "size": 0,
              "sort": [
                {
                  "timestamp": {
                    "order": "desc"
                  }
                }
              ],
              "query": {
                "bool": {
                  "must": [
                    {
                      "range": {
                        "timestamp": {
                          "gte": "now-10m"
                        }
                      }
                    },
                    {
                      "term": {
                        "type": {
                          "value": "ccr_stats"
                        }
                      }
                    },
                    {
                      "bool": {
                        "should": [
                          {
                            "range": {
                              "ccr_stats.time_since_last_read_millis": {
                                "gte": 600000
                              }
                            }
                          },
                          {
                            "script": {
                              "script": "long gap = doc['ccr_stats.leader_global_checkpoint'].value - doc['ccr_stats.follower_global_checkpoint'].value;\n            return gap>1000;"
    
    
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              "aggs": {
                "NAME": {
                  "terms": {
                    "field": "ccr_stats.follower_index",
                    "size": 1000
                  }
                }
              }
            }
          }
        }
      },
      "condition": {
        "compare": {
          "ctx.payload.hits.total": {
            "gt": 0
          }
        }
      },
      "transform": {
        "script": """
        StringBuilder message = new StringBuilder();
    for (def bucket : ctx.payload.aggregations.NAME.buckets) {
      message.append(bucket.key).append('  ')
    }
        return [ 'delay_indices' : message.toString().trim()  ]
    """
      },
      "actions" : {
         "add_index": {
          "index": {
            "index": "ccr_delay_indices",
            "doc_type": "doc"
          }
        },
         "my_webhook": {
         "webhook" : {
            "method" : "POST",
            "url" : "http://<yourAddress>:8080",
            "body" : "{\"msgtype\": \"text\", \"text\": { \"content\": \"Please note: {{ctx.payload}}\"}}"
          }
        }
      }
    
    }

    部分關鍵參數說明如下。

    參數

    說明

    trigger

    檢測周期,請根據實際業務進行配置。以上樣本設定為每10s檢測一次。

    input.search.request.indices

    查詢檢測的目標索引。.monitoring-es*索引儲存叢集支援的所有監控指標,其中也包括CCR指標。

    input.search.request.body

    查詢體。以上樣本從系統監控索引查詢近10分鐘的CCR狀態資訊,當查詢滿足以下條件中的其中一個,CCR將進入下一步:

    • ccr_stats.time_since_last_read_millis>600000ms(10min):讀請求發送到Leader節點的延時時間大於10min。請根據您CCR的實際業務使用進行配置。

    • ccr_stats.leader_global_checkpoint-ccr_stats.follower_global_checkpoint>1000:Follower Checkpoint落後於Leader Checkpoint的程度大於1000。請根據您CCR的實際業務使用進行配置。

    condition

    警示條件。以上樣本表示滿足input.search.request.body中的條件,且返回的彙總文檔數大於0即可警示。

    transform

    預先處理。以上樣本表示迴圈擷取buckets key值,並通過空格進行分割,過濾出延遲索引名。

    actions

    滿足條件時,執行的具體操作。以上樣本設定兩個action:

    • add_index:將上面返回的結果寫入索引中,在調試Watcher配置環節,定義index進行調試。

    • my_webhook:通過Webhook方式發送警示資訊。

    <yourAddress>

    接收警示資訊的伺服器的訪問地址:

    • 新網路架構下,配置為終端節點網域名稱地址,請求通過終端節點網域名稱進行轉寄。擷取終端節點網域名稱,請參見配置Elasticsearch私網互連

    • 舊網路架構下,配置為以下任一地址:

      • Nginx代理IP地址:請求通過同VPC下Nginx代理經公網進行轉寄。

      • DingTalk機器人的Webhook地址。

    body

    根據DingTalk機器人的安全設定配置。

    例如,步驟一:建立並配置DingTalk機器人中選擇安全設定方式為自訂關鍵詞,且添加了一個自訂關鍵詞:note,那麼body中的content欄位必須包含note,DingTalk機器人才會推送警示資訊。

    說明

    如果在執行以上命令時,出現No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]異常,表示您購買的Elasticsearch執行個體未開啟X-Pack Watcher功能,請開啟後再執行以上命令。具體步驟,請參見配置YML參數

步驟四:查看警示結果

正常情況下,當CCR狀態達到步驟三:配置Watcher警示中配置的警示條件時,您可以DingTalk群中收到如下警示資訊。查看警示結果

說明

如果您不再需要執行警示任務,可執行以下命令刪除該警示任務。

DELETE _xpack/watcher/watch/ccr_watcher